diff src/if_py_both.h @ 4976:4ed713442c51 v7.3.1233

updated for version 7.3.1233 Problem: Various Python problems. Solution: Fix VimTryEnd. Crash with debug build and PYTHONDUMPREFS=1. Memory leaks in StringToLine(), BufferMark() and convert_dl. (ZyX)
author Bram Moolenaar <bram@vim.org>
date Sun, 23 Jun 2013 14:37:07 +0200
parents a594ce86b5ea
children f4969f8f66e9
line wrap: on
line diff
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -544,20 +544,30 @@ VimTryStart(void)
 VimTryEnd(void)
 {
     --trylevel;
+    /* Without this it stops processing all subsequent VimL commands and 
+     * generates strange error messages if I e.g. try calling Test() in a cycle */
+    did_emsg = FALSE;
+    /* Keyboard interrupt should be preferred over anything else */
     if (got_int)
     {
+	did_throw = got_int = FALSE;
 	PyErr_SetNone(PyExc_KeyboardInterrupt);
-	return 1;
+	return -1;
     }
     else if (!did_throw)
-	return 0;
+	return (PyErr_Occurred() ? -1 : 0);
+    /* Python exception is preferred over vim one; unlikely to occur though */
     else if (PyErr_Occurred())
-	return 1;
+    {
+	did_throw = FALSE;
+	return -1;
+    }
+    /* Finally transform VimL exception to python one */
     else
     {
 	PyErr_SetVim((char *) current_exception->value);
 	discard_current_exception();
-	return 1;
+	return -1;
     }
 }
 
@@ -2649,7 +2659,14 @@ FunctionCall(FunctionObject *self, PyObj
     static PyObject *
 FunctionRepr(FunctionObject *self)
 {
-    return PyString_FromFormat("<vim.Function '%s'>", self->name);
+#ifdef Py_TRACE_REFS
+    /* For unknown reason self->name may be NULL after calling 
+     * Finalize */
+    return PyString_FromFormat("<vim.Function '%s'>",
+	    (self->name == NULL ? "<NULL>" : (char *) self->name));
+#else
+    return PyString_FromFormat("<vim.Function '%s'>", (char *) self->name);
+#endif
 }
 
 static struct PyMethodDef FunctionMethods[] = {
@@ -3534,6 +3551,7 @@ StringToLine(PyObject *obj)
 	else
 	{
 	    PyErr_SET_VIM("string cannot contain newlines");
+	    Py_XDECREF(bytes);
 	    return NULL;
 	}
     }
@@ -3545,6 +3563,7 @@ StringToLine(PyObject *obj)
     if (save == NULL)
     {
 	PyErr_NoMemory();
+	Py_XDECREF(bytes);
 	return NULL;
     }
 
@@ -4551,6 +4570,7 @@ BufferMark(BufferObject *self, PyObject 
     {
 	PyErr_SET_STRING(PyExc_ValueError,
 		"mark name must be a single character");
+	Py_XDECREF(todecref);
 	return NULL;
     }
 
@@ -5298,6 +5318,9 @@ convert_dl(PyObject *obj, typval_T *tv,
 	    tv->v_type = VAR_UNKNOWN;
 	    return -1;
 	}
+
+	Py_DECREF(capsule);
+
 	if (py_to_tv(obj, tv, lookup_dict) == -1)
 	{
 	    tv->v_type = VAR_UNKNOWN;
@@ -5378,13 +5401,13 @@ ConvertFromPyObject(PyObject *obj, typva
 	tv->vval.v_dict = (((DictionaryObject *)(obj))->dict);
 	++tv->vval.v_dict->dv_refcount;
     }
-    else if (obj->ob_type == &ListType)
+    else if (PyType_IsSubtype(obj->ob_type, &ListType))
     {
 	tv->v_type = VAR_LIST;
 	tv->vval.v_list = (((ListObject *)(obj))->list);
 	++tv->vval.v_list->lv_refcount;
     }
-    else if (obj->ob_type == &FunctionType)
+    else if (PyType_IsSubtype(obj->ob_type, &FunctionType))
     {
 	if (set_string_copy(((FunctionObject *) (obj))->name, tv) == -1)
 	    return -1;