[pypy-svn] pypy commit e407bdf735c5: Progress on out-of-line guards. Use weakref for storing affected codes

Bitbucket commits-noreply at bitbucket.org
Mon Dec 13 18:55:03 CET 2010


# HG changeset patch -- Bitbucket.org
# Project pypy
# URL http://bitbucket.org/pypy/pypy/overview
# User Maciej Fijalkowski <fijall at gmail.com>
# Date 1292260525 0
# Node ID e407bdf735c5d1d48f6aef319f0822b0dc8a1e0a
# Parent  1325866a95fd9e1636d13bc24b292a7e94eefa71
Progress on out-of-line guards. Use weakref for storing affected codes
and cheat (horribly) to pretend that LoopToken is a low-level pointer

--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -725,6 +725,20 @@ class LoopToken(AbstractDescr):
     was compiled; but the LoopDescr remains alive and points to the
     generated assembler.
     """
+
+    _TYPE = lltype.Ptr(lltype.GcStruct('dummy struct for tests'))
+
+    def _normalizedcontainer(self):
+        return self
+
+    def _getobj(self, check=True):
+        return self
+    _as_ptr = _getobj
+    _obj0 = None
+    _obj = property(_getobj)
+    def _was_freed(self):
+        return False
+    
     terminating = False # see TerminatingLoopToken in compile.py
     outermost_jitdriver_sd = None
     # specnodes = ...

--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -490,6 +490,13 @@ class LLtypeCPU(BaseCPU):
 
     def get_invalidate_asm(self, TP, fieldname):
         def invalidate_asm(arg, fieldname):
+            prev = getattr(arg, fieldname)
+            next = prev
+            while next:
+                prev = next
+                x = llmemory.weakref_deref(history.LoopToken._TYPE,
+                                           prev.address)
+                next = next.next
             XXX # write me
         return invalidate_asm
 

--- a/pypy/rpython/lltypesystem/rclass.py
+++ b/pypy/rpython/lltypesystem/rclass.py
@@ -87,7 +87,7 @@ LLFLAVOR = {'gc'   : 'gc',
 # a linked-list of assembler codes to invalidate in case jit_invariant_fields
 # are modified
 ASMCODE = lltype.GcForwardReference()
-ASMCODE.become(GcStruct('asmcode', ('address', llmemory.GCREF),
+ASMCODE.become(GcStruct('asmcode', ('address', llmemory.WeakRefPtr),
                         ('next', lltype.Ptr(ASMCODE))))
 
 def cast_vtable_to_typeptr(vtable):

--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -605,7 +605,8 @@ class Transformer(object):
                         next = next.next
                     prev.next = new_asmcode
 
-            args_s = [lltype_to_annotation(llmemory.GCREF)] * 2
+            args_s = [lltype_to_annotation(llmemory.GCREF),
+                      lltype_to_annotation(llmemory.WeakRefPtr)]
             s_result = lltype_to_annotation(lltype.Void)
             mixlevelann = MixLevelHelperAnnotator(self.cpu.rtyper)
             c_appender = mixlevelann.constfunc(appender, args_s, s_result)

--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -1,6 +1,5 @@
 import py, os, sys
 from pypy.rpython.lltypesystem import lltype, llmemory, rclass
-from pypy.rpython.lltypesystem.rclass import ASMCODE
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.rlib.debug import debug_start, debug_stop, debug_print
@@ -2238,13 +2237,14 @@ class MetaInterp(object):
         op = op.copy_and_change(rop.CALL_ASSEMBLER, args=args, descr=token)
         self.history.operations.append(op)
 
-    def remember_jit_invariants(self, token):
-        lltoken = lltype.cast_opaque_ptr(llmemory.GCREF, token)
+    def remember_jit_invariants(self, loop):
+        lltoken_weakref = llmemory.weakref_create(loop.token)
         seen = {}
         for b_struct, c_appender in self.invariant_structs:
             if (b_struct, c_appender) not in seen:
-                heaptracker.int2adr(c_func.value).ptr(b_struct.value, lltoken)
-                seend[(b_struct, c_appender)] = None
+                heaptracker.int2adr(c_appender.value).ptr(b_struct.value,
+                                                          lltoken_weakref)
+                seen[(b_struct, c_appender)] = None
 
 # ____________________________________________________________



More information about the Pypy-commit mailing list