[Python-checkins] r42435 - python/branches/ast-objects/Python/ast.c

neal.norwitz python-checkins at python.org
Fri Feb 17 08:55:46 CET 2006


Author: neal.norwitz
Date: Fri Feb 17 08:55:45 2006
New Revision: 42435

Modified:
   python/branches/ast-objects/Python/ast.c
Log:
Further updates from Simon Burton, fix some ref leaks, more to go

Modified: python/branches/ast-objects/Python/ast.c
==============================================================================
--- python/branches/ast-objects/Python/ast.c	(original)
+++ python/branches/ast-objects/Python/ast.c	Fri Feb 17 08:55:45 2006
@@ -1286,6 +1286,8 @@
     Py_XDECREF(ge);
     Py_XDECREF(t);
     Py_XDECREF(expression);
+    /* Py_XDECREF(store); */
+    /* Py_XDECREF(tmp); */
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -1639,11 +1641,12 @@
     PyObject *e = NULL;
     int i;
     REQ(n, power);
+
     e = ast_for_atom(c, CHILD(n, 0));
     if (!e)
         goto error;
     if (NCH(n) == 1)
-        return e; // BAD BAD
+        return e;
     for (i = 1; i < NCH(n); i++) {
         node *ch = CHILD(n, i);
         if (TYPE(ch) != trailer)
@@ -1652,7 +1655,7 @@
         if (!tmp) {
             goto error;
         }
-        // Py_XDECREF(e); // UNCOMMENT
+        Py_XDECREF(e);
         e = tmp;
         tmp = NULL;
     }
@@ -1665,6 +1668,7 @@
         if (!tmp) {
             goto error;
         }
+        Py_XDECREF(e);
         e = tmp;
         tmp = NULL;
     }
@@ -1968,6 +1972,13 @@
     result = Call(func, args, keywords, vararg, kwarg, LINENO(n));
 
  error:
+    Py_XDECREF(args);
+    Py_XDECREF(keywords);
+    Py_XDECREF(vararg);
+    Py_XDECREF(kwarg);
+    Py_XDECREF(e);
+    Py_XDECREF(kw);
+    Py_XDECREF(key);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2039,11 +2050,14 @@
         }
         STEAL_ITEM(bases, 0, base);
         result = bases;
+        Py_INCREF(result);
     }
     else {
         result = seq_for_testlist(c, n);
     }
  error:
+    Py_XDECREF(base);
+    Py_XDECREF(bases);
     return result;
 }
 
@@ -2131,10 +2145,10 @@
 
             /* set context to assign */
             if (!e) 
-              goto error;
+                goto error;
 
             if (!set_context(e, Store(), CHILD(n, i))) {
-              goto error;
+                goto error;
             }
 
             STEAL_ITEM(targets, i / 2, e);
@@ -2149,6 +2163,12 @@
         result = Assign(targets, expression, LINENO(n));
     }
  error:
+    Py_XDECREF(e); 
+    Py_XDECREF(expr1); 
+    Py_XDECREF(expr2); 
+    Py_XDECREF(operator); 
+    Py_XDECREF(targets); 
+    Py_XDECREF(expression); 
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2160,7 +2180,8 @@
                              | '>>' test [ (',' test)+ [','] ] )
      */
     PyObject *result = NULL;
-    PyObject *dest = NULL, *expression;
+    PyObject *dest = NULL;
+    PyObject *expression = NULL;
     PyObject *seq = NULL;
     PyObject *nl = NULL;
     int i, start = 1;
@@ -2186,8 +2207,13 @@
     }
     assert(pos==PyList_GET_SIZE(seq));
     nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? Py_False : Py_True;
+    Py_INCREF(nl);
     result = Print(dest, seq, nl, LINENO(n));
  error:
+    Py_XDECREF(dest);
+    Py_XDECREF(expression);
+    Py_XDECREF(seq);
+    Py_XDECREF(nl);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2196,8 +2222,8 @@
 ast_for_exprlist(struct compiling *c, const node *n, PyObject* context)
 {
     PyObject *result = NULL;
-    PyObject *seq = NULL;
     int i;
+    PyObject *seq = NULL;
     PyObject *e = NULL;
 
     REQ(n, exprlist);
@@ -2211,14 +2237,18 @@
             goto error;
         PyList_SET_ITEM(seq,i/2,e);
         if (context) {
-            if (!set_context(e, context, CHILD(n, i)))
+            if (!set_context(e, context, CHILD(n, i))) {
+                    e = NULL;
                     goto error;
+            }
         }
         e = NULL;
     }
     result = seq;
-
+    seq = NULL;
 error:
+    Py_XDECREF(seq);
+    Py_XDECREF(e);
     return result;
 }
 
@@ -2326,6 +2356,11 @@
             goto error;
     }
  error:
+    Py_XDECREF(exp);
+    Py_XDECREF(expression);
+    Py_XDECREF(expr1);
+    Py_XDECREF(expr2);
+    Py_XDECREF(expr3);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2401,6 +2436,7 @@
             goto error;
     }
  error:
+    /* Py_XDECREF(a); */
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2499,6 +2535,7 @@
         Py_INCREF(alias_name(mod));
         import = ImportFrom(alias_name(mod), aliases, lineno);
         result = import;
+        Py_INCREF(result);
     }
     else
         PyErr_Format(PyExc_SystemError,
@@ -2506,6 +2543,10 @@
                      STR(CHILD(n, 0)));
  error:
     if (result && PyAST_Validate(result) == -1) return NULL;
+    Py_XDECREF(aliases);
+    Py_XDECREF(mod);
+    Py_XDECREF(import);
+    Py_XDECREF(import_alias);
     return result;
 }
 
@@ -2531,6 +2572,8 @@
     }
     result = Global(s, LINENO(n));
  error:
+    Py_XDECREF(name);
+    Py_XDECREF(s);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2539,8 +2582,11 @@
 ast_for_exec_stmt(struct compiling *c, const node *n)
 {
     PyObject *result = NULL;
-    PyObject *expr1 = NULL, *globals = NULL, *locals = NULL;
+    PyObject *expr1 = NULL;
+    PyObject *globals = NULL;
+    PyObject *locals = NULL;
     int n_children = NCH(n);
+
     if (n_children != 2 && n_children != 4 && n_children != 6) {
         PyErr_Format(PyExc_SystemError,
                      "poorly formed 'exec' statement: %d parts to statement",
@@ -2566,6 +2612,9 @@
 
     result = Exec(expr1, globals, locals, LINENO(n));
  error:
+    Py_XDECREF(expr1);
+    Py_XDECREF(globals);
+    Py_XDECREF(locals);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2600,6 +2649,9 @@
                      "improper number of parts to 'assert' statement: %d",
                      NCH(n));
  error:
+    Py_XDECREF(expression);
+    Py_XDECREF(expr1);
+    Py_XDECREF(expr2);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2664,7 +2716,10 @@
     }
     assert(pos == PyList_GET_SIZE(seq));
     result = seq;
+    seq = NULL;
  error:
+    Py_XDECREF(seq);
+    Py_XDECREF(s);
     return result;
 }
 
@@ -2771,6 +2826,7 @@
     
                 PyList_SET_ITEM(new, 0, If(expression, suite_seq, orelse, LINENO(CHILD(n, off))));
                 orelse = new;
+                new = NULL;
             }
             result = If(ast_for_expr(c, CHILD(n, 1)),
                       ast_for_suite(c, CHILD(n, 3)),
@@ -2783,6 +2839,12 @@
         }
     }
  error:
+    Py_XDECREF(expression);
+    Py_XDECREF(suite_seq);
+    Py_XDECREF(seq1);
+    Py_XDECREF(seq2);
+    Py_XDECREF(orelse);
+    Py_XDECREF(new);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2832,6 +2894,10 @@
         goto error;
     }
  error:
+    Py_XDECREF(expression);
+    Py_XDECREF(suite_seq);
+    Py_XDECREF(seq1);
+    Py_XDECREF(seq2);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2839,13 +2905,13 @@
 static PyObject*
 ast_for_for_stmt(struct compiling *c, const node *n)
 {
+    /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
     PyObject *result = NULL;
     PyObject *_target = NULL;
     PyObject *seq = NULL;
     PyObject *suite_seq = NULL;
     PyObject *expression = NULL;
     PyObject *target = NULL;
-    /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
     REQ(n, for_stmt);
 
     if (NCH(n) == 9) {
@@ -2860,6 +2926,7 @@
     }
     if (PyList_GET_SIZE(_target) == 1) {
         target = PyList_GET_ITEM(_target, 0);
+        Py_INCREF(target);
     }
     else
         target = Tuple(_target, Store(), LINENO(n));
@@ -2875,6 +2942,11 @@
 
     result = For(target, expression, suite_seq, seq, LINENO(n));
  error:
+    Py_XDECREF(_target);
+    Py_XDECREF(seq);
+    Py_XDECREF(suite_seq);
+    Py_XDECREF(expression);
+    Py_XDECREF(target);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2934,6 +3006,9 @@
         goto error;
     }
  error:
+    Py_XDECREF(suite_seq);
+    Py_XDECREF(expression);
+    Py_XDECREF(e);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -2941,13 +3016,13 @@
 static PyObject*
 ast_for_try_stmt(struct compiling *c, const node *n)
 {
+    PyObject *result = NULL;
     PyObject *e = NULL;
     PyObject *s1 = NULL;
     PyObject *s2 = NULL;
     PyObject *suite_seq1 = NULL;
     PyObject *suite_seq2 = NULL;
     PyObject *handlers = NULL;
-    PyObject *result = NULL;
     REQ(n, try_stmt);
 
     if (TYPE(CHILD(n, 3)) == NAME) {/* must be 'finally' */
@@ -3003,6 +3078,12 @@
         goto error;
     }
  error:
+    Py_XDECREF(e);
+    Py_XDECREF(s1);
+    Py_XDECREF(s2);
+    Py_XDECREF(suite_seq1);
+    Py_XDECREF(suite_seq2);
+    Py_XDECREF(handlers);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -3012,7 +3093,8 @@
 {
     /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
     PyObject *result = NULL;
-    PyObject *bases = NULL; PyObject *s = NULL;
+    PyObject *bases = NULL;
+    PyObject *s = NULL;
     
     REQ(n, classdef);
 
@@ -3047,6 +3129,8 @@
         result = ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n));
     }
  error:
+    Py_XDECREF(bases);
+    Py_XDECREF(s);
     if (result && PyAST_Validate(result) == -1) return NULL;
     return result;
 }
@@ -3405,3 +3489,4 @@
         Py_XDECREF(v);
         return NULL;
 }
+


More information about the Python-checkins mailing list