2011-10-27 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Thu, 27 Oct 2011 10:29:58 +0000 (10:29 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Thu, 27 Oct 2011 10:29:58 +0000 (10:29 +0000)
        PR python/13331

* python/py-function.c (fnpy_call): Check 'args' is not NULL.
(convert_values_to_python): Return on Python tuple allocation
failure.  Return NULL on value conversion error.

gdb/ChangeLog
gdb/python/py-function.c

index 4acd4e59e632f8429db5f695f34afb69869a830f..f05a246745b351beea4053ad9c7a40a6900028a7 100644 (file)
@@ -1,3 +1,11 @@
+2011-10-27  Phil Muldoon  <pmuldoon@redhat.com>
+
+        PR python/13331
+
+       * python/py-function.c (fnpy_call): Check 'args' is not NULL.
+       (convert_values_to_python): Return on Python tuple allocation
+       failure.  Return NULL on value conversion error.
+
 2011-10-27  Phil Muldoon  <pmuldoon@redhat.com>
 
        * python/py-breakpoint.c (bppy_set_enabled): Use TRY_CATCH.
index dc78b29f216a445c3dd5b2f4cba674c9f8fdbe23..de7e94cefb827b8b1ebeeb1fe2d500d8a82e61af 100644 (file)
@@ -38,6 +38,9 @@ convert_values_to_python (int argc, struct value **argv)
 {
   int i;
   PyObject *result = PyTuple_New (argc);
+  
+  if (! result)
+    return NULL;
 
   for (i = 0; i < argc; ++i)
     {
@@ -45,7 +48,7 @@ convert_values_to_python (int argc, struct value **argv)
       if (! elt)
        {
          Py_DECREF (result);
-         error (_("Could not convert value to Python object."));
+         return NULL;
        }
       PyTuple_SetItem (result, i, elt);
     }
@@ -59,24 +62,35 @@ fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
           void *cookie, int argc, struct value **argv)
 {
   struct value *value = NULL;
-  PyObject *result, *callable, *args;
+  /* 'result' must be set to NULL, this initially indicates whether
+     the function was called, or not.  */
+  PyObject *result = NULL;
+  PyObject *callable, *args;
   struct cleanup *cleanup;
 
   cleanup = ensure_python_env (gdbarch, language);
 
   args = convert_values_to_python (argc, argv);
+  /* convert_values_to_python can return NULL on error.  If we
+     encounter this, do not call the function, but allow the Python ->
+     error code conversion below to deal with the Python exception.
+     Note, that this is different if the function simply does not
+     have arguments.  */
 
-  callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
-  if (! callable)
+  if (args)
     {
+      callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
+      if (! callable)
+       {
+         Py_DECREF (args);
+         error (_("No method named 'invoke' in object."));
+       }
+
+      result = PyObject_Call (callable, args, NULL);
+      Py_DECREF (callable);
       Py_DECREF (args);
-      error (_("No method named 'invoke' in object."));
     }
 
-  result = PyObject_Call (callable, args, NULL);
-  Py_DECREF (callable);
-  Py_DECREF (args);
-
   if (!result)
     {
       PyObject *ptype, *pvalue, *ptraceback;