[pypy-svn] r74545 - in pypy/branch/blackhole-improvement/pypy/jit: backend backend/llgraph codewriter codewriter/test metainterp

arigo at codespeak.net arigo at codespeak.net
Tue May 18 18:38:25 CEST 2010


Author: arigo
Date: Tue May 18 18:38:23 2010
New Revision: 74545

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/heaptracker.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmstate.py
Log:
Add in heaptracker.py a bidirectional correspondance between vtable
pointers and Descrs.  Needed because for now the simplest seems to be to
have the NEW_WITH_VTABLE ResOperation contain just the vtable pointer
as a constant, but have the 'new_with_vtable' jitcode specify the
descr instead.



Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	Tue May 18 18:38:23 2010
@@ -21,13 +21,17 @@
     pass
 
 
+NO_VTABLE = lltype.nullptr(rclass.CLASSTYPE.TO)
+
 class Descr(history.AbstractDescr):
 
-    def __init__(self, ofs, typeinfo, extrainfo=None, name=None):
+    def __init__(self, ofs, typeinfo, extrainfo=None, name=None,
+                 vtable=NO_VTABLE):
         self.ofs = ofs
         self.typeinfo = typeinfo
         self.extrainfo = extrainfo
         self.name = name
+        self.vtable = vtable
 
     def get_return_type(self):
         return self.typeinfo
@@ -93,18 +97,18 @@
         llimpl._llinterp = LLInterpreter(self.rtyper)
         self._future_values = []
         self._descrs = {}
-        self.class_vtables_as_int = {}
 
     def _freeze_(self):
         assert self.translate_support_code
         return False
 
-    def getdescr(self, ofs, typeinfo='?', extrainfo=None, name=None):
-        key = (ofs, typeinfo, extrainfo, name)
+    def getdescr(self, ofs, typeinfo='?', extrainfo=None, name=None,
+                 vtable=NO_VTABLE):
+        key = (ofs, typeinfo, extrainfo, name, vtable._obj)
         try:
             return self._descrs[key]
         except KeyError:
-            descr = Descr(ofs, typeinfo, extrainfo, name)
+            descr = Descr(ofs, typeinfo, extrainfo, name, vtable)
             self._descrs[key] = descr
             return descr
 
@@ -258,17 +262,12 @@
 
     # ----------
 
-    def sizeof(self, S):
+    def sizeof(self, S, vtable=None):
         assert not isinstance(S, lltype.Ptr)
-        return self.getdescr(symbolic.get_size(S))
-
-    def sizevtableof(self, S, vtable):
-        assert isinstance(S, lltype.GcStruct)
-        descr = self.getdescr(symbolic.get_size(S))
-        vtable_adr = llmemory.cast_ptr_to_adr(vtable)
-        vtable_int = llmemory.cast_adr_to_int(vtable_adr)
-        self.class_vtables_as_int[descr] = vtable_int
-        return descr
+        if vtable is None:
+            return self.getdescr(symbolic.get_size(S))
+        else:
+            return self.getdescr(symbolic.get_size(S), vtable=vtable)
 
 
 class LLtypeCPU(BaseCPU):
@@ -396,10 +395,10 @@
         assert isinstance(sizedescr, Descr)
         return llimpl.do_new(sizedescr.ofs)
 
-    def bh_new_with_vtable(self, sizevtabledescr):
-        result = llimpl.do_new(sizevtabledescr.ofs)
-        llimpl.do_setfield_gc_int(result, self.fielddescrof_vtable.ofs,
-                                  self.class_vtables_as_int[sizevtabledescr])
+    def bh_new_with_vtable(self, sizedescr, vtable):
+        assert isinstance(sizedescr, Descr)
+        result = llimpl.do_new(sizedescr.ofs)
+        llimpl.do_setfield_gc_int(result, self.fielddescrof_vtable.ofs, vtable)
         return result
 
     def bh_classof(self, struct):

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	Tue May 18 18:38:23 2010
@@ -121,11 +121,7 @@
         raise NotImplementedError
 
     @staticmethod
-    def sizeof(S):
-        raise NotImplementedError
-
-    @staticmethod
-    def sizevtableof(S, vtable):
+    def sizeof(S, vtable=None):
         raise NotImplementedError
 
     @staticmethod
@@ -181,7 +177,7 @@
 
     def bh_new(self, sizedescr):
         raise NotImplementedError
-    def bh_new_with_vtable(self, sizevtabledescr):
+    def bh_new_with_vtable(self, sizedescr, vtable):
         raise NotImplementedError
     def bh_new_array(self, arraydescr, length):
         raise NotImplementedError

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	Tue May 18 18:38:23 2010
@@ -309,9 +309,8 @@
             elif isinstance(v, ListOfKind):
                 lst = [self.getcolor(x) for x in v]
                 v = ListOfKind(v.kind, lst)
-            elif isinstance(v, AbstractDescr):
-                pass
-            elif isinstance(v, IndirectCallTargets):
+            elif isinstance(v, (AbstractDescr,
+                                IndirectCallTargets)):
                 pass
             else:
                 raise NotImplementedError(type(v))

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/heaptracker.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/heaptracker.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/heaptracker.py	Tue May 18 18:38:23 2010
@@ -1,4 +1,5 @@
 from pypy.rpython.lltypesystem import lltype, rclass
+from pypy.rlib.objectmodel import we_are_translated
 
 
 def get_vtable_for_gcstruct(cpu, GCSTRUCT):
@@ -33,3 +34,37 @@
     testing_gcstruct2vtable[GCSTRUCT] = vtable
 
 testing_gcstruct2vtable = {}
+
+# ____________________________________________________________
+
+VTABLETYPE = rclass.CLASSTYPE
+
+def register_known_gctype(cpu, vtable, STRUCT):
+    # register the correspondance 'vtable' <-> 'STRUCT' in the cpu
+    sizedescr = cpu.sizeof(STRUCT)
+    if hasattr(sizedescr, '_corresponding_vtable'):
+        assert sizedescr._corresponding_vtable == vtable
+    else:
+        assert lltype.typeOf(vtable) == VTABLETYPE
+        if not hasattr(cpu, '_all_size_descrs'):
+            cpu._all_size_descrs = []
+        cpu._all_size_descrs.append(sizedescr)
+        sizedescr._corresponding_vtable = vtable
+
+def vtable2descr(cpu, vtable):
+    assert lltype.typeOf(vtable) == VTABLETYPE
+    if we_are_translated():
+        # Build the dict {vtable: sizedescr} at runtime.
+        # This is necessary because the 'vtables' are just pointers to
+        # static data, so they can't be used as keys in prebuilt dicts.
+        XXX
+    else:
+        for descr in cpu._all_size_descrs:
+            if descr._corresponding_vtable == vtable:
+                return descr
+        raise KeyError(vtable)
+
+def descr2vtable(cpu, descr):
+    from pypy.jit.metainterp import history
+    assert isinstance(descr, history.AbstractDescr)
+    return descr._corresponding_vtable

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Tue May 18 18:38:23 2010
@@ -278,18 +278,21 @@
             lst.append(jitcode)
         return self.handle_residual_call(op, [IndirectCallTargets(lst)])
 
-    def _prepare_builtin_call(self, op, oopspec_name, args, extra=None):
+    def _prepare_builtin_call(self, op, oopspec_name, args,
+                              extra=None, extrakey=None):
         argtypes = [v.concretetype for v in args]
         resulttype = op.result.concretetype
         c_func, TP = support.builtin_func_for_spec(self.cpu.rtyper,
                                                    oopspec_name, argtypes,
-                                                   resulttype, extra)
+                                                   resulttype, extra, extrakey)
         return SpaceOperation('direct_call', [c_func] + args, op.result)
 
-    def _do_builtin_call(self, op, oopspec_name=None, args=None, extra=None):
+    def _do_builtin_call(self, op, oopspec_name=None, args=None,
+                         extra=None, extrakey=None):
         if oopspec_name is None: oopspec_name = op.opname
         if args is None: args = op.args
-        op1 = self._prepare_builtin_call(op, oopspec_name, args, extra)
+        op1 = self._prepare_builtin_call(op, oopspec_name, args,
+                                         extra, extrakey)
         return self.rewrite_op_direct_call(op1)
 
     rewrite_op_int_floordiv_ovf_zer = _do_builtin_call
@@ -447,17 +450,15 @@
                 if hasattr(rtti._obj, 'destructor_funcptr'):
                     RESULT = lltype.Ptr(STRUCT)
                     assert RESULT == op.result.concretetype
-                    return self._do_builtin_call(op, 'alloc_with_del',
-                                                 [], extra = (RESULT, vtable))
-            # store the vtable as an address -- that's fine, because the
-            # GC doesn't need to follow them
-            #self.codewriter.register_known_gctype(vtable, STRUCT)
-            sizevtabledescr = self.cpu.sizevtableof(STRUCT, vtable)
-            return SpaceOperation('new_with_vtable', [sizevtabledescr],
-                                  op.result)
+                    return self._do_builtin_call(op, 'alloc_with_del', [],
+                                                 extra = (RESULT, vtable),
+                                                 extrakey = STRUCT)
+            heaptracker.register_known_gctype(self.cpu, vtable, STRUCT)
+            opname = 'new_with_vtable'
         else:
-            sizedescr = self.cpu.sizeof(STRUCT)
-            return SpaceOperation('new', [sizedescr], op.result)
+            opname = 'new'
+        sizedescr = self.cpu.sizeof(STRUCT)
+        return SpaceOperation(opname, [sizedescr], op.result)
 
     def rewrite_op_getinteriorarraysize(self, op):
         # only supports strings and unicodes

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py	Tue May 18 18:38:23 2010
@@ -400,8 +400,10 @@
     else:
         raise ValueError(op.opname)
 
-def builtin_func_for_spec(rtyper, oopspec_name, ll_args, ll_res, extra=None):
-    key = (oopspec_name, tuple(ll_args), ll_res, extra)
+def builtin_func_for_spec(rtyper, oopspec_name, ll_args, ll_res,
+                          extra=None, extrakey=None):
+    assert (extra is None) == (extrakey is None)
+    key = (oopspec_name, tuple(ll_args), ll_res, extrakey)
     try:
         return rtyper._builtin_func_for_spec_cache[key]
     except (KeyError, AttributeError):

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	Tue May 18 18:38:23 2010
@@ -17,10 +17,11 @@
         return ('calldescr', FUNC, ARGS, RESULT)
     def fielddescrof(self, STRUCT, name):
         return ('fielddescr', STRUCT, name)
-    def sizeof(self, STRUCT):
-        return ('sizedescr', STRUCT)
-    def sizevtableof(self, STRUCT, vtable):
-        return ('sizevtabledescr', STRUCT, vtable)
+    def sizeof(self, STRUCT, vtable=None):
+        if vtable is None:
+            return ('sizedescr', STRUCT)
+        else:
+            return ('sizedescr', STRUCT, vtable)
 
 class FakeLink:
     args = []
@@ -326,7 +327,7 @@
     assert op1.args == [('sizedescr', S)]
 
 def test_malloc_new_with_vtable():
-    class vtable: pass
+    vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     S = lltype.GcStruct('S', ('parent', rclass.OBJECT))
     heaptracker.set_testing_vtable_for_gcstruct(S, vtable, 'S')
     v = varoftype(lltype.Ptr(S))
@@ -334,10 +335,10 @@
                                    Constant({'flavor': 'gc'}, lltype.Void)], v)
     op1 = Transformer(FakeCPU()).rewrite_operation(op)
     assert op1.opname == 'new_with_vtable'
-    assert op1.args == [('sizevtabledescr', S, vtable)]
+    assert op1.args == [('sizedescr', S, vtable)]
 
 def test_malloc_new_with_destructor():
-    class vtable: pass
+    vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     S = lltype.GcStruct('S', ('parent', rclass.OBJECT))
     DESTRUCTOR = lltype.FuncType([lltype.Ptr(S)], lltype.Void)
     destructor = lltype.functionptr(DESTRUCTOR, 'destructor')

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	Tue May 18 18:38:23 2010
@@ -7,6 +7,7 @@
 from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rpython.llinterp import LLException
 from pypy.jit.codewriter.jitcode import JitCode, SwitchDictDescr
+from pypy.jit.codewriter import heaptracker
 
 
 def arguments(*argtypes, **kwds):
@@ -56,8 +57,9 @@
 
     def __init__(self, codewriter, metainterp_sd=None):
         self.cpu = codewriter.cpu
-        self.setup_insns(codewriter.assembler.insns)
-        self.setup_descrs(codewriter.assembler.descrs)
+        asm = codewriter.assembler
+        self.setup_insns(asm.insns)
+        self.setup_descrs(asm.descrs)
         self.metainterp_sd = metainterp_sd
         self._freeze_()
 
@@ -167,7 +169,7 @@
                 args = args + (value,)
 
             if verbose and not we_are_translated():
-                print '\t', name, list(args),
+                print '\tbh:', name, list(args),
 
             # call the method bhimpl_xxx()
             try:
@@ -902,7 +904,9 @@
 
     @arguments("cpu", "d", returns="r")
     def bhimpl_new_with_vtable(cpu, descr):
-        return cpu.bh_new_with_vtable(descr)
+        vtable = heaptracker.descr2vtable(cpu, descr)
+        vtable = llmemory.cast_adr_to_int(llmemory.cast_ptr_to_adr(vtable))
+        return cpu.bh_new_with_vtable(descr, vtable)
 
     @arguments("cpu", "r", returns="i")
     def bhimpl_guard_class(cpu, struct):

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	Tue May 18 18:38:23 2010
@@ -2,13 +2,13 @@
 """
 
 import py
-from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.rpython.ootypesystem import ootype
 from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rlib.rarithmetic import ovfcheck, r_uint, intmask
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat, check_descr
-from pypy.jit.metainterp.history import INT, REF, FLOAT
+from pypy.jit.metainterp.history import INT, REF, FLOAT, AbstractDescr
 from pypy.jit.metainterp import resoperation
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp.blackhole import BlackholeInterpreter, NULL
@@ -148,6 +148,18 @@
     else:
         cpu.bh_setfield_raw_i(struct, fielddescr, itembox.getint())
 
+def exec_new_with_vtable(cpu, clsbox):
+    from pypy.jit.codewriter import heaptracker
+    vtable = clsbox.getint()
+    vtableadr = llmemory.cast_int_to_adr(vtable)
+    vtableptr = llmemory.cast_adr_to_ptr(vtableadr, heaptracker.VTABLETYPE)
+    descr = heaptracker.vtable2descr(cpu, vtableptr)
+    return cpu.bh_new_with_vtable(descr, vtable)
+
+def do_new_with_vtable(metainterp, clsbox):
+    cpu = metainterp.cpu
+    return BoxPtr(exec_new_with_vtable(cpu, clsbox))
+
 def do_int_add_ovf(metainterp, box1, box2):
     a = box1.getint()
     b = box2.getint()
@@ -279,6 +291,7 @@
                 value = metainterp.cpu
             elif argtype == 'd':
                 value = argboxes[-1]
+                assert isinstance(value, AbstractDescr)
                 argboxes = argboxes[:-1]
             else:
                 argbox = argboxes[0]

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Tue May 18 18:38:23 2010
@@ -313,8 +313,13 @@
         return self.execute_with_descr(rop.NEW, sizedescr)
 
     @arguments("descr")
-    def opimpl_new_with_vtable(self, sizevtabledescr):
-        return self.execute_with_descr(rop.NEW_WITH_VTABLE, sizevtabledescr)
+    def opimpl_new_with_vtable(self, sizedescr):
+        from pypy.jit.codewriter import heaptracker
+        from pypy.jit.metainterp.warmstate import wrap
+        cpu = self.metainterp.cpu
+        cls = heaptracker.descr2vtable(cpu, sizedescr)
+        clsbox = wrap(cpu, cls, in_const_box=True)
+        return self.execute(rop.NEW_WITH_VTABLE, clsbox)
 
     @FixME  #arguments("box")
     def opimpl_runtimenew(self, classbox):
@@ -2117,7 +2122,7 @@
         self.pc = position + num_return_args
         #
         if not we_are_translated():
-            print '\tjitcode: %s(%s)' % (name, ', '.join(map(repr, args))),
+            print '\tpyjitpl: %s(%s)' % (name, ', '.join(map(repr, args))),
             try:
                 resultbox = unboundmethod(self, *args)
             except Exception, e:

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py	Tue May 18 18:38:23 2010
@@ -207,7 +207,7 @@
     'GETFIELD_GC/1d',
     'GETFIELD_RAW/1d',
     'NEW/0d',
-    'NEW_WITH_VTABLE/0d',
+    'NEW_WITH_VTABLE/1',
     'NEW_ARRAY/1d',
     'FORCE_TOKEN/0',
     'VIRTUAL_REF/2',

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py	Tue May 18 18:38:23 2010
@@ -388,12 +388,10 @@
 
 
 class AbstractVirtualInfo(object):
-    def allocate(self, metainterp):
-        raise NotImplementedError
+    #def allocate(self, metainterp):
+    #    raise NotImplementedError
     #def setfields(self, decoder, struct):
     #    raise NotImplementedError
-    def bh_allocate(self, cpu):
-        raise NotImplementedError
     def equals(self, fieldnums):
         return tagged_list_eq(self.fieldnums, fieldnums)
     def set_content(self, fieldnums):
@@ -428,9 +426,9 @@
         AbstractVirtualStructInfo.__init__(self, fielddescrs)
         self.known_class = known_class
 
-    def allocate(self, metainterp):
-        return metainterp.execute_and_record(rop.NEW_WITH_VTABLE,
-                                             None, self.known_class)
+    def allocate(self, cpu):
+        from pypy.jit.metainterp.executor import exec_new_with_vtable
+        return exec_new_with_vtable(cpu, self.known_class)
 
     def debug_prints(self):
         debug_print("\tvirtualinfo", self.known_class.repr_rpython())
@@ -617,7 +615,7 @@
             for i in range(len(virtuals)):
                 vinfo = virtuals[i]
                 if vinfo is not None:
-                    self.virtuals[i] = vinfo.bh_allocate(self.cpu)
+                    self.virtuals[i] = vinfo.allocate(self.cpu)
             for i in range(len(virtuals)):
                 vinfo = virtuals[i]
                 if vinfo is not None:
@@ -632,13 +630,13 @@
     def setfield(self, descr, struct, fieldnum):
         if descr.is_pointer_field():
             newvalue = self._decode_ref(fieldnum)
-            self.cpu.bh_setfield_gc_r(struct, descr, newfield)
+            self.cpu.bh_setfield_gc_r(struct, descr, newvalue)
         elif descr.is_float_field():
             newvalue = self._decode_float(fieldnum)
-            self.cpu.bh_setfield_gc_f(struct, descr, newfield)
+            self.cpu.bh_setfield_gc_f(struct, descr, newvalue)
         else:
             newvalue = self._decode_int(fieldnum)
-            self.cpu.bh_setfield_gc_i(struct, descr, newfield)
+            self.cpu.bh_setfield_gc_i(struct, descr, newvalue)
 
     def setarrayitem(self, arraydescr, array, index, fieldnum):
         if arraydescr.is_array_of_pointers():
@@ -671,12 +669,12 @@
         num, tag = untag(tagged)
         if tag == TAGCONST:
             if tagged_eq(tagged, NULLREF):
-                return history.REF
+                return REF
             return self.consts[num].type
         elif tag == TAGVIRTUAL:
-            return history.REF
+            return REF
         elif tag == TAGINT:
-            return history.INT
+            return INT
         else:
             assert tag == TAGBOX
             return self.cpu.get_latest_value_kind(num)

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmstate.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmstate.py	Tue May 18 18:38:23 2010
@@ -54,7 +54,7 @@
                 return history.BoxPtr(value)
         else:
             adr = llmemory.cast_ptr_to_adr(value)
-            value = cpu.cast_adr_to_int(adr)
+            value = llmemory.cast_adr_to_int(adr)
             # fall through to the end of the function
     elif isinstance(lltype.typeOf(value), ootype.OOType):
         value = ootype.cast_to_object(value)



More information about the Pypy-commit mailing list