[pypy-svn] r47259 - in pypy/branch/kill-keepalives-again/pypy/rpython: . lltypesystem

arigo at codespeak.net arigo at codespeak.net
Sun Oct 7 13:42:44 CEST 2007


Author: arigo
Date: Sun Oct  7 13:42:44 2007
New Revision: 47259

Modified:
   pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py
   pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py
Log:
Intermediate check-in: remove the 'gc' attribute of llinterp.  Now
the heap is responsible for handling all gc-flavored operations in
a special way if it wants to.  (rpython/memory needs fixing now)


Modified: pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py
==============================================================================
--- pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py	(original)
+++ pypy/branch/kill-keepalives-again/pypy/rpython/llinterp.py	Sun Oct  7 13:42:44 2007
@@ -49,16 +49,13 @@
         self.heap = heap  #module that provides malloc, etc for lltypes
         self.exc_data_ptr = exc_data_ptr
         self.active_frame = None
-        # XXX hack: set gc to None because
-        # prepare_graphs_and_create_gc might already use the llinterpreter!
-        self.gc = None
         self.tracer = None
         self.malloc_check = malloc_check
         self.frame_class = LLFrame
         self.mallocs = {}
         if hasattr(heap, "prepare_graphs_and_create_gc"):
             flowgraphs = typer.annotator.translator.graphs
-            self.gc = heap.prepare_graphs_and_create_gc(self, flowgraphs)
+            heap.prepare_graphs_and_create_gc(self, flowgraphs)
         if tracing:
             self.tracer = Tracer()
 
@@ -273,8 +270,7 @@
                 if nextblock is None:
                     self.llinterpreter.active_frame = self.f_back
                     for obj in self.alloca_objects:
-                        #XXX slighly unclean
-                        obj._setobj(None)
+                        self.heap.free(obj, flavor='raw')
                     return args
         finally:
             if tracer:
@@ -548,15 +544,14 @@
     def op_setfield(self, obj, fieldname, fieldvalue):
         # obj should be pointer
         FIELDTYPE = getattr(lltype.typeOf(obj).TO, fieldname)
-        if FIELDTYPE != lltype.Void:
-            gc = self.llinterpreter.gc
-            if gc is None or not gc.needs_write_barrier(FIELDTYPE):
-                setattr(obj, fieldname, fieldvalue)
-            else:
-                args = gc.get_arg_write_barrier(obj, fieldname, fieldvalue)
-                write_barrier = gc.get_funcptr_write_barrier()
-                result = self.op_direct_call(write_barrier, *args)
-    op_bare_setfield = op_setfield
+        if FIELDTYPE is not lltype.Void:
+            self.heap.setfield(obj, fieldname, fieldvalue)
+
+    def op_bare_setfield(self, obj, fieldname, fieldvalue):
+        # obj should be pointer
+        FIELDTYPE = getattr(lltype.typeOf(obj).TO, fieldname)
+        if FIELDTYPE is not lltype.Void:
+            setattr(obj, fieldname, fieldvalue)
 
     def op_getinteriorfield(self, obj, *offsets):
         checkptr(obj)
@@ -569,7 +564,7 @@
         assert not isinstance(ob, lltype._interior_ptr)
         return ob
 
-    def op_setinteriorfield(self, obj, *fieldnamesval):
+    def setinterior(self, heap, obj, *fieldnamesval):
         prefields, finalfield, fieldvalue = (
             fieldnamesval[:-2], fieldnamesval[-2], fieldnamesval[-1])
         for o in prefields:
@@ -577,11 +572,19 @@
                 obj = getattr(obj, o)
             else:
                 obj = obj[o]
+        T = obj._T
         if isinstance(finalfield, str):
-            setattr(obj, finalfield, fieldvalue)
+            if getattr(T, fieldname) is not lltype.Void:
+                heap.setfield(obj, finalfield, fieldvalue)
         else:
-            obj[finalfield] = fieldvalue
-    op_bare_setinteriorfield = op_setinteriorfield
+            if T.OF is not lltype.Void:
+                heap.setarrayitem(obj, finalfield, fieldvalue)
+
+    def op_setinteriorfield(self, obj, *fieldnamesval):
+        self.setinterior(self.heap, obj, *fieldnamesval)
+
+    def op_bare_setinteriorfield(self, obj, *fieldnamesval):
+        self.setinterior(llheap, obj, *fieldnamesval)
 
     def op_getarrayitem(self, array, index):
         return array[index]
@@ -589,15 +592,14 @@
     def op_setarrayitem(self, array, index, item):
         # array should be a pointer
         ITEMTYPE = lltype.typeOf(array).TO.OF
-        if ITEMTYPE != lltype.Void:
-            gc = self.llinterpreter.gc
-            if gc is None or not gc.needs_write_barrier(ITEMTYPE):
-                array[index] = item
-            else:
-                args = gc.get_arg_write_barrier(array, index, item)
-                write_barrier = gc.get_funcptr_write_barrier()
-                self.op_direct_call(write_barrier, *args)
-    op_bare_setarrayitem = op_setarrayitem
+        if ITEMTYPE is not lltype.Void:
+            self.heap.setarrayitem(array, index, item)
+
+    def op_bare_setarrayitem(self, array, index, item):
+        # array should be a pointer
+        ITEMTYPE = lltype.typeOf(array).TO.OF
+        if ITEMTYPE is not lltype.Void:
+            array[index] = item
 
 
     def perform_call(self, f, ARGS, args):
@@ -654,20 +656,10 @@
     def op_malloc(self, obj, flags):
         flavor = flags['flavor']
         zero = flags.get('zero', False)
-        if self.llinterpreter.gc is not None and flavor == 'gc':
-            assert not zero
-            args = self.llinterpreter.gc.get_arg_malloc(obj)
-            malloc = self.llinterpreter.gc.get_funcptr_malloc()
-            result = self.op_direct_call(malloc, *args)
-            return self.llinterpreter.gc.adjust_result_malloc(result, obj)
-        elif flavor == "stack":
-            if isinstance(obj, lltype.Struct) and obj._arrayfld is None:
-                result = self.heap.malloc(obj)
-                self.alloca_objects.append(result)
-                return result
-            else:
-                raise ValueError("cannot allocate variable-sized things on the stack")
-
+        if flavor == "stack":
+            result = self.heap.malloc(obj, zero=zero, flavor='raw')
+            self.alloca_objects.append(result)
+            return result
         ptr = self.heap.malloc(obj, zero=zero, flavor=flavor)
         if flavor == 'raw' and self.llinterpreter.malloc_check:
             self.llinterpreter.remember_malloc(ptr, self)
@@ -683,12 +675,6 @@
     def op_malloc_varsize(self, obj, flags, size):
         flavor = flags['flavor']
         zero = flags.get('zero', False)
-        if self.llinterpreter.gc is not None and flavor == 'gc':
-            assert not zero
-            args = self.llinterpreter.gc.get_arg_malloc(obj, size)
-            malloc = self.llinterpreter.gc.get_funcptr_malloc()
-            result = self.op_direct_call(malloc, *args)
-            return self.llinterpreter.gc.adjust_result_malloc(result, obj, size)
         assert flavor in ('gc', 'raw')
         try:
             ptr = self.heap.malloc(obj, size, zero=zero, flavor=flavor)
@@ -742,8 +728,7 @@
     op_cast_weakrefptr_to_ptr.need_result_type = True
 
     def op_gc__collect(self):
-        import gc
-        gc.collect()
+        self.heap.collect()
 
     def op_gc_free(self, addr):
         # what can you do?
@@ -1030,7 +1015,7 @@
         checkinst(inst)
         assert isinstance(name, str)
         FIELDTYPE = lltype.typeOf(inst)._field_type(name)
-        if FIELDTYPE != lltype.Void:
+        if FIELDTYPE is not lltype.Void:
             setattr(inst, name, value)
 
     def op_oogetfield(self, inst, name):

Modified: pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py
==============================================================================
--- pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py	(original)
+++ pypy/branch/kill-keepalives-again/pypy/rpython/lltypesystem/llheap.py	Sun Oct  7 13:42:44 2007
@@ -4,3 +4,7 @@
 from pypy.rpython.lltypesystem.llmemory import raw_malloc, raw_free
 from pypy.rpython.lltypesystem.llmemory import raw_memclear, raw_memcopy
 from pypy.rpython.lltypesystem.llmemory import raw_malloc_usage
+
+setfield = setattr
+from operator import setitem as setarrayitem
+from gc import collect



More information about the Pypy-commit mailing list