[pypy-svn] r36274 - in pypy/dist/pypy/jit/timeshifter: . test
pedronis at codespeak.net
pedronis at codespeak.net
Mon Jan 8 15:28:43 CET 2007
Author: pedronis
Date: Mon Jan 8 15:27:57 2007
New Revision: 36274
Modified:
pypy/dist/pypy/jit/timeshifter/hrtyper.py
pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
Log:
(arre, pedronis)
make the first virtualizable struct test pass. We really need to use a different subclass of VirtualStruct
that allows to pass around the original virtualizable struct too.
Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py (original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py Mon Jan 8 15:27:57 2007
@@ -208,18 +208,18 @@
annhelper = self.annhelper
rgenop = self.RGenOp()
- argcolors = []
+ args_specification = []
portal_args_s = []
for v in portalgraph.getargs()[1:]:
r = self.bindingrepr(v)
if isinstance(r, GreenRepr):
- color = "green"
+ arg_spec = "green", None, None
portal_args_s.append(annmodel.lltype_to_annotation(
r.lowleveltype))
else:
- color = "red"
+ arg_spec = "red", r.residual_args_collector(), r.arg_redbox_maker()
portal_args_s.append(self.s_RedBox)
- argcolors.append(color)
+ args_specification.append(arg_spec)
tsportalgraph = portalgraph
# patch the shared portal pointer
@@ -235,7 +235,7 @@
RESTYPE = FUNC.RESULT
reskind = rgenop.kindToken(RESTYPE)
boxbuilder = rvalue.ll_redboxbuilder(RESTYPE)
- argcolors = unrolling_iterable(argcolors)
+ args_specification = unrolling_iterable(args_specification)
fresh_jitstate = self.ll_fresh_jitstate
finish_jitstate = self.ll_finish_jitstate
@@ -249,7 +249,7 @@
def readportal(*args):
i = 0
key = ()
- for color in argcolors:
+ for color, _, _ in args_specification:
if color == "green":
x = args[i]
if isinstance(lltype.typeOf(x), lltype.Ptr):
@@ -272,14 +272,14 @@
i = 0
key = ()
residualargs = ()
- for color in argcolors:
+ for color, collect_residual_args, _ in args_specification:
if color == "green":
x = args[i]
if isinstance(lltype.typeOf(x), lltype.Ptr):
x = llmemory.cast_ptr_to_adr(x)
key = key + (x,)
else:
- residualargs = residualargs + (args[i],)
+ residualargs = residualargs + collect_residual_args(args[i])
i = i + 1
cache = state.cache
try:
@@ -291,7 +291,7 @@
"generated")
cache[key] = gv_generated
i = 0
- for color in argcolors:
+ for color, _, make_arg_redbox in args_specification:
if color == "green":
llvalue = args[0]
args = args[1:]
@@ -299,12 +299,8 @@
else:
llvalue = args[0]
args = args[1:]
- TYPE = lltype.typeOf(llvalue)
- kind = rgenop.kindToken(TYPE)
- boxcls = rvalue.ll_redboxcls(TYPE)
- gv_arg = inputargs_gv[i]
- box = boxcls(kind, gv_arg)
- i += 1
+ box = make_arg_redbox(inputargs_gv, i)
+ i += make_arg_redbox.consumes
portal_ts_args += (box,)
top_jitstate = fresh_jitstate(builder)
@@ -335,16 +331,16 @@
s_funcptrlist)
TYPES = [v.concretetype for v in origportalgraph.getargs()]
- argcolorandtypes = unrolling_iterable(zip(argcolors,
+ argspecandtypes = unrolling_iterable(zip(args_specification,
TYPES))
fetch_global_excdata = self.fetch_global_excdata
- def portalreentry(jitstate, *args):
+ def portalreentry(jitstate, *args): # xxx
i = 0
key = ()
curbuilder = jitstate.curbuilder
args_gv = []
- for color in argcolors:
+ for color, _, _ in args_specification:
if color == "green":
x = args[i]
if isinstance(lltype.typeOf(x), lltype.Ptr):
@@ -364,7 +360,7 @@
"generated")
cache[key] = gv_generated
i = 0
- for color, T in argcolorandtypes:
+ for (color, _, _), T in argspecandtypes:
if color == "green":
llvalue = args[0]
args = args[1:]
@@ -451,8 +447,11 @@
ha = self.annotator
args_hs, hs_res = self.get_sig_hs(ha.translator.graphs[0])
RESTYPE = originalconcretetype(hs_res)
- ARGS = [originalconcretetype(hs_arg) for hs_arg in args_hs
- if not hs_arg.is_green()]
+ args_r = [self.getrepr(hs_arg) for hs_arg in args_hs
+ if not hs_arg.is_green()]
+ ARGS = []
+ for r_arg in args_r:
+ ARGS += r_arg.residual_argtypes()
return lltype.FuncType(ARGS, RESTYPE)
def make_new_lloplist(self, block):
@@ -671,8 +670,16 @@
[ts.s_JITState],
[v_jitstate ],
ts.s_RedBox)
- # non virtual case
+ # virtualizable access read
PTRTYPE = originalconcretetype(hop.args_s[0])
+ if PTRTYPE.TO._hints.get('virtualizable', False):
+ # xxx optimisation: do this folding already at hint-annotation time!
+ if hop.args_v[1].value == 'access':
+ ACCESSPTR = PTRTYPE.TO.access
+ access_repr = self.getredrepr(ACCESSPTR)
+ return hop.inputconst(access_repr, lltype.nullptr(ACCESSPTR.TO))
+
+ # non virtual case
v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
green_void_repr)
v_argbox = hop.llops.as_ptrredbox(v_argbox)
@@ -1441,6 +1448,23 @@
self.original_concretetype = original_concretetype
self.lowleveltype = hrtyper.r_RedBox.lowleveltype
self.hrtyper = hrtyper
+ self.build_portal_arg_helpers()
+
+ def build_portal_arg_helpers(self):
+ def collect_residual_args(v):
+ return (v,)
+ self.collect_residual_args = collect_residual_args
+
+ TYPE = self.original_concretetype
+ kind = self.hrtyper.RGenOp.kindToken(TYPE)
+ boxcls = rvalue.ll_redboxcls(TYPE)
+
+ def make_arg_redbox(inputargs_gv, i):
+ gv_arg = inputargs_gv[i]
+ box = boxcls(kind, gv_arg)
+ return box
+ self.make_arg_redbox = make_arg_redbox
+ make_arg_redbox.consumes = 1
## def get_genop_var(self, v, llops):
## ts = self.hrtyper
@@ -1459,19 +1483,78 @@
def residual_values(self, ll_value):
return [ll_value]
+ def residual_argtypes(self):
+ return [self.original_concretetype]
+
+ def residual_args_collector(self):
+ return self.collect_residual_args
+
+ def arg_redbox_maker(self):
+ return self.make_arg_redbox
class RedStructRepr(RedRepr):
typedesc = None
- def create(self, hop):
- ts = self.hrtyper
+ def build_portal_arg_helpers(self):
+ T = self.original_concretetype.TO
+ if not T._hints.get('virtualizable', False):
+ RedRepr.build_portal_arg_helpers(self)
+ return
+
+ names = unrolling_iterable([name for name in T._names if name != 'access'])
+ def collect_residual_args(v):
+ t = ()
+ for name in names:
+ t = t + (getattr(v, name),) # xxx need to use access ?
+ return t
+ self.collect_residual_args = collect_residual_args
+
+ TYPE = self.original_concretetype
+ kind = self.hrtyper.RGenOp.kindToken(TYPE)
+ boxcls = rvalue.ll_redboxcls(TYPE)
+
+ typedesc = self.gettypedesc()
+
+ def make_arg_redbox(inputargs_gv, i):
+ box = typedesc.factory()
+ j = 1
+ content = box.content
+ assert isinstance(content, rcontainer.VirtualStruct)
+ content_boxes = content.content_boxes
+ for name in names:
+ content_boxes[j].genvar = inputargs_gv[i]
+ j = j + 1
+ i += 1
+ return box
+ self.make_arg_redbox = make_arg_redbox
+ make_arg_redbox.consumes = len(T._names)-1
+
+ def gettypedesc(self):
if self.typedesc is None:
+ ts = self.hrtyper
T = self.original_concretetype.TO
self.typedesc = rcontainer.StructTypeDesc(ts.RGenOp, T)
- v_ptrbox = hop.llops.genmixlevelhelpercall(self.typedesc.ll_factory,
+ return self.typedesc
+
+ def create(self, hop):
+ ts = self.hrtyper
+ typedesc = self.gettypedesc()
+ v_ptrbox = hop.llops.genmixlevelhelpercall(typedesc.ll_factory,
[], [], ts.s_PtrRedBox)
return hop.llops.as_redbox(v_ptrbox)
+ def residual_argtypes(self):
+ T = self.original_concretetype.TO
+ if T._hints.get('virtualizable', False):
+ argtypes = []
+ getredrepr = self.hrtyper.getredrepr
+ for name in T._names:
+ if name == 'access':
+ continue
+ FIELDTYPE = getattr(T, name)
+ argtypes += getredrepr(FIELDTYPE).residual_argtypes()
+ return argtypes
+ return [self.original_concretetype]
##class VoidRedRepr(Repr):
## def __init__(self, hrtyper):
Modified: pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py (original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py Mon Jan 8 15:27:57 2007
@@ -6,7 +6,6 @@
class TestVirtualizable(PortalTest):
def test_simple_explicit(self):
- py.test.skip("WIP")
XY = lltype.GcForwardReference()
GETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XY)], lltype.Signed))
SETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XY), lltype.Signed],
More information about the pypy-svn
mailing list