[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