[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