[pypy-svn] r12843 - pypy/dist/pypy/translator/c

arigo at codespeak.net arigo at codespeak.net
Fri May 27 16:34:41 CEST 2005


Author: arigo
Date: Fri May 27 16:34:41 2005
New Revision: 12843

Modified:
   pypy/dist/pypy/translator/c/funcgen.py
Log:
Support for Py_INCREF/Py_DECREF.


Modified: pypy/dist/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/dist/pypy/translator/c/funcgen.py	(original)
+++ pypy/dist/pypy/translator/c/funcgen.py	Fri May 27 16:34:41 2005
@@ -4,7 +4,7 @@
 from pypy.translator.c.support import llvalue_from_constant
 from pypy.objspace.flow.model import Variable, Constant, Block
 from pypy.objspace.flow.model import traverse, uniqueitems
-from pypy.rpython.lltype import GcPtr, NonGcPtr, PyObject
+from pypy.rpython.lltype import GcPtr, NonGcPtr, PyObject, Void, Primitive
 
 
 PyObjGcPtr    = GcPtr(PyObject)
@@ -20,9 +20,12 @@
     def __init__(self, graph, gettype, getvalue):
         self.graph = graph
         self.getvalue = getvalue
-        self.typemap, self.returntype = self.collecttypes(gettype)
+        self.lltypemap = self.collecttypes()
+        self.typemap = {}
+        for v, T in self.lltypemap.items():
+            self.typemap[v] = gettype(T)
 
-    def collecttypes(self, gettype):
+    def collecttypes(self):
         # collect all variables and constants used in the body,
         # and get their types now
         result = []
@@ -34,18 +37,15 @@
                 for link in block.exits:
                     result.extend(link.args)
         traverse(visit, self.graph)
-        typemap = {}
-        returnvar = self.graph.getreturnvar()
-        result.append(returnvar)
+        resultvar = self.graph.getreturnvar()
+        lltypemap = {resultvar: Void}   # default value, normally overridden
         for v in uniqueitems(result):
             if isinstance(v, Variable):
                 T = getattr(v, 'concretetype', PyObjGcPtr)
             else:
                 T = getattr(v, 'concretetype', PyObjNonGcPtr)
-            typemap[v] = gettype(T)
-            if v is returnvar:
-                returntype = T
-        return typemap, returntype
+            lltypemap[v] = T
+        return lltypemap
 
     def argnames(self):
         return [v.name for v in self.graph.getargs()]
@@ -57,7 +57,7 @@
         return [v for v in self.typemap if isinstance(v, Constant)]
 
     def allconstantvalues(self):
-        for v, T in self.typemap.iteritems():
+        for v in self.typemap:
             if isinstance(v, Constant):
                 yield llvalue_from_constant(v)
 
@@ -74,7 +74,8 @@
             raise TypeError, "expr(%r)" % (v,)
 
     def error_return_value(self):
-        return self.getvalue(ErrorValue(self.returntype))
+        returnlltype = self.lltypemap[self.graph.getreturnvar()]
+        return self.getvalue(ErrorValue(returnlltype))
 
     # ____________________________________________________________
 
@@ -95,7 +96,9 @@
 
         # generate an incref for each input argument
         for a in self.graph.getargs():
-            yield self.cincref(a)
+            line = self.cincref(a)
+            if line:
+                yield line
 
         def gen_link(link, linklocalvars=None):
             "Generate the code to jump across the given Link."
@@ -143,7 +146,7 @@
                     lst = [self.expr(v) for v in op.args]
                     lst.append(self.expr(op.result))
                     lst.append(err)
-                    yield '%s(%s);' % (macro, ', '.join(lst))
+                    yield '%s(%s)' % (macro, ', '.join(lst))
                 to_release.append(op.result)
 
             err_reachable = False
@@ -301,7 +304,21 @@
         return self.cdecref(op.args[0])
 
     def cincref(self, v):
-        return '/*XXX INCREF*/'
+        T = self.lltypemap[v]
+        if not isinstance(T, Primitive) and 'gc' in T.flags:
+            if T.TO == PyObject:
+                return 'Py_INCREF(%s);' % v.name
+            else:
+                return '/*XXX INCREF*/'
+        else:
+            return ''
 
     def cdecref(self, v, expr=None):
-        return '/*XXX DECREF*/'
+        T = self.lltypemap[v]
+        if not isinstance(T, Primitive) and 'gc' in T.flags:
+            if T.TO == PyObject:
+                return 'Py_DECREF(%s);' % v.name
+            else:
+                return '/*XXX DECREF*/'
+        else:
+            return ''



More information about the Pypy-commit mailing list