[pypy-svn] r10510 - in pypy/dist/pypy/translator: . genc genc/test

arigo at codespeak.net arigo at codespeak.net
Sun Apr 10 15:24:05 CEST 2005


Author: arigo
Date: Sun Apr 10 15:24:05 2005
New Revision: 10510

Modified:
   pypy/dist/pypy/translator/genc/ctyper.py
   pypy/dist/pypy/translator/genc/funcdef.py
   pypy/dist/pypy/translator/genc/genc.py
   pypy/dist/pypy/translator/genc/t_func.py
   pypy/dist/pypy/translator/genc/t_pyobj.py
   pypy/dist/pypy/translator/genc/t_simple.py
   pypy/dist/pypy/translator/genc/t_tuple.py
   pypy/dist/pypy/translator/genc/test/test_ctrans.py
   pypy/dist/pypy/translator/translator.py
Log:
Fixed the handling of incref/decref with elements of tuples.  Now all tests
pass.


Modified: pypy/dist/pypy/translator/genc/ctyper.py
==============================================================================
--- pypy/dist/pypy/translator/genc/ctyper.py	(original)
+++ pypy/dist/pypy/translator/genc/ctyper.py	Sun Apr 10 15:24:05 2005
@@ -95,6 +95,7 @@
                         yield self.typed_op(SpaceOperation('tuple_setitem',
                                    [v2,   Constant(i), vitem], v0),  # args, ret
                                    [ctup, TInt,        ct   ], TNone) # a_t, r_t
+                        yield self.incref_op(vitem)
                     return
 
         if op.opname == 'getitem':
@@ -111,7 +112,19 @@
                         else:
                             yield self.typed_op(op, [ctup, self.TInt], ct,
                                                 newopname='tuple_getitem')
+                            yield self.incref_op(op.result)
                             return
 
         # fall-back
         yield Specializer.specialized_op(self, op, bindings)
+
+
+    def incref_op(self, v):
+        vnone = Variable()
+        vnone.concretetype = self.TNone
+        return SpaceOperation('incref', [v], vnone)
+
+    def deref_op(self, v):
+        vnone = Variable()
+        vnone.concretetype = self.TNone
+        return SpaceOperation('decref', [v], vnone)

Modified: pypy/dist/pypy/translator/genc/funcdef.py
==============================================================================
--- pypy/dist/pypy/translator/genc/funcdef.py	(original)
+++ pypy/dist/pypy/translator/genc/funcdef.py	Sun Apr 10 15:24:05 2005
@@ -371,9 +371,9 @@
         
         # generate an incref for each input argument
         for a in self.graphargs:
-            cincref = self.ctypeof(a).cincref
-            if cincref:
-                print >> f, '\t' + cincref % (self.expr(a),)
+            line = self.ctypeof(a).cincref(self.expr(a))
+            if line:
+                print >> f, '\t' + line
 
         # print the body
         for line in body:
@@ -417,13 +417,14 @@
                     ct1 = self.ctypeof(a1)
                     ct2 = self.ctypeof(a2)
                     assert ct1 == ct2
-                    if ct1.cincref:
-                        line += '\t' + ct1.cincref % (self.expr(a2),)
+                    line2 = ct1.cincref(self.expr(a2))
+                    if line2:
+                        line += '\t' + line2
                 yield line
             for v in has_ref:
-                cdecref = self.ctypeof(v).cdecref
-                if cdecref:
-                    yield cdecref % (linklocalvars[v],)
+                line = self.ctypeof(v).cdecref(linklocalvars[v])
+                if line:
+                    yield line
             yield 'goto block%d;' % blocknum[link.target]
 
         # collect all blocks
@@ -521,12 +522,9 @@
             while to_release:
                 v = to_release.pop()
                 if err_reachable:
-                    if not hasattr(v, 'concretetype'):
-                        cdecref = 'ERR_DECREF(%s)'
-                    else:
-                        cdecref = v.concretetype.cdecref
-                    if cdecref:
-                        yield cdecref % (self.expr(v),)
+                    line = self.ctypeof(v).cdecref(self.expr(v))
+                    if line:
+                        yield line
                 yield 'err%d_%d:' % (blocknum[block], len(to_release))
                 err_reachable = True
             if err_reachable:
@@ -596,6 +594,14 @@
         return '%s = %s(%s); if (PyErr_Occurred()) FAIL(%s)' % (
             r, args[0], ', '.join(args[1:]), err)
 
+    def OP_INCREF(self, args, r, err):
+        v, = args[0].args
+        return self.ctypeof(v).cincref(args[0].compute())
+
+    def OP_DECREF(self, args, r, err):
+        v, = args[0].args
+        return self.ctypeof(v).cdecref(args[0].compute())
+
 # ____________________________________________________________
 
 class lazy:

Modified: pypy/dist/pypy/translator/genc/genc.py
==============================================================================
--- pypy/dist/pypy/translator/genc/genc.py	(original)
+++ pypy/dist/pypy/translator/genc/genc.py	Sun Apr 10 15:24:05 2005
@@ -130,10 +130,11 @@
     def gen_global_declarations(self):
         # collect more of the latercode between the functions,
         # and produce the corresponding global declarations
-        for ct in self.translator.concretetypes.values():
+        for ct in self.translator.ctlist:
             if ct not in self.ctypes_alreadyseen:
                 self.globaldecl += list(ct.init_globals(self))
                 self.ctypes_alreadyseen[ct] = True
+        for ct in self.translator.ctlist:
             self.globaldecl += list(ct.collect_globals(self))
         g = self.globaldecl
         if g:

Modified: pypy/dist/pypy/translator/genc/t_func.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_func.py	(original)
+++ pypy/dist/pypy/translator/genc/t_func.py	Sun Apr 10 15:24:05 2005
@@ -23,7 +23,7 @@
         # a nice textual name for debugging...
         argnames = [ct.debugname() for ct in self.argtypes]
         returnname = self.returntype.debugname()
-        return 'fn (%s) -> %s' % (', '.join(argnames), returnname)
+        return 'fn(%s) -> %s' % (', '.join(argnames), returnname)
 
     def nameof(self, func, debug=None):
         return self.genc().getfuncdef(func).fast_name

Modified: pypy/dist/pypy/translator/genc/t_pyobj.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_pyobj.py	(original)
+++ pypy/dist/pypy/translator/genc/t_pyobj.py	Sun Apr 10 15:24:05 2005
@@ -15,8 +15,6 @@
     reconstruct them.
     """
     ctypetemplate = 'PyObject *%s'
-    cincref       = 'Py_INCREF(%s);'
-    cdecref       = 'Py_DECREF(%s);'
     error_return  = 'NULL'
 
     def __init__(self, translator):
@@ -53,6 +51,12 @@
         self.globalobjects = []
         self.debugstack = ()  # linked list of nested nameof()
 
+    def cincref(self, expr):
+        return 'Py_INCREF(%s);' % expr
+
+    def cdecref(self, expr):
+        return 'Py_DECREF(%s);' % expr
+
     def nameof(self, obj, debug=None):
         key = Constant(obj).key
         try:

Modified: pypy/dist/pypy/translator/genc/t_simple.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_simple.py	(original)
+++ pypy/dist/pypy/translator/genc/t_simple.py	Sun Apr 10 15:24:05 2005
@@ -4,8 +4,6 @@
 
 
 class CType(object):
-    cincref = None
-    cdecref = None
 
     def __init__(self, translator):
         self.translator = translator
@@ -30,6 +28,12 @@
     def collect_globals(self, genc):
         return []
 
+    def cincref(self, expr):
+        return ''
+
+    def cdecref(self, expr):
+        return ''
+
 
 class CIntType(CType):
     error_return  = '-1'

Modified: pypy/dist/pypy/translator/genc/t_tuple.py
==============================================================================
--- pypy/dist/pypy/translator/genc/t_tuple.py	(original)
+++ pypy/dist/pypy/translator/genc/t_tuple.py	Sun Apr 10 15:24:05 2005
@@ -22,7 +22,7 @@
     def debugname(self):
         # a nice textual name for debugging...
         itemnames = [ct.debugname() for ct in self.itemtypes]
-        return 'tuple (%s)' % (', '.join(itemnames),)
+        return 'tuple(%s)' % (', '.join(itemnames),)
 
     def fieldnames(self):
         return ['f%d' % i for i in range(len(self.itemtypes))]
@@ -32,14 +32,31 @@
         for ct, name in zip(self.itemtypes, self.fieldnames()):
             yield '\t' + ct.ctypetemplate % (name,) + ';'
         yield '};'
-        yield '%s %s;  /* uninitialized */' % (self.structname,
-                                               self.error_return)
+        self.globaldecl.append(
+            '%s %s;  /* uninitialized */' % (self.structname,
+                                             self.error_return))
 
     def collect_globals(self, genc):
         result = self.globaldecl
         self.globaldecl = []
         return result
 
+    def cincref(self, expr):
+        result = []
+        for i in range(len(self.itemtypes)):
+            line = self.itemtypes[i].cincref('%s.f%d' % (expr, i))
+            if line:
+                result.append(line)
+        return ' '.join(result)
+
+    def cdecref(self, expr):
+        result = []
+        for i in range(len(self.itemtypes)):
+            line = self.itemtypes[i].cdecref('%s.f%d' % (expr, i))
+            if line:
+                result.append(line)
+        return '\t'.join(result)
+
     def nameof(self, tup, debug=None):
         genc = self.genc()
         try:
@@ -66,6 +83,7 @@
             yield typer.typed_op(SpaceOperation('tuple_getitem',
                                    [v1,   Constant(i)], vitem),  # args, retval
                                    [self, TInt       ], ct    )  # arg_t, ret_t
+            yield typer.incref_op(vitem)
             pyobjitems_v.append(vitem)
         # create a new PyTupleObject with these values
         # note that typed_op() will insert the conversion of vitem if needed
@@ -85,9 +103,11 @@
             yield typer.typed_op(SpaceOperation('pytuple_getitem',
                                    [v1,     Constant(i)], vitem), # args, retval
                                    [TPyObj, TInt       ], TPyObj) # arg_t, ret_t
+            yield typer.incref_op(vitem)
             # store it into the "struct" tuple
             # note that typed_op() will insert the conversion of vitem if needed
             v0 = Variable()
             yield typer.typed_op(SpaceOperation('tuple_setitem',
                                    [v2,   Constant(i), vitem], v0),  # args, ret
                                    [self, TInt,        ct   ], TNone) # a_t, r_t
+            yield typer.incref_op(vitem)

Modified: pypy/dist/pypy/translator/genc/test/test_ctrans.py
==============================================================================
--- pypy/dist/pypy/translator/genc/test/test_ctrans.py	(original)
+++ pypy/dist/pypy/translator/genc/test/test_ctrans.py	Sun Apr 10 15:24:05 2005
@@ -360,7 +360,3 @@
     def test_int_overflow(self):
         fn = self.getcompiled(snippet.simple_func)
         raises(OverflowError, fn, sys.maxint+1)
-
-
-    def test_get_set_del_slice(self):
-        py.test.skip("missing incref/decref in tuples")

Modified: pypy/dist/pypy/translator/translator.py
==============================================================================
--- pypy/dist/pypy/translator/translator.py	(original)
+++ pypy/dist/pypy/translator/translator.py	Sun Apr 10 15:24:05 2005
@@ -64,6 +64,7 @@
         self.callgraph = {}   # {opaque_tag: (caller, callee)}
         self.frozen = False   # when frozen, no more flowgraphs can be generated
         self.concretetypes = {}  # see getconcretetype()
+        self.ctlist = []         #  "
         if self.entrypoint:
             self.getflowgraph()
 
@@ -281,6 +282,7 @@
             return self.concretetypes[cls, args]
         except KeyError:
             result = self.concretetypes[cls, args] = cls(self, *args)
+            self.ctlist.append(result)
             return result
 
 



More information about the Pypy-commit mailing list