[Python-checkins] r42356 - python/trunk/Objects/genobject.c

armin.rigo python-checkins at python.org
Tue Feb 14 16:50:44 CET 2006


Author: armin.rigo
Date: Tue Feb 14 16:50:44 2006
New Revision: 42356

Modified:
   python/trunk/Objects/genobject.c
Log:
* Refcount leak.  It was just a reference to Py_None, but still.

* Allow the 3rd argument to generator.throw() to be None.
  The 'raise' statement does the same, and anyway it follows the
  general policy that optional arguments of built-ins should, when
  reasonable, have a default value specifiable from Python.



Modified: python/trunk/Objects/genobject.c
==============================================================================
--- python/trunk/Objects/genobject.c	(original)
+++ python/trunk/Objects/genobject.c	Tue Feb 14 16:50:44 2006
@@ -214,7 +214,13 @@
 	if (!PyArg_ParseTuple(args, "O|OO:throw", &typ, &val, &tb))
 		return NULL;
 
-	if (tb && !PyTraceBack_Check(tb)) {
+	/* First, check the traceback argument, replacing None with
+	   NULL. */
+	if (tb == Py_None) {
+		Py_DECREF(tb);
+		tb = NULL;
+	}
+	else if (tb != NULL && !PyTraceBack_Check(tb)) {
 		PyErr_SetString(PyExc_TypeError,
 			"throw() third argument must be a traceback object");
 		return NULL;
@@ -237,14 +243,14 @@
 		}
 		else {
 			/* Normalize to raise <class>, <instance> */
+			Py_XDECREF(val);
 			val = typ;
 			typ = (PyObject*) ((PyInstanceObject*)typ)->in_class;
 			Py_INCREF(typ);
 		}
 	}
 	else {
-		/* Not something you can raise.  You get an exception
-		   anyway, just not what you specified :-) */
+		/* Not something you can raise.  throw() fails. */
 		PyErr_Format(PyExc_TypeError,
 			     "exceptions must be classes, or instances, not %s",
 			     typ->ob_type->tp_name);


More information about the Python-checkins mailing list