public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-pmuldoon-python-backtrace: Do not use a tuple for args/var, specifiy and object and an interface instead.
@ 2012-07-23 19:38 pmuldoon
  0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-07-23 19:38 UTC (permalink / raw)
  To: archer-commits

The branch, archer-pmuldoon-python-backtrace has been updated
       via  1380c3b69cef932b6a1bd65987a7578c47e07eb9 (commit)
      from  aea8f4bb1a33cfcddd55a6c8446e3d39e42b46ac (commit)

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

- Log -----------------------------------------------------------------
commit 1380c3b69cef932b6a1bd65987a7578c47e07eb9
Author: Phil Muldoon <pmuldoon@redhat.com>
Date:   Mon Jul 23 20:38:23 2012 +0100

    Do not use a tuple for args/var, specifiy and object and an interface instead.

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

Summary of changes:
 gdb/python/lib/gdb/BaseFrameWrapper.py |   29 +++++--
 gdb/python/py-framefilter.c            |  137 ++++++++++++++++----------------
 2 files changed, 89 insertions(+), 77 deletions(-)

First 500 lines of diff:
diff --git a/gdb/python/lib/gdb/BaseFrameWrapper.py b/gdb/python/lib/gdb/BaseFrameWrapper.py
index 242592a..c41e1f0 100644
--- a/gdb/python/lib/gdb/BaseFrameWrapper.py
+++ b/gdb/python/lib/gdb/BaseFrameWrapper.py
@@ -89,39 +89,52 @@ class BaseFrameWrapper (FrameWrapper):
 
         return self.base
 
+class BaseSymValueWrapper ():
+
+    def __init__(self, symbol, value):
+        self.sym = symbol
+        self.val = value
+
+    def value (self):
+        return self.val
+
+    def symbol (self):
+        return self.sym
+
 class FrameVars ():
 
     def __init__(self,frame):
         self.frame = frame
 
     def fetch_frame_locals (self):
-        frame_vars = []
+        lvars = []
         block = self.frame.block()
 
         for sym in block:
             if sym.is_argument:
                 continue;
-            frame_vars.append((sym, self.get_value (sym, block)))
 
-        if len(frame_vars) == 0:
+            lvars.append(BaseSymValueWrapper(sym, self.get_value(sym,block)))
+
+        if len(lvars) == 0:
             return None
 
-        return iter (frame_vars)
+        return iter (lvars)
 
     def fetch_frame_args (self):
-        frame_args = []
+        args = []
         block = self.frame.block()
 
         for sym in block:
             if not sym.is_argument:
                 continue;
 
-            frame_args.append((sym, self.get_value (sym,block)))
+            args.append(BaseSymValueWrapper(sym,self.get_value (sym,block)))
 
-        if len(frame_args) == 0:
+        if len(args) == 0:
             return None
 
-        return iter (frame_args)
+        return iter (args)
 
     def get_value (self, sym, block):
         if len (sym.linkage_name):
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index 330aee7..f6143bf 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -34,63 +34,82 @@
 #include "python-internal.h"
 
 static int
-extract_value (PyObject *tuple, char **name,
-	       struct value **value,
-	       const struct language_defn **language)
+extract_sym_and_value (PyObject *obj, char **name,
+		       struct value **value,
+		       const struct language_defn **language)
 {
-  PyObject *sym, *pvalue;
-
-  /* Each element in the locals arguments list should be a
-     tuple containing two elements.  The local name,
-     which can be a string or a gdb.Symbol, and the
-     value.  */
-
-  /* Name.  */
-  sym = PyTuple_GetItem (tuple, 0);
-  if (! sym)
-    return 0;
-
-  /* Value.  */
-  pvalue = PyTuple_GetItem (tuple, 1);
-  if (! pvalue)
-    return 0;
-
-  /* For arg name, the user can return a symbol or a
-     string.  */
-  if (PyString_Check (sym))
+  if (PyObject_HasAttrString (obj, "symbol"))
     {
-      *name = python_string_to_host_string (sym);
-      if (! name)
+      PyObject *result = PyObject_CallMethod (obj, "symbol", NULL);
+      if (! result)
 	return 0;
-      *language = current_language;
+
+      /* For 'symbol' callback, the function can return a symbol or a
+	 string.  */
+      if (PyString_Check (result))
+	{
+	  *name = python_string_to_host_string (result);
+	  Py_DECREF (result);
+
+	  if (! name)
+	      return 0;
+	  *language = current_language;
+	}
+      else
+	{
+	  struct symbol *symbol = symbol_object_to_symbol (result);
+
+	  Py_DECREF (result);
+	  if (! symbol)
+	    {
+	      PyErr_SetString (PyExc_RuntimeError,
+			       _("Unexpected value.  Expecting a " \
+				 "gdb.Symbol or a Python string."));
+	      return 0;
+	    }
+
+	  *name = xstrdup (SYMBOL_PRINT_NAME (symbol));
+
+	  if (language_mode == language_mode_auto)
+	    *language = language_def (SYMBOL_LANGUAGE (symbol));
+	  else
+	    *language = current_language;
+	}
     }
   else
     {
-      struct symbol *symbol = symbol_object_to_symbol (sym);
-      if (! symbol)
+      PyErr_SetString (PyExc_RuntimeError,
+		       _("Mandatory function 'symbol' not " \
+			 "implemented."));
+      return 0;
+    }
+
+  if (PyObject_HasAttrString (obj, "value"))
+    {
+      PyObject *result = PyObject_CallMethod (obj, "value", NULL);
+
+      if (! result)
 	{
-	  PyErr_SetString (PyExc_RuntimeError,
-			   _("Unexpected value in tuple.  " \
-			     "Expecting being a gdb.Symbol or a " \
-			     "Python string."));
+	  xfree (*name);
 	  return 0;
 	}
 
-      *name = xstrdup (SYMBOL_PRINT_NAME (symbol));
+      *value = convert_value_from_python (result);
 
-      if (language_mode == language_mode_auto)
-	*language = language_def (SYMBOL_LANGUAGE (symbol));
-      else
-	*language = current_language;
+      Py_DECREF (result);
+      if (! *value)
+	{
+	  xfree (*name);
+	  return 0;
+	}
     }
-
-  *value = convert_value_from_python (pvalue);
-  if (! *value)
+  else
     {
-      xfree (*name);
+      PyErr_SetString (PyExc_RuntimeError,
+		       _("Mandatory function 'value' not " \
+			 "implemented."));
       return 0;
     }
-
   return 1;
 }
 
@@ -138,20 +157,10 @@ py_print_locals (PyObject *filter,
 		      if (! item)
 			goto locals_error;
 
-		      if (! PyTuple_Check (item)
-			  && PyTuple_Size (item) != 2)
-			{
-			  PyErr_SetString (PyExc_RuntimeError,
-					   _("frame_locals iterator must " \
-					     "return Python tuples."));
-			  Py_DECREF (item);
-			  Py_DECREF (iterator);
-			  goto locals_error;
-			}
 
-		      value_success = extract_value (item, &sym_name,
-						     &val,
-						     &language);
+		      value_success = extract_sym_and_value (item, &sym_name,
+							     &val,
+							     &language);
 		      Py_DECREF (item);
 
 		      if (! value_success)
@@ -254,20 +263,10 @@ py_print_args (PyObject *filter,
 		      int value_success = 0;
 		      volatile struct gdb_exception except;
 
-		      if (! PyTuple_Check (item)
-			  && PyTuple_Size (item) != 2)
-			{
-			  PyErr_SetString (PyExc_RuntimeError,
-					   _("frame_locals iterator must " \
-					     "return Python tuples."));
-			  Py_DECREF (item);
-			  Py_DECREF (iterator);
-			  goto args_error;
-			}
-
-		      value_success = extract_value (item, &sym_name,
-						     &val,
-						     &language);
+		      value_success = extract_sym_and_value (item,
+							     &sym_name,
+							     &val,
+							     &language);
 		      Py_DECREF (item);
 
 		      if (! value_success)


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


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

only message in thread, other threads:[~2012-07-23 19:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-23 19:38 [SCM] archer-pmuldoon-python-backtrace: Do not use a tuple for args/var, specifiy and object and an interface instead 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).