[pypy-svn] r6029 - pypy/branch/pypy-genc/translator

arigo at codespeak.net arigo at codespeak.net
Wed Aug 18 11:01:39 CEST 2004


Author: arigo
Date: Wed Aug 18 11:01:38 2004
New Revision: 6029

Modified:
   pypy/branch/pypy-genc/translator/genc.h
   pypy/branch/pypy-genc/translator/genc.py
Log:
Fix refcounting bugs.


Modified: pypy/branch/pypy-genc/translator/genc.h
==============================================================================
--- pypy/branch/pypy-genc/translator/genc.h	(original)
+++ pypy/branch/pypy-genc/translator/genc.h	Wed Aug 18 11:01:38 2004
@@ -4,7 +4,8 @@
 
 #include <Python.h>
 
-#define FREE(x)  Py_DECREF(x);
+#define INCREF(x)  Py_INCREF(x);
+#define DECREF(x)  Py_DECREF(x);
 
 #define CASE(x,y)           if (PyObject_RichCompareBool(x,y,Py_EQ))
 #define ELSE(x,y)           assert(PyObject_RichCompareBool(x,y,Py_EQ));

Modified: pypy/branch/pypy-genc/translator/genc.py
==============================================================================
--- pypy/branch/pypy-genc/translator/genc.py	(original)
+++ pypy/branch/pypy-genc/translator/genc.py	Wed Aug 18 11:01:38 2004
@@ -105,7 +105,7 @@
         args = graph.getargs()
         _eval = self.var_or_const_name
         returntypename = 'PyObject*'
-        l = ['PyObject* %s' % _eval(a) for a in args]
+        l = ['PyObject* %s' % a for a in args]
         return '%s %s(%s)' % (returntypename,
                               self.funcname[func],
                               ', '.join(l))
@@ -197,18 +197,15 @@
                     sourceargs = exit.args
                     targetargs = exit.target.inputargs
                     assert len(sourceargs) == len(targetargs)
-                    # get rid of assignments of UndefinedConstant
-                    sargs, targs = [], []
-                    for s,t in zip(sourceargs, targetargs):
-                        if not isinstance(s, UndefinedConstant):
-                            sargs.append(s)
-                            targs.append(t)
                     for n in range(len(to_release)-1, -1, -1):
                         var = to_release[n]
-                        if var not in sargs:
-                            print >> f, '%sFREE(%s)' % (indent, var)
-                    for s,t in zip(sargs, targs):
-                        print >> f, '%s%s = %s;' % (indent, t, _eval(s))
+                        if var not in sourceargs:
+                            print >> f, '%sDECREF(%s)' % (indent, var)
+                    for s,t in zip(sourceargs, targetargs):
+                        sname = _eval(s)
+                        if isinstance(s, Constant):
+                            print >> f, '%sINCREF(%s)' % (indent, sname)
+                        print >> f, '%s%s = %s;' % (indent, t, sname)
                     print >> f, '%sgoto %s;' % (indent,
                                                 blockname[exit.target])
                     if close:
@@ -222,7 +219,7 @@
             reachable = False
             for n in range(len(to_release)-1, -1, -1):
                 if reachable:
-                    print >> f, '\tFREE(%s)' % to_release[n]
+                    print >> f, '\tDECREF(%s)' % to_release[n]
                 if n in errlabels:
                     print >> f, '   %s:' % errlabels[n]
                     reachable = True



More information about the Pypy-commit mailing list