[pypy-svn] r24984 - in pypy/dist/pypy: rpython/memory translator/c

pedronis at codespeak.net pedronis at codespeak.net
Sat Mar 25 00:07:27 CET 2006


Author: pedronis
Date: Sat Mar 25 00:07:20 2006
New Revision: 24984

Modified:
   pypy/dist/pypy/rpython/memory/gctransform.py
   pypy/dist/pypy/translator/c/funcgen.py
Log:
try to fix gctransform and PyObject interaction (at least for refcounting). Hackish/quick way. This needs to be done properly on the branch. test_refcount_pyobj passes.



Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Sat Mar 25 00:07:20 2006
@@ -273,7 +273,11 @@
     def pop_alive_nopyobj(self, var):
         return []
 
-
+    def replace_getfield(self, op, livevars, block): # XXX hackish solution for now
+        getvalop = SpaceOperation("bare_getfield",
+                                   [op.args[0], op.args[1]], op.result)
+        return [getvalop], []
+ 
     # ----------------------------------------------------------------
 
 def _static_deallocator_body_for_type(v, TYPE, depth=1):
@@ -394,11 +398,15 @@
         if not var_needsgc(op.args[2]):
             return [op], []
         oldval = varoftype(op.args[2].concretetype)
-        getoldvalop = SpaceOperation("getfield",
+        getoldvalop = SpaceOperation("bare_getfield",
                                      [op.args[0], op.args[1]], oldval)
         result = [getoldvalop]
         result.extend(self.push_alive(op.args[2]))
-        result.append(op)
+        setvalop = SpaceOperation("bare_setfield",
+                                  op.args, op.result)
+ 
+
+        result.append(setvalop)
         return result, self.pop_alive(oldval)
 
     def replace_setarrayitem(self, op, livevars, block):
@@ -505,10 +513,10 @@
         g, fptr = self.annotate_helper(this, [llmemory.Address], lltype.Void)
         # the produced deallocator graph does not need to be transformed
         self.seen_graphs[g] = True
-        if destrptr:
-            # however, the direct_call to the destructor needs to get
-            # .cleanup attached
-            self.deallocator_graphs_needing_transforming.append(g)
+        #if destrptr:
+        # however, the direct_call to the destructor needs to get
+        # .cleanup attached
+        self.deallocator_graphs_needing_transforming.append(g)
 
         self.static_deallocator_funcptrs[TYPE] = fptr
         for p in find_gc_ptrs_in_type(TYPE):

Modified: pypy/dist/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/dist/pypy/translator/c/funcgen.py	(original)
+++ pypy/dist/pypy/translator/c/funcgen.py	Sat Mar 25 00:07:20 2006
@@ -12,7 +12,7 @@
 LOCALVAR = 'l_%s'
 
 # I'm not absolutely sure, so just in case:
-NEED_OLD_EXTRA_REFS = False
+NEED_OLD_EXTRA_REFS = True # we need them for now, should go in the tranformation!
 
 class FunctionCodeGenerator(object):
     """
@@ -453,11 +453,12 @@
         return 'if (RPyExceptionOccurred())\n\tFAIL(%s);' % err
 
     # low-level operations
-    def generic_get(self, op, sourceexpr):
+    def generic_get(self, op, sourceexpr, bare=False):
         T = self.lltypemap(op.result)
         newvalue = self.expr(op.result, special_case_void=False)
         result = ['%s = %s;' % (newvalue, sourceexpr)]
         # need to adjust the refcount of the result only for PyObjects
+        print "BARE", bare
         if NEED_OLD_EXTRA_REFS and T == PyObjPtr:
             result.append('Py_XINCREF(%s);' % newvalue)
         result = '\n'.join(result)
@@ -474,14 +475,17 @@
             result = '/* %s */' % result
         return result
 
-    def OP_GETFIELD(self, op, err, ampersand=''):
+    def OP_GETFIELD(self, op, err, ampersand='', bare=False):
         assert isinstance(op.args[1], Constant)
         STRUCT = self.lltypemap(op.args[0]).TO
         structdef = self.db.gettypedefnode(STRUCT)
         fieldname = structdef.c_struct_field_name(op.args[1].value)
         return self.generic_get(op, '%s%s->%s' % (ampersand,
                                                   self.expr(op.args[0]),
-                                                  fieldname))
+                                                  fieldname), bare=bare)
+
+    def OP_BARE_GETFIELD(self, op, err, ampersand=''):
+        return self.OP_GETFIELD(op, err, ampersand, bare=True)
 
     def OP_SETFIELD(self, op, err):
         assert isinstance(op.args[1], Constant)
@@ -491,6 +495,8 @@
         return self.generic_set(op, '%s->%s' % (self.expr(op.args[0]),
                                                 fieldname))
 
+    OP_BARE_SETFIELD = OP_SETFIELD
+        
     def OP_GETSUBSTRUCT(self, op, err):
         return self.OP_GETFIELD(op, err, ampersand='&')
 



More information about the Pypy-commit mailing list