public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-pmuldoon-python-backtrace: Undo accidental file deletion
@ 2012-06-13 19:17 pmuldoon
  0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-06-13 19:17 UTC (permalink / raw)
  To: archer-commits

The branch, archer-pmuldoon-python-backtrace has been updated
       via  14212616ff6b4ac50b9396946dd76bc7ae5acf7c (commit)
      from  21b52446556e641bdafebf333a95fabd015ba84f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 14212616ff6b4ac50b9396946dd76bc7ae5acf7c
Author: Phil Muldoon <pmuldoon@redhat.com>
Date:   Wed Jun 13 20:17:05 2012 +0100

    Undo accidental file deletion
    
    Revert "Add Frame filter management and base class"
    
    This reverts commit 116249e4bb128d63c6ddfb57b3588e78d454f015.

-----------------------------------------------------------------------

Summary of changes:
 gdb/python/lib/gdb/FrameWrapper.py            |   81 ++
 gdb/python/lib/gdb/__init__.py                |   41 +
 gdb/python/lib/gdb/command/__init__.py        |   16 +
 gdb/python/lib/gdb/command/explore.py         |  755 +++++++++++
 gdb/python/lib/gdb/command/pretty_printers.py |  372 ++++++
 gdb/python/lib/gdb/command/prompt.py          |   66 +
 gdb/python/lib/gdb/command/upto.py            |  128 ++
 gdb/python/lib/gdb/printing.py                |  258 ++++
 gdb/python/lib/gdb/prompt.py                  |  149 +++
 gdb/python/lib/gdb/types.py                   |  111 ++
 gdb/python/py-auto-load.c                     |  298 +++++
 gdb/python/py-block.c                         |  548 ++++++++
 gdb/python/py-bpevent.c                       |   56 +
 gdb/python/py-breakpoint.c                    | 1022 ++++++++++++++
 gdb/python/py-cmd.c                           |  699 ++++++++++
 gdb/python/py-continueevent.c                 |   53 +
 gdb/python/py-event.c                         |  182 +++
 gdb/python/py-event.h                         |  122 ++
 gdb/python/py-events.h                        |   60 +
 gdb/python/py-evtregistry.c                   |  172 +++
 gdb/python/py-evts.c                          |   74 +
 gdb/python/py-exitedevent.c                   |   79 ++
 gdb/python/py-finishbreakpoint.c              |  467 +++++++
 gdb/python/py-frame.c                         | 1082 +++++++++++++++
 gdb/python/py-framefilter.c                   |  825 ++++++++++++
 gdb/python/py-function.c                      |  249 ++++
 gdb/python/py-inferior.c                      |  870 ++++++++++++
 gdb/python/py-infthread.c                     |  342 +++++
 gdb/python/py-lazy-string.c                   |  250 ++++
 gdb/python/py-newobjfileevent.c               |   70 +
 gdb/python/py-objfile.c                       |  318 +++++
 gdb/python/py-param.c                         |  814 +++++++++++
 gdb/python/py-prettyprint.c                   |  836 ++++++++++++
 gdb/python/py-progspace.c                     |  306 +++++
 gdb/python/py-signalevent.c                   |   53 +
 gdb/python/py-stopevent.c                     |  117 ++
 gdb/python/py-stopevent.h                     |   36 +
 gdb/python/py-symbol.c                        |  595 +++++++++
 gdb/python/py-symtab.c                        |  603 +++++++++
 gdb/python/py-threadevent.c                   |   78 ++
 gdb/python/py-type.c                          | 1777 +++++++++++++++++++++++++
 gdb/python/py-utils.c                         |  395 ++++++
 gdb/python/py-value.c                         | 1521 +++++++++++++++++++++
 gdb/python/python-config.py                   |   77 ++
 gdb/python/python-internal.h                  |  349 +++++
 gdb/python/python.c                           | 1513 +++++++++++++++++++++
 gdb/python/python.h                           |   57 +
 47 files changed, 18942 insertions(+), 0 deletions(-)
 create mode 100644 gdb/python/lib/gdb/FrameWrapper.py
 create mode 100644 gdb/python/lib/gdb/__init__.py
 create mode 100644 gdb/python/lib/gdb/command/__init__.py
 create mode 100644 gdb/python/lib/gdb/command/explore.py
 create mode 100644 gdb/python/lib/gdb/command/pretty_printers.py
 create mode 100644 gdb/python/lib/gdb/command/prompt.py
 create mode 100644 gdb/python/lib/gdb/command/upto.py
 create mode 100644 gdb/python/lib/gdb/printing.py
 create mode 100644 gdb/python/lib/gdb/prompt.py
 create mode 100644 gdb/python/lib/gdb/types.py
 create mode 100644 gdb/python/py-auto-load.c
 create mode 100644 gdb/python/py-block.c
 create mode 100644 gdb/python/py-bpevent.c
 create mode 100644 gdb/python/py-breakpoint.c
 create mode 100644 gdb/python/py-cmd.c
 create mode 100644 gdb/python/py-continueevent.c
 create mode 100644 gdb/python/py-event.c
 create mode 100644 gdb/python/py-event.h
 create mode 100644 gdb/python/py-events.h
 create mode 100644 gdb/python/py-evtregistry.c
 create mode 100644 gdb/python/py-evts.c
 create mode 100644 gdb/python/py-exitedevent.c
 create mode 100644 gdb/python/py-finishbreakpoint.c
 create mode 100644 gdb/python/py-frame.c
 create mode 100644 gdb/python/py-framefilter.c
 create mode 100644 gdb/python/py-function.c
 create mode 100644 gdb/python/py-inferior.c
 create mode 100644 gdb/python/py-infthread.c
 create mode 100644 gdb/python/py-lazy-string.c
 create mode 100644 gdb/python/py-newobjfileevent.c
 create mode 100644 gdb/python/py-objfile.c
 create mode 100644 gdb/python/py-param.c
 create mode 100644 gdb/python/py-prettyprint.c
 create mode 100644 gdb/python/py-progspace.c
 create mode 100644 gdb/python/py-signalevent.c
 create mode 100644 gdb/python/py-stopevent.c
 create mode 100644 gdb/python/py-stopevent.h
 create mode 100644 gdb/python/py-symbol.c
 create mode 100644 gdb/python/py-symtab.c
 create mode 100644 gdb/python/py-threadevent.c
 create mode 100644 gdb/python/py-type.c
 create mode 100644 gdb/python/py-utils.c
 create mode 100644 gdb/python/py-value.c
 create mode 100644 gdb/python/python-config.py
 create mode 100644 gdb/python/python-internal.h
 create mode 100644 gdb/python/python.c
 create mode 100644 gdb/python/python.h

First 500 lines of diff:
diff --git a/gdb/python/lib/gdb/FrameWrapper.py b/gdb/python/lib/gdb/FrameWrapper.py
new file mode 100644
index 0000000..11f69ed
--- /dev/null
+++ b/gdb/python/lib/gdb/FrameWrapper.py
@@ -0,0 +1,81 @@
+# Copyright (C) 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import gdb
+
+class FrameWrapper:
+    "Base Frame Wrapper"
+
+    def __init__ (self, frame):
+        self.frame = frame
+
+    def __new__ (self):
+        return self
+
+    def omit (self):
+        return False
+
+    def elide (self):
+        return False
+
+    def function (self):
+        fname = str (self.frame.function())
+        if (fname == ""):
+            return "<unknown function>"
+        else:
+            return fname
+
+    def level (self, level):
+        return level
+
+    def address (self):
+        return self.frame.pc()
+
+    def filename (self):
+        sal = self.frame.find_sal()
+        if (sal):
+            return sal.symtab.filename
+        else:
+            return "<unknown filename>"
+
+    def frame_args (self):
+        args = self.frame.arguments()
+        args_list = []
+        if args != None:
+            for arg in args:
+                value = arg.value(self.frame)
+                args_list.append((arg, value))
+
+        return args_list
+
+    def frame_locals (self):
+        frame_locals = self.frame.locals()
+        frame_locals_list = []
+        if frame_locals != None:
+            for frame_local in frame_locals:
+                value = frame_local.value(self.frame)
+                frame_locals_list.append((frame_local, value))
+
+        return frame_locals_list
+
+    def line (self):
+        sal = self.frame.find_sal()
+        if (sal):
+            return sal.line        
+        else:
+            return "<unknown line>"
+
+    def inferior_frame (self):
+        return self.frame
diff --git a/gdb/python/lib/gdb/__init__.py b/gdb/python/lib/gdb/__init__.py
new file mode 100644
index 0000000..a82e495
--- /dev/null
+++ b/gdb/python/lib/gdb/__init__.py
@@ -0,0 +1,41 @@
+# Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import traceback
+
+# Auto-load all functions/commands.
+
+# Modules to auto-load, and the paths where those modules exist.
+
+module_dict = {
+  'gdb.function': os.path.join(gdb.PYTHONDIR, 'gdb', 'function'),
+  'gdb.command': os.path.join(gdb.PYTHONDIR, 'gdb', 'command')
+}
+
+# Iterate the dictionary, collating the Python files in each module
+# path.  Construct the module name, and import.
+
+for module, location in module_dict.iteritems():
+  if os.path.exists(location):
+     py_files = filter(lambda x: x.endswith('.py') and x != '__init__.py',
+                       os.listdir(location))
+
+     for py_file in py_files:
+       # Construct from foo.py, gdb.module.foo
+       py_file = module + '.' + py_file[:-3]
+       try:
+         exec('import ' + py_file)
+       except:
+         print >> sys.stderr, traceback.format_exc()
diff --git a/gdb/python/lib/gdb/command/__init__.py b/gdb/python/lib/gdb/command/__init__.py
new file mode 100644
index 0000000..0eb19f2
--- /dev/null
+++ b/gdb/python/lib/gdb/command/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
diff --git a/gdb/python/lib/gdb/command/explore.py b/gdb/python/lib/gdb/command/explore.py
new file mode 100644
index 0000000..aad3671
--- /dev/null
+++ b/gdb/python/lib/gdb/command/explore.py
@@ -0,0 +1,755 @@
+# GDB 'explore' command.
+# Copyright (C) 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Implementation of the GDB 'explore' command using the GDB Python API."""
+
+import gdb
+
+class Explorer(object):
+    """Internal class which invokes other explorers."""
+
+    # This map is filled by the Explorer.init_env() function
+    type_code_to_explorer_map = { }
+
+    _SCALAR_TYPE_LIST = (
+        gdb.TYPE_CODE_CHAR,
+        gdb.TYPE_CODE_INT,
+        gdb.TYPE_CODE_BOOL,
+        gdb.TYPE_CODE_FLT,
+        gdb.TYPE_CODE_VOID,
+        gdb.TYPE_CODE_ENUM,
+    )
+
+    @staticmethod
+    def guard_expr(expr):
+        length = len(expr)
+        guard = False
+
+        if expr[0] == '(' and expr[length-1] == ')':
+            pass
+        else:
+            i = 0
+            while i < length:
+                c = expr[i]
+                if (c == '_' or ('a' <= c and c <= 'z') or
+                    ('A' <= c and c <= 'Z') or ('0' <= c and c <= '9')):
+                    pass
+                else:
+                    guard = True
+                    break
+                i += 1
+
+        if guard:
+            return "(" + expr + ")"
+        else:
+            return expr
+
+    @staticmethod
+    def explore_expr(expr, value, is_child):
+        """Main function to explore an expression value.
+
+        Arguments:
+            expr: The expression string that is being explored.
+            value: The gdb.Value value of the expression.
+            is_child: Boolean value to indicate if the expression is a child.
+                      An expression is a child if it is derived from the main
+                      expression entered by the user.  For example, if the user
+                      entered an expression which evaluates to a struct, then
+                      when exploring the fields of the struct, is_child is set
+                      to True internally.
+
+        Returns:
+            No return value.
+        """
+        type_code = value.type.code
+        if type_code in Explorer.type_code_to_explorer_map:
+            explorer_class = Explorer.type_code_to_explorer_map[type_code]
+            while explorer_class.explore_expr(expr, value, is_child):
+                pass
+        else:
+            print ("Explorer for type '%s' not yet available.\n" %
+                   str(value.type))
+
+    @staticmethod
+    def explore_type(name, datatype, is_child):
+        """Main function to explore a data type.
+
+        Arguments:
+            name: The string representing the path to the data type being
+                  explored.
+            datatype: The gdb.Type value of the data type being explored.
+            is_child: Boolean value to indicate if the name is a child.
+                      A name is a child if it is derived from the main name
+                      entered by the user.  For example, if the user entered
+                      the name of struct type, then when exploring the fields
+                      of the struct, is_child is set to True internally.
+
+        Returns:
+            No return value.
+        """
+        type_code = datatype.code
+        if type_code in Explorer.type_code_to_explorer_map:
+            explorer_class = Explorer.type_code_to_explorer_map[type_code]
+            while explorer_class.explore_type(name, datatype, is_child):
+                pass
+        else:
+            print ("Explorer for type '%s' not yet available.\n" %
+                   str(datatype))
+
+    @staticmethod
+    def init_env():
+        """Initializes the Explorer environment.
+        This function should be invoked before starting any exploration.  If
+        invoked before an exploration, it need not be invoked for subsequent
+        explorations.
+        """
+        Explorer.type_code_to_explorer_map = {
+            gdb.TYPE_CODE_CHAR : ScalarExplorer,
+            gdb.TYPE_CODE_INT : ScalarExplorer,
+            gdb.TYPE_CODE_BOOL : ScalarExplorer,
+            gdb.TYPE_CODE_FLT : ScalarExplorer,
+            gdb.TYPE_CODE_VOID : ScalarExplorer,
+            gdb.TYPE_CODE_ENUM : ScalarExplorer,
+            gdb.TYPE_CODE_STRUCT : CompoundExplorer,
+            gdb.TYPE_CODE_UNION : CompoundExplorer,
+            gdb.TYPE_CODE_PTR : PointerExplorer,
+            gdb.TYPE_CODE_REF : ReferenceExplorer,
+            gdb.TYPE_CODE_TYPEDEF : TypedefExplorer,
+            gdb.TYPE_CODE_ARRAY : ArrayExplorer
+        }
+
+    @staticmethod
+    def is_scalar_type(type):
+        """Checks whether a type is a scalar type.
+        A type is a scalar type of its type is
+            gdb.TYPE_CODE_CHAR or
+            gdb.TYPE_CODE_INT or
+            gdb.TYPE_CODE_BOOL or
+            gdb.TYPE_CODE_FLT or
+            gdb.TYPE_CODE_VOID or
+            gdb.TYPE_CODE_ENUM.
+
+        Arguments:
+            type: The type to be checked.
+
+        Returns:
+            'True' if 'type' is a scalar type. 'False' otherwise.
+        """
+        return type.code in Explorer._SCALAR_TYPE_LIST
+
+    @staticmethod
+    def return_to_parent_value():
+        """A utility function which prints that the current exploration session
+        is returning to the parent value. Useful when exploring values.
+        """
+        print "\nReturning to parent value...\n"
+        
+    @staticmethod
+    def return_to_parent_value_prompt():
+        """A utility function which prompts the user to press the 'enter' key
+        so that the exploration session can shift back to the parent value.
+        Useful when exploring values.
+        """
+        raw_input("\nPress enter to return to parent value: ")
+        
+    @staticmethod
+    def return_to_enclosing_type():
+        """A utility function which prints that the current exploration session
+        is returning to the enclosing type.  Useful when exploring types.
+        """
+        print "\nReturning to enclosing type...\n"
+        
+    @staticmethod
+    def return_to_enclosing_type_prompt():
+        """A utility function which prompts the user to press the 'enter' key
+        so that the exploration session can shift back to the enclosing type.
+        Useful when exploring types.
+        """
+        raw_input("\nPress enter to return to enclosing type: ")
+
+
+class ScalarExplorer(object):
+    """Internal class used to explore scalar values."""
+
+    @staticmethod
+    def explore_expr(expr, value, is_child):
+        """Function to explore scalar values.
+        See Explorer.explore_expr and Explorer.is_scalar_type for more
+        information.
+        """
+        print ("'%s' is a scalar value of type '%s'." %
+               (expr, value.type))
+        print "%s = %s" % (expr, str(value))
+
+        if is_child:
+            Explorer.return_to_parent_value_prompt()
+            Explorer.return_to_parent_value()
+
+        return False
+
+    @staticmethod
+    def explore_type(name, datatype, is_child):
+        """Function to explore scalar types.
+        See Explorer.explore_type and Explorer.is_scalar_type for more
+        information.
+        """
+        if datatype.code == gdb.TYPE_CODE_ENUM:
+            if is_child:
+                print ("%s is of an enumerated type '%s'." %
+                       (name, str(datatype)))
+            else:
+                print "'%s' is an enumerated type." % name
+        else:
+            if is_child:
+                print ("%s is of a scalar type '%s'." %
+                       (name, str(datatype)))
+            else:
+                print "'%s' is a scalar type." % name
+
+        if is_child:
+            Explorer.return_to_enclosing_type_prompt()
+            Explorer.return_to_enclosing_type()
+
+        return False
+
+
+class PointerExplorer(object):
+    """Internal class used to explore pointer values."""
+
+    @staticmethod
+    def explore_expr(expr, value, is_child):
+        """Function to explore pointer values.
+        See Explorer.explore_expr for more information.
+        """
+        print ("'%s' is a pointer to a value of type '%s'" %
+               (expr, str(value.type.target())))
+        option  = raw_input("Continue exploring it as a pointer to a single "
+                            "value [y/n]: ")
+        if option == "y":
+            deref_value = None
+            try:
+                deref_value = value.dereference()
+                str(deref_value)
+            except gdb.MemoryError:
+                print ("'%s' a pointer pointing to an invalid memory "
+                       "location." % expr)
+                if is_child:
+                    Explorer.return_to_parent_value_prompt()
+                return False
+            Explorer.explore_expr("*%s" % Explorer.guard_expr(expr),
+                                  deref_value, is_child)
+            return False
+        
+        option  = raw_input("Continue exploring it as a pointer to an "
+                            "array [y/n]: ")
+        if option == "y":
+            while True:
+                index = 0
+                try:
+                    index = int(raw_input("Enter the index of the element you "
+                                          "want to explore in '%s': " % expr))
+                except ValueError:
+                    break
+                element_expr = "%s[%d]" % (Explorer.guard_expr(expr), index)
+                element = value[index]
+                try:
+                    str(element)
+                except gdb.MemoryError:
+                    print "Cannot read value at index %d." % index
+                    continue
+                Explorer.explore_expr(element_expr, element, True)
+            return False
+
+        if is_child:
+            Explorer.return_to_parent_value()
+        return False
+
+    @staticmethod
+    def explore_type(name, datatype, is_child):
+        """Function to explore pointer types.
+        See Explorer.explore_type for more information.
+        """
+        target_type = datatype.target()
+        print ("\n%s is a pointer to a value of type '%s'." %
+               (name, str(target_type)))
+
+        Explorer.explore_type("the pointee type of %s" % name,
+                              target_type,
+                              is_child)
+        return False
+
+
+class ReferenceExplorer(object):
+    """Internal class used to explore reference (TYPE_CODE_REF) values."""
+
+    @staticmethod
+    def explore_expr(expr, value, is_child):
+        """Function to explore array values.
+        See Explorer.explore_expr for more information.
+        """
+        referenced_value = value.referenced_value()
+        Explorer.explore_expr(expr, referenced_value, is_child)
+        return False
+
+    @staticmethod
+    def explore_type(name, datatype, is_child):
+        """Function to explore pointer types.
+        See Explorer.explore_type for more information.
+        """
+        target_type = datatype.target()
+        Explorer.explore_type(name, target_type, is_child)
+        return False
+
+
+class ArrayExplorer(object):
+    """Internal class used to explore arrays."""
+
+    @staticmethod
+    def explore_expr(expr, value, is_child):
+        """Function to explore array values.
+        See Explorer.explore_expr for more information.
+        """
+        target_type = value.type.target()
+        print ("'%s' is an array of '%s'." % (expr, str(target_type)))
+        index = 0
+        try:
+            index = int(raw_input("Enter the index of the element you want to "
+                                  "explore in '%s': " % expr))
+        except ValueError:
+            if is_child:
+                Explorer.return_to_parent_value()
+            return False
+
+        element = None
+        try:
+            element = value[index]


hooks/post-receive
--
Repository for Project Archer.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-06-13 19:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-13 19:17 [SCM] archer-pmuldoon-python-backtrace: Undo accidental file deletion pmuldoon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).