[pypy-svn] r36475 - in pypy/dist/pypy/jit/timeshifter: . test
pedronis at codespeak.net
pedronis at codespeak.net
Thu Jan 11 13:53:49 CET 2007
Author: pedronis
Date: Thu Jan 11 13:53:46 2007
New Revision: 36475
Modified:
pypy/dist/pypy/jit/timeshifter/hrtyper.py
pypy/dist/pypy/jit/timeshifter/oop.py
pypy/dist/pypy/jit/timeshifter/rcontainer.py
pypy/dist/pypy/jit/timeshifter/rtimeshift.py
pypy/dist/pypy/jit/timeshifter/rvalue.py
pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
pypy/dist/pypy/jit/timeshifter/vdict.py
pypy/dist/pypy/jit/timeshifter/vlist.py
Log:
(arre, pedronis)
- make escaping of virtualizable (getgenvar) schedule them for store_back with test
- more tests that already work about structure pointers inside a virtualizable struct
Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py (original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py Thu Jan 11 13:53:46 2007
@@ -125,8 +125,8 @@
if not ll_etype:
return # we known there is no exception set
evaluebox = jitstate.exc_value_box
- gv_etype = etypebox .getgenvar(builder)
- gv_evalue = evaluebox.getgenvar(builder)
+ gv_etype = etypebox .getgenvar(jitstate)
+ gv_evalue = evaluebox.getgenvar(jitstate)
builder.genop_call(tok_raise,
gv_rpyexc_raise, [gv_etype, gv_evalue])
self.store_global_excdata = store_global_excdata
@@ -140,13 +140,13 @@
def ll_finish_jitstate(jitstate, graphsigtoken):
assert jitstate.resuming is None
returnbox = rtimeshift.getreturnbox(jitstate)
- gv_ret = returnbox.getgenvar(jitstate.curbuilder)
+ gv_ret = returnbox.getgenvar(jitstate)
builder = jitstate.curbuilder
for virtualizable_box in jitstate.virtualizables:
assert isinstance(virtualizable_box, rvalue.PtrRedBox)
content = virtualizable_box.content
assert isinstance(content, rcontainer.VirtualizableStruct)
- content.store_back(builder)
+ content.store_back(jitstate)
store_global_excdata(jitstate)
jitstate.curbuilder.finish_and_return(graphsigtoken, gv_ret)
self.ll_finish_jitstate = ll_finish_jitstate
@@ -354,7 +354,7 @@
key = key + (x,)
else:
box = args[i]
- args_gv.append(box.getgenvar(curbuilder))
+ args_gv.append(box.getgenvar(jitstate))
i = i + 1
sigtoken = rgenop.sigToken(FUNC)
cache = state.cache
Modified: pypy/dist/pypy/jit/timeshifter/oop.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/oop.py (original)
+++ pypy/dist/pypy/jit/timeshifter/oop.py Thu Jan 11 13:53:46 2007
@@ -118,7 +118,7 @@
args_gv = []
fold = deepfrozen
for argsrc in self.residualargsources:
- gv_arg = argboxes[argsrc].getgenvar(builder)
+ gv_arg = argboxes[argsrc].getgenvar(jitstate)
args_gv.append(gv_arg)
fold &= gv_arg.is_const
if fold:
Modified: pypy/dist/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rcontainer.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rcontainer.py Thu Jan 11 13:53:46 2007
@@ -85,8 +85,9 @@
self.null = self.PTRTYPE._defl()
self.gv_null = RGenOp.constPrebuiltGlobal(self.null)
- if TYPE._hints.get('virtualizable', False):
- self.__class__ = VirtualizableStructTypeDesc
+
+ self.virtualizable = TYPE._hints.get('virtualizable', False)
+ if self.virtualizable:
self.VStructCls = VirtualizableStruct
else:
self.VStructCls = VirtualStruct
@@ -108,9 +109,13 @@
return self.fielddesc_by_name[name]
def factory(self):
- vstruct = VirtualStruct(self)
+ vstruct = self.VStructCls(self)
vstruct.content_boxes = [desc.redboxcls(desc.kind, desc.gv_default)
for desc in self.fielddescs]
+ if self.virtualizable:
+ outsidebox = rvalue.PtrRedBox(self.innermostdesc.ptrkind,
+ self.gv_null)
+ vstruct.content_boxes.append(outsidebox)
box = rvalue.PtrRedBox(self.innermostdesc.ptrkind)
box.content = vstruct
vstruct.ownbox = box
@@ -125,20 +130,6 @@
def compact_repr(self): # goes in ll helper names
return "Desc_%s" % (self.TYPE._short_name(),)
-
-class VirtualizableStructTypeDesc(StructTypeDesc):
-
- def factory(self):
- vstruct = VirtualizableStruct(self)
- vstruct.content_boxes = [desc.redboxcls(desc.kind, desc.gv_default)
- for desc in self.fielddescs]
- outsidebox = rvalue.PtrRedBox(self.innermostdesc.ptrkind,
- self.gv_null)
- vstruct.content_boxes.append(outsidebox)
- box = rvalue.PtrRedBox(self.innermostdesc.ptrkind)
- box.content = vstruct
- vstruct.ownbox = box
- return box
# XXX basic field descs for now
class FieldDesc(object):
@@ -176,8 +167,8 @@
gv_item = builder.genop_getfield(self.fieldtoken, genvar)
return self.redboxcls(self.kind, gv_item)
- def generate_set(self, builder, genvar, box):
- builder.genop_setfield(self.fieldtoken, genvar, box.getgenvar(builder))
+ def generate_set(self, builder, genvar, gv_value):
+ builder.genop_setfield(self.fieldtoken, genvar, gv_value)
def generate_getsubstruct(self, builder, genvar):
gv_sub = builder.genop_getsubstruct(self.fieldtoken, genvar)
@@ -271,9 +262,10 @@
for box in self.content_boxes:
box.enter_block(incoming, memo)
- def force_runtime_container(self, builder):
+ def force_runtime_container(self, jitstate):
typedesc = self.typedesc
assert typedesc is not None
+ builder = jitstate.curbuilder
boxes = self.content_boxes
self.content_boxes = None
if typedesc.materialize is not None:
@@ -295,7 +287,7 @@
for i in range(len(fielddescs)):
fielddesc = fielddescs[i]
box = boxes[i]
- fielddesc.generate_set(builder, genvar, box)
+ fielddesc.generate_set(builder, genvar, box.getgenvar(jitstate))
def freeze(self, memo):
contmemo = memo.containers
@@ -338,27 +330,29 @@
class VirtualizableStruct(VirtualStruct):
- def force_runtime_container(self, builder):
+ def force_runtime_container(self, jitstate):
assert 0
- def getgenvar(self, builder):
+ def getgenvar(self, jitstate):
typedesc = self.typedesc
assert typedesc is not None
+ builder = jitstate.curbuilder
gv_outside = self.content_boxes[-1].genvar
if gv_outside is typedesc.gv_null:
gv_outside = builder.genop_malloc_fixedsize(typedesc.alloctoken)
self.content_boxes[-1].genvar = gv_outside
- # xxx jitstate please
+ jitstate.add_virtualizable(self.ownbox)
return gv_outside
- def store_back(self, builder):
+ def store_back(self, jitstate):
fielddescs = self.typedesc.fielddescs
boxes = self.content_boxes
gv_outside = boxes[-1].genvar
for i in range(1, len(fielddescs)):
fielddesc = fielddescs[i]
box = boxes[i]
- fielddesc.generate_set(builder, gv_outside, box)
+ fielddesc.generate_set(jitstate.curbuilder, gv_outside,
+ box.getgenvar(jitstate))
# ____________________________________________________________
Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Thu Jan 11 13:53:46 2007
@@ -74,7 +74,7 @@
arg = rvalue.ll_getvalue(argbox, ARG0)
res = opdesc.llop(RESULT, arg)
return rvalue.ll_fromvalue(jitstate, res)
- gv_arg = argbox.getgenvar(jitstate.curbuilder)
+ gv_arg = argbox.getgenvar(jitstate)
genvar = jitstate.curbuilder.genop1(opdesc.opname, gv_arg)
return opdesc.redboxcls(opdesc.result_kind, genvar)
@@ -89,13 +89,13 @@
arg1 = rvalue.ll_getvalue(argbox1, ARG1)
res = opdesc.llop(RESULT, arg0, arg1)
return rvalue.ll_fromvalue(jitstate, res)
- gv_arg0 = argbox0.getgenvar(jitstate.curbuilder)
- gv_arg1 = argbox1.getgenvar(jitstate.curbuilder)
+ gv_arg0 = argbox0.getgenvar(jitstate)
+ gv_arg1 = argbox1.getgenvar(jitstate)
genvar = jitstate.curbuilder.genop2(opdesc.opname, gv_arg0, gv_arg1)
return opdesc.redboxcls(opdesc.result_kind, genvar)
def ll_genmalloc_varsize(jitstate, contdesc, sizebox):
- gv_size = sizebox.getgenvar(jitstate.curbuilder)
+ gv_size = sizebox.getgenvar(jitstate)
alloctoken = contdesc.varsizealloctoken
genvar = jitstate.curbuilder.genop_malloc_varsize(alloctoken, gv_size)
return rvalue.PtrRedBox(contdesc.ptrkind, genvar)
@@ -125,8 +125,8 @@
return rvalue.ll_fromvalue(jitstate, res)
genvar = jitstate.curbuilder.genop_getarrayitem(
fielddesc.arraytoken,
- argbox.getgenvar(jitstate.curbuilder),
- indexbox.getgenvar(jitstate.curbuilder))
+ argbox.getgenvar(jitstate),
+ indexbox.getgenvar(jitstate))
return fielddesc.redboxcls(fielddesc.kind, genvar)
@@ -137,8 +137,8 @@
return rvalue.ll_fromvalue(jitstate, res)
genvar = jitstate.curbuilder.genop_getarraysubstruct(
fielddesc.arraytoken,
- argbox.getgenvar(jitstate.curbuilder),
- indexbox.getgenvar(jitstate.curbuilder))
+ argbox.getgenvar(jitstate),
+ indexbox.getgenvar(jitstate))
return fielddesc.redboxcls(fielddesc.kind, genvar)
@@ -146,9 +146,9 @@
def ll_gensetarrayitem(jitstate, fielddesc, destbox, indexbox, valuebox):
genvar = jitstate.curbuilder.genop_setarrayitem(
fielddesc.arraytoken,
- destbox.getgenvar(jitstate.curbuilder),
- indexbox.getgenvar(jitstate.curbuilder),
- valuebox.getgenvar(jitstate.curbuilder)
+ destbox.getgenvar(jitstate),
+ indexbox.getgenvar(jitstate),
+ valuebox.getgenvar(jitstate)
)
return fielddesc.redboxcls(fielddesc.kind, genvar)
@@ -160,7 +160,7 @@
return rvalue.ll_fromvalue(jitstate, res)
genvar = jitstate.curbuilder.genop_getarraysize(
fielddesc.arraytoken,
- argbox.getgenvar(jitstate.curbuilder))
+ argbox.getgenvar(jitstate))
return rvalue.IntRedBox(fielddesc.indexkind, genvar)
def ll_genptrnonzero(jitstate, argbox, reverse):
@@ -169,7 +169,7 @@
return rvalue.ll_fromvalue(jitstate, bool(addr) ^ reverse)
builder = jitstate.curbuilder
if argbox.content is None:
- gv_addr = argbox.getgenvar(builder)
+ gv_addr = argbox.getgenvar(jitstate)
if reverse:
gv_res = builder.genop1("ptr_iszero", gv_addr)
else:
@@ -187,8 +187,8 @@
addr0 = rvalue.ll_getvalue(argbox0, llmemory.Address)
addr1 = rvalue.ll_getvalue(argbox1, llmemory.Address)
return rvalue.ll_fromvalue(jitstate, (addr0 == addr1) ^ reverse)
- gv_addr0 = argbox0.getgenvar(builder)
- gv_addr1 = argbox1.getgenvar(builder)
+ gv_addr0 = argbox0.getgenvar(jitstate)
+ gv_addr1 = argbox1.getgenvar(jitstate)
if reverse:
gv_res = builder.genop2("ptr_ne", gv_addr0, gv_addr1)
else:
@@ -260,7 +260,7 @@
if match:
linkargs = []
for box in outgoingvarboxes:
- linkargs.append(box.getgenvar(jitstate.curbuilder))
+ linkargs.append(box.getgenvar(jitstate))
jitstate.curbuilder.finish_and_goto(linkargs, oldblock)
return True # finished
# A mergable blook found
@@ -270,7 +270,7 @@
cleanup_partial_data(memo.partialdatamatch)
replace_memo = rvalue.copy_memo()
for box in outgoingvarboxes:
- box.forcevar(jitstate.curbuilder, replace_memo)
+ box.forcevar(jitstate, replace_memo)
if replace_memo.boxes:
jitstate.replace(replace_memo)
start_new_block(states_dic, jitstate, key, global_resumer, index=i)
@@ -317,7 +317,7 @@
jitstate.resumepoint = resumepoint
def split(jitstate, switchredbox, resumepoint, *greens_gv):
- exitgvar = switchredbox.getgenvar(jitstate.curbuilder)
+ exitgvar = switchredbox.getgenvar(jitstate)
if exitgvar.is_const:
return exitgvar.revealconst(lltype.Bool)
else:
@@ -446,7 +446,7 @@
dispatchqueue.return_chain = jitstate
##def ll_gvar_from_redbox(jitstate, redbox):
-## return redbox.getgenvar(jitstate.curbuilder)
+## return redbox.getgenvar(jitstate)
##def ll_gvar_from_constant(jitstate, ll_value):
## return jitstate.curbuilder.rgenop.genconst(ll_value)
@@ -464,9 +464,9 @@
def ll_gen_residual_call(jitstate, calldesc, funcbox):
builder = jitstate.curbuilder
- gv_funcbox = funcbox.getgenvar(builder)
+ gv_funcbox = funcbox.getgenvar(jitstate)
argboxes = jitstate.frame.local_boxes
- args_gv = [argbox.getgenvar(builder) for argbox in argboxes]
+ args_gv = [argbox.getgenvar(jitstate) for argbox in argboxes]
gv_result = builder.genop_call(calldesc.sigtoken, gv_funcbox, args_gv)
return calldesc.redboxbuilder(calldesc.result_kind, gv_result)
@@ -621,7 +621,7 @@
def ll_promote(jitstate, promotebox, promotiondesc):
builder = jitstate.curbuilder
- gv_switchvar = promotebox.getgenvar(builder)
+ gv_switchvar = promotebox.getgenvar(jitstate)
if gv_switchvar.is_const:
return False
else:
@@ -645,7 +645,7 @@
[gv_pm, gv_switchvar])
linkargs = []
for box in incoming:
- linkargs.append(box.getgenvar(default_builder))
+ linkargs.append(box.getgenvar(jitstate))
default_builder.finish_and_goto(linkargs, switchblock)
return True
else:
@@ -774,6 +774,7 @@
for fz_virtualizable_box in self.fz_virtualizables:
virtualizable_box = fz_virtualizable_box.unfreeze(incomingvarboxes,
memo)
+ assert isinstance(virtualizable_box, rvalue.PtrRedBox)
virtualizables[virtualizable_box] = None
return JITState(None, frame, exc_type_box, exc_value_box,
virtualizables=virtualizables)
@@ -837,13 +838,16 @@
self.virtualizables = virtualizables
def add_virtualizable(self, virtualizable_box):
+ assert isinstance(virtualizable_box, rvalue.PtrRedBox)
self.virtualizables[virtualizable_box] = None
def split(self, newbuilder, newresumepoint, newgreens):
memo = rvalue.copy_memo()
virtualizables = {}
for virtualizable_box in self.virtualizables:
- virtualizables[virtualizable_box.copy(memo)] = None
+ new_virtualizable_box = virtualizable_box.copy(memo)
+ assert isinstance(new_virtualizable_box, rvalue.PtrRedBox)
+ virtualizables[new_virtualizable_box] = None
later_jitstate = JITState(newbuilder,
self.frame.copy(memo),
self.exc_type_box .copy(memo),
@@ -872,10 +876,9 @@
for virtualizable_box in virtualizables.keys():
if virtualizable_box.content not in memo.containers:
del virtualizables[virtualizable_box]
- assert isinstance(virtualizable_box, rvalue.PtrRedBox)
content = virtualizable_box.content
assert isinstance(content, rcontainer.VirtualizableStruct)
- content.store_back(builder)
+ content.store_back(self)
return incoming
def freeze(self, memo):
@@ -895,7 +898,9 @@
self.exc_value_box = self.exc_value_box.replace(memo)
virtualizables = {}
for virtualizable_box in self.virtualizables:
- virtualizables[virtualizable_box.replace(memo)] = None
+ new_virtualizable_box = virtualizable_box.replace(memo)
+ assert isinstance(new_virtualizable_box, rvalue.PtrRedBox)
+ virtualizables[new_virtualizable_box] = None
self.virtualizables = virtualizables
def get_locals_gv(self): # xxx
Modified: pypy/dist/pypy/jit/timeshifter/rvalue.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rvalue.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rvalue.py Thu Jan 11 13:53:46 2007
@@ -44,7 +44,7 @@
def is_constant(self):
return bool(self.genvar) and self.genvar.is_const
- def getgenvar(self, builder):
+ def getgenvar(self, jitstate):
return self.genvar
def enter_block(self, incoming, memo):
@@ -53,7 +53,8 @@
incoming.append(self)
memo[self] = None
- def forcevar(self, builder, memo):
+ def forcevar(self, jitstate, memo):
+ builder = jitstate.curbuilder
if self.is_constant():
# cannot mutate constant boxes in-place
box = self.copy(memo)
@@ -61,7 +62,7 @@
return box
else:
# force virtual containers
- self.getgenvar(builder)
+ self.getgenvar(jitstate)
return self
def replace(self, memo):
@@ -188,7 +189,7 @@
box = self.content.op_getfield(jitstate, fielddesc)
if box is not None:
return box
- gv_ptr = self.getgenvar(jitstate.curbuilder)
+ gv_ptr = self.getgenvar(jitstate)
box = fielddesc.generate_get(jitstate.curbuilder, gv_ptr)
if fielddesc.immutable:
self.remember_field(fielddesc, box)
@@ -197,7 +198,8 @@
def op_setfield(self, jitstate, fielddesc, valuebox):
gv_ptr = self.genvar
if gv_ptr:
- fielddesc.generate_set(jitstate.curbuilder, gv_ptr, valuebox)
+ fielddesc.generate_set(jitstate.curbuilder, gv_ptr,
+ valuebox.getgenvar(jitstate))
else:
assert self.content is not None
self.content.op_setfield(jitstate, fielddesc, valuebox)
@@ -270,22 +272,22 @@
boxmemo[self] = result
return result
- def getgenvar(self, builder):
+ def getgenvar(self, jitstate):
if not self.genvar:
content = self.content
from pypy.jit.timeshifter import rcontainer
if isinstance(content, rcontainer.VirtualizableStruct):
- return content.getgenvar(builder)
+ return content.getgenvar(jitstate)
assert isinstance(content, rcontainer.VirtualContainer)
- content.force_runtime_container(builder)
+ content.force_runtime_container(jitstate)
assert self.genvar
return self.genvar
- def forcevar(self, builder, memo):
+ def forcevar(self, jitstate, memo):
from pypy.jit.timeshifter import rcontainer
# xxx
assert not isinstance(self.content, rcontainer.VirtualizableStruct)
- return RedBox.forcevar(self, builder, memo)
+ return RedBox.forcevar(self, jitstate, memo)
def enter_block(self, incoming, memo):
if self.genvar:
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 Thu Jan 11 13:53:46 2007
@@ -3,15 +3,35 @@
import py
+S = lltype.GcStruct('s', ('a', lltype.Signed), ('b', lltype.Signed))
+PS = lltype.Ptr(S)
+
XY = lltype.GcForwardReference()
-GETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XY)], lltype.Signed))
-SETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XY), lltype.Signed],
- lltype.Void))
-XY_ACCESS = lltype.Struct('xy',
- ('get_x', GETTER),
- ('set_x', SETTER),
- ('get_y', GETTER),
- ('set_y', SETTER),
+GETTER = lambda STRUC: lltype.Ptr(lltype.FuncType([lltype.Ptr(STRUC)],
+ lltype.Signed))
+SETTER = lambda STRUC: lltype.Ptr(lltype.FuncType([lltype.Ptr(STRUC),
+ lltype.Signed],
+ lltype.Void))
+
+XP = lltype.GcForwardReference()
+PGETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XP)], PS))
+PSETTER = lltype.Ptr(lltype.FuncType([lltype.Ptr(XP), PS],
+ lltype.Void))
+
+XY_ACCESS = lltype.Struct('xy_access',
+ ('get_x', GETTER(XY)),
+ ('set_x', SETTER(XY)),
+ ('get_y', GETTER(XY)),
+ ('set_y', SETTER(XY)),
+ hints = {'immutable': True},
+ )
+
+
+XP_ACCESS = lltype.Struct('xp_access',
+ ('get_x', GETTER(XP)),
+ ('set_x', SETTER(XP)),
+ ('get_p', PGETTER),
+ ('set_p', PSETTER),
hints = {'immutable': True},
)
@@ -21,6 +41,14 @@
('y', lltype.Signed),
hints = {'virtualizable': True}
))
+
+XP.become(lltype.GcStruct('xp',
+ ('access', lltype.Ptr(XP_ACCESS)),
+ ('x', lltype.Signed),
+ ('p', PS),
+ hints = {'virtualizable': True}
+ ))
+
class TestVirtualizable(PortalTest):
@@ -216,7 +244,6 @@
self.check_insns(getfield=0)
def test_simple_explicit_construct_escape(self):
- py.test.skip("in-progress")
def f(x, y):
xy = lltype.malloc(XY)
@@ -242,3 +269,139 @@
res = self.timeshift_from_portal(main, f, [20, 22], policy=P_NOVIRTUAL)
assert res == 42
self.check_insns(getfield=0)
+
+ def test_simple_with_struct_explicit(self):
+
+ def f(xp):
+ xp_access = xp.access
+ if xp_access:
+ x = xp_access.get_x(xp)
+ else:
+ x = xp.x
+ xp_access = xp.access
+ if xp_access:
+ p = xp_access.get_p(xp)
+ else:
+ p = xp.p
+ return x+p.a+p.b
+
+ def main(x, a, b):
+ xp = lltype.malloc(XP)
+ xp.access = lltype.nullptr(XP_ACCESS)
+ xp.x = x
+ s = lltype.malloc(S)
+ s.a = a
+ s.b = b
+ xp.p = s
+ return f(xp)
+
+ res = self.timeshift_from_portal(main, f, [20, 10, 12],
+ policy=P_NOVIRTUAL)
+ assert res == 42
+ self.check_insns(getfield=2)
+
+ def test_simple_with_setting_struct_explicit(self):
+
+ def f(xp, s):
+ xp_access = xp.access
+ if xp_access:
+ xp_access.set_p(xp, s)
+ else:
+ xp.p = s
+ if xp_access:
+ x = xp_access.get_x(xp)
+ else:
+ x = xp.x
+ xp_access = xp.access
+ if xp_access:
+ p = xp_access.get_p(xp)
+ else:
+ p = xp.p
+ p.b = p.b*2
+ return x+p.a+p.b
+
+ def main(x, a, b):
+ xp = lltype.malloc(XP)
+ xp.access = lltype.nullptr(XP_ACCESS)
+ xp.x = x
+ s = lltype.malloc(S)
+ s.a = a
+ s.b = b
+ v = f(xp, s)
+ return v+xp.p.b
+
+ res = self.timeshift_from_portal(main, f, [20, 10, 3],
+ policy=P_NOVIRTUAL)
+ assert res == 42
+ self.check_insns(getfield=3)
+
+ def test_simple_with_setting_new_struct_explicit(self):
+
+ def f(xp, a, b):
+ s = lltype.malloc(S)
+ s.a = a
+ s.b = b
+ xp_access = xp.access
+ if xp_access:
+ xp_access.set_p(xp, s)
+ else:
+ xp.p = s
+ xp_access = xp.access
+ if xp_access:
+ p = xp_access.get_p(xp)
+ else:
+ p = xp.p
+ p.b = p.b*2
+ if xp_access:
+ x = xp_access.get_x(xp)
+ else:
+ x = xp.x
+ return x+p.a+p.b
+
+ def main(x, a, b):
+ xp = lltype.malloc(XP)
+ xp.access = lltype.nullptr(XP_ACCESS)
+ xp.x = x
+ v = f(xp, a, b)
+ return v+xp.p.b
+
+ res = self.timeshift_from_portal(main, f, [20, 10, 3],
+ policy=P_NOVIRTUAL)
+ assert res == 42
+ self.check_insns(getfield=2, malloc=1)
+
+
+ def test_simple_constr_with_setting_new_struct_explicit(self):
+
+ def f(x, a, b):
+ xp = lltype.malloc(XP)
+ xp.access = lltype.nullptr(XP_ACCESS)
+ xp.x = x
+ s = lltype.malloc(S)
+ s.a = a
+ s.b = b
+ xp_access = xp.access
+ if xp_access:
+ xp_access.set_p(xp, s)
+ else:
+ xp.p = s
+ xp_access = xp.access
+ if xp_access:
+ p = xp_access.get_p(xp)
+ else:
+ p = xp.p
+ p.b = p.b*2
+ if xp_access:
+ x = xp_access.get_x(xp)
+ else:
+ x = xp.x
+ return xp
+
+ def main(x, a, b):
+ xp = f(x, a, b)
+ return xp.x+xp.p.a+xp.p.b+xp.p.b
+
+ res = self.timeshift_from_portal(main, f, [20, 10, 3],
+ policy=P_NOVIRTUAL)
+ assert res == 42
+ self.check_insns(getfield=0, malloc=2)
Modified: pypy/dist/pypy/jit/timeshifter/vdict.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/vdict.py (original)
+++ pypy/dist/pypy/jit/timeshifter/vdict.py Thu Jan 11 13:53:46 2007
@@ -199,8 +199,9 @@
for box in self.getboxes():
box.enter_block(incoming, memo)
- def force_runtime_container(self, builder):
+ def force_runtime_container(self, jitstate):
typedesc = self.typedesc
+ builder = jitstate.curbuilder
items = self.getitems_and_makeempty(builder.rgenop)
args_gv = []
@@ -211,7 +212,7 @@
self.ownbox.content = None
for gv_key, valuebox, hash in items:
gv_hash = builder.rgenop.genconst(hash)
- gv_value = valuebox.getgenvar(builder)
+ gv_value = valuebox.getgenvar(jitstate)
args_gv = [gv_dict, gv_key, gv_value, gv_hash]
builder.genop_call(typedesc.tok_ll_insertclean,
typedesc.gv_ll_insertclean,
Modified: pypy/dist/pypy/jit/timeshifter/vlist.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/vlist.py (original)
+++ pypy/dist/pypy/jit/timeshifter/vlist.py Thu Jan 11 13:53:46 2007
@@ -107,8 +107,9 @@
for box in self.item_boxes:
box.enter_block(incoming, memo)
- def force_runtime_container(self, builder):
+ def force_runtime_container(self, jitstate):
typedesc = self.typedesc
+ builder = jitstate.curbuilder
boxes = self.item_boxes
self.item_boxes = None
@@ -119,7 +120,7 @@
self.ownbox.genvar = gv_list
self.ownbox.content = None
for i in range(len(boxes)):
- gv_item = boxes[i].getgenvar(builder)
+ gv_item = boxes[i].getgenvar(jitstate)
args_gv = [gv_list, builder.rgenop.genconst(i), gv_item]
builder.genop_call(typedesc.tok_ll_setitem_fast,
typedesc.gv_ll_setitem_fast,
More information about the Pypy-commit
mailing list