[pypy-svn] r31744 - in pypy/dist/pypy/jit: codegen/i386 codegen/i386/test codegen/llgraph timeshifter
ac at codespeak.net
ac at codespeak.net
Sun Aug 27 19:30:46 CEST 2006
Author: ac
Date: Sun Aug 27 19:30:45 2006
New Revision: 31744
Modified:
pypy/dist/pypy/jit/codegen/i386/ri386genop.py
pypy/dist/pypy/jit/codegen/i386/test/test_interp_ts.py
pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
pypy/dist/pypy/jit/timeshifter/rcontainer.py
pypy/dist/pypy/jit/timeshifter/rtimeshift.py
pypy/dist/pypy/jit/timeshifter/rtyper.py
Log:
(pedronis, arre) More refactorings of getfield/setfield/getsubstruct.
Modified: pypy/dist/pypy/jit/codegen/i386/ri386genop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/ri386genop.py (original)
+++ pypy/dist/pypy/jit/codegen/i386/ri386genop.py Sun Aug 27 19:30:45 2006
@@ -116,10 +116,15 @@
return genmethod(args_gv, gv_RESTYPE)
genop._annspecialcase_ = 'specialize:arg(1)'
- def genop_getfield(self, (T, name), gv_ptr):
- offset = self.rgenop.offsetscomp.offsetof(T, name)
+ def genop_getfield(self, offset, gv_ptr):
return self.emit_getfield(gv_ptr, offset)
- genop_getfield._annspecialcase_ = 'specialize:arg(1)'
+
+ def genop_setfield(self, offset, gv_ptr, gv_value):
+ offset = self.rgenop.offsetscomp.offsetof(T, name)
+ return self.emit_setfield(gv_ptr, offset, gv_value)
+
+ def genop_getsubstruct(self, offset, gv_ptr):
+ return self.emit_getsubstruct(gv_ptr, offset)
def close1(self):
return Link(self)
@@ -256,17 +261,13 @@
self.mc.MOV(edx, gv_ptr.operand(self))
return self.push(mem(edx, offset))
- def op_setfield(self, (gv_ptr, gv_offset, gv_value), gv_RESTYPE):
+ def emit_setfield(self, gv_ptr, offset, gv_value):
# XXX only for ints for now.
- assert isinstance(gv_offset, IntConst)
- offset = gv_offset.value
self.mc.MOV(eax, gv_value.operand(self))
self.mc.MOV(edx, gv_ptr.operand(self))
self.mc.MOV(mem(edx, offset), eax)
- def op_getsubstruct(self, (gv_ptr, gv_offset), gv_RESTYPE):
- assert isinstance(gv_offset, IntConst)
- offset = gv_offset.value
+ def emit_getsubstruct(self, gv_ptr, offset):
self.mc.MOV(edx, gv_ptr.operand(self))
self.mc.LEA(eax, mem(edx, offset))
return self.push(eax)
@@ -395,7 +396,6 @@
class RI386GenOp(AbstractRGenOp):
from pypy.jit.codegen.i386.codebuf import MachineCodeBlock
- from pypy.rpython.lltypesystem import llmemory as offsetscomp
gv_IntWord = TypeConst('IntWord')
gv_Void = TypeConst('Void')
@@ -429,6 +429,11 @@
genconst._annspecialcase_ = 'specialize:genconst(0)'
genconst = staticmethod(genconst)
+ def fieldToken(T, name):
+ return llmemory.offsetof(T, name)
+ fieldToken._annspecialcase_ = 'specialize:memo'
+ fieldToken = staticmethod(fieldToken)
+
def constTYPE(T):
if T is lltype.Void:
return RI386GenOp.gv_Void
Modified: pypy/dist/pypy/jit/codegen/i386/test/test_interp_ts.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_interp_ts.py (original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_interp_ts.py Sun Aug 27 19:30:45 2006
@@ -10,23 +10,14 @@
def __eq__(self, other):
return True
-class OffsetComp(object):
-
- def offsetof(T, name):
- return list(T._names).index(name)
- offsetof._annspecialcase_ = 'specialize:memo'
- offsetof = staticmethod(offsetof)
-
- def _freeze_(self):
- return True
-
-_RI386GenOp = type('RI386GenOp', RI386GenOp.__bases__, dict(RI386GenOp.__dict__.iteritems()))
-del _RI386GenOp.offsetscomp
-
class TestTimeshiftI386LLInterp(test_timeshift.TestTimeshift):
- class RGenOp(_RI386GenOp):
+ class RGenOp(RI386GenOp):
from pypy.jit.codegen.i386.codebuf import LLTypeMachineCodeBlock as MachineCodeBlock
- offsetscomp = OffsetComp()
+
+ def fieldToken(T, name):
+ return list(T._names).index(name)
+ fieldToken._annspecialcase_ = 'specialize:memo'
+ fieldToken = staticmethod(fieldToken)
def constFieldName(T, name):
return IntConst(list(T._names).index(name))
Modified: pypy/dist/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/llgraph/rgenop.py Sun Aug 27 19:30:45 2006
@@ -34,12 +34,20 @@
(gv_RESULT_TYPE or gv_Void).v))
genop._annspecialcase_ = 'specialize:arg(1)'
- def genop_getfield(self, (T, name), gv_ptr):
- vars_gv = [gv_ptr.v, llimpl.constFieldName(name)]
- gv_RESULT = llimpl.constTYPE(getattr(T, name))
+ def genop_getfield(self, (gv_name, gv_FIELDTYPE), gv_ptr):
+ vars_gv = [gv_ptr.v, gv_name.v]
return LLVar(llimpl.genop(self.b, 'getfield', vars_gv,
- gv_RESULT))
- genop_getfield._annspecialcase_ = 'specialize:arg(1)'
+ gv_FIELDTYPE.v))
+
+ def genop_setfield(self, (gv_name, gv_FIELDTYPE), gv_ptr, gv_value):
+ vars_gv = [gv_ptr.v, gv_name.v, gv_value.v]
+ return LLVar(llimpl.genop(self.b, 'setfield', vars_gv,
+ gv_Void.v))
+
+ def genop_getsubstruct(self, (gv_name, gv_FIELDTYPE), gv_ptr):
+ vars_gv = [gv_ptr.v, gv_name.v]
+ return LLVar(llimpl.genop(self.b, 'getsubstruct', vars_gv,
+ gv_FIELDTYPE.v))
def close1(self):
return LLLink(llimpl.closeblock1(self.b))
@@ -75,6 +83,16 @@
genconst._annspecialcase_ = 'specialize:genconst(0)'
genconst = staticmethod(genconst)
+ def fieldToken(T, name):
+ assert name in T._flds
+ FIELDTYPE = getattr(T, name)
+ if isinstance(FIELDTYPE, lltype.ContainerType):
+ FIELDTYPE = lltype.Ptr(FIELDTYPE)
+ return (LLConst(llimpl.constFieldName(name)), LLConst(llimpl.constTYPE(FIELDTYPE)))
+ fieldToken._annspecialcase_ = 'specialize:memo'
+ fieldToken = staticmethod(fieldToken)
+
+
def constTYPE(T):
return LLConst(llimpl.constTYPE(T))
constTYPE._annspecialcase_ = 'specialize:memo'
Modified: pypy/dist/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rcontainer.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rcontainer.py Sun Aug 27 19:30:45 2006
@@ -98,7 +98,7 @@
self.structdepth = 0
T = self.PTRTYPE.TO
self.fieldname = name
- self.gv_fieldname = RGenOp.constFieldName(T, name)
+ self.fieldtoken = RGenOp.fieldToken(T, name)
while (T._names and
isinstance(getattr(T, T._names[0]), lltype.ContainerType)):
self.structdepth += 1
@@ -127,9 +127,8 @@
self.RESTYPE = RES1
self.gv_resulttype = RGenOp.constTYPE(RES1)
self.fieldname = fieldname
- self.fieldname_gv = [RGenOp.constFieldName(T, component)
- for T, component in accessors] # XXX kill me
- self.accessors = accessors
+ self.fieldtokens = [RGenOp.fieldToken(T, component)
+ for T, component in accessors]
self.fieldindex = index
self.gv_default = RGenOp.constPrebuiltGlobal(RES1._defl())
self.redboxcls = rvalue.ll_redboxcls(RES1)
@@ -144,15 +143,9 @@
def generate_set(self, builder, genvar, box):
gv_sub = genvar
- genop = builder.genop
- for i in range(len(self.accessptrtype_gv)-1):
- op_args = [gv_sub,
- self.fieldname_gv[i]]
- gv_sub = genop('getsubstruct', op_args, self.accessptrtype_gv[i+1])
- op_args = [gv_sub,
- self.fieldname_gv[-1],
- box.getgenvar(builder)]
- genop('setfield', op_args, builder.rgenop.gv_Void)
+ for i in range(len(self.fieldtokens)-1):
+ gv_sub = builder.genop_getsubstruct(self.fieldtokens[i], gv_sub)
+ builder.genop_setfield(self.fieldtokens[-1], gv_sub, box.getgenvar(builder))
# ____________________________________________________________
Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Sun Aug 27 19:30:45 2006
@@ -90,7 +90,7 @@
return rvalue.ll_fromvalue(jitstate, res)
assert isinstance(argbox, rvalue.PtrRedBox)
if argbox.content is None:
- genvar = jitstate.curbuilder.genop_getfield(fielddesc.accessors[-1],
+ genvar = jitstate.curbuilder.genop_getfield(fielddesc.fieldtokens[-1],
argbox.getgenvar(jitstate.curbuilder))
return fielddesc.redboxcls(fielddesc.gv_resulttype, genvar)
else:
@@ -99,11 +99,10 @@
def ll_generate_setfield(jitstate, fielddesc, destbox, valuebox):
assert isinstance(destbox, rvalue.PtrRedBox)
if destbox.content is None:
- op_args = [destbox.getgenvar(jitstate.curbuilder),
- fielddesc.fieldname_gv[-1],
- valuebox.getgenvar(jitstate.curbuilder)]
builder = jitstate.curbuilder
- builder.genop('setfield', op_args, builder.rgenop.gv_Void)
+ builder.genop_setfield(fielddesc.fieldtokens[-1],
+ destbox.getgenvar(builder),
+ valuebox.getgenvar(builder))
else:
destbox.content.op_setfield(jitstate, fielddesc, valuebox)
@@ -114,10 +113,7 @@
return rvalue.ll_fromvalue(jitstate, res)
assert isinstance(argbox, rvalue.PtrRedBox)
if argbox.content is None:
- op_args = [argbox.getgenvar(jitstate.curbuilder),
- fielddesc.gv_fieldname]
- genvar = jitstate.curbuilder.genop('getsubstruct', op_args,
- fielddesc.gv_resulttype)
+ genvar = jitstate.curbuilder.genop_getsubstruct(fielddesc.fieldtoken, argbox.getgenvar(jitstate.curbuilder))
return fielddesc.redboxcls(fielddesc.gv_resulttype, genvar)
else:
return argbox.content.op_getsubstruct(jitstate, fielddesc)
@@ -313,9 +309,14 @@
return self.block.genop(opname, args_gv, gv_resulttype)
genop._annspecialcase_ = 'specialize:arg(1)'
- def genop_getfield(self, accessor, gv_ptr):
- return self.block.genop_getfield(accessor, gv_ptr)
- genop_getfield._annspecialcase_ = 'specialize:arg(1)'
+ def genop_getfield(self, fieldtoken, gv_ptr):
+ return self.block.genop_getfield(fieldtoken, gv_ptr)
+
+ def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
+ return self.block.genop_setfield(fieldtoken, gv_ptr, gv_value)
+
+ def genop_getsubstruct(self, fieldtoken, gv_ptr):
+ return self.block.genop_getsubstruct(fieldtoken, gv_ptr)
def constTYPE(self, T):
return self.rgenop.constTYPE(T)
Modified: pypy/dist/pypy/jit/timeshifter/rtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtyper.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rtyper.py Sun Aug 27 19:30:45 2006
@@ -347,12 +347,6 @@
assert self.originalblock is not None
return self.timeshifter.block2jitstate[self.originalblock]
- def getcurbuilder(self):
- v_jitstate = self.getjitstate()
- c_name = inputconst(lltype.Void, 'inst_curbuilder')
- return self.genop('getfield', [v_jitstate, c_name],
- self.timeshifter.r_ResidualGraphBuilder.lowleveltype)
-
# ____________________________________________________________
class __extend__(pairtype(HintTypeSystem, hintmodel.SomeLLAbstractConstant)):
@@ -461,125 +455,125 @@
# this can reuse the current merge logic and the flattening/reconstructing can be done externally driven
# by the known types and annotations
-class BlueStructRepr(BlueRepr):
- def __init__(self, original_concretetype, virtualstructdef, timeshifter):
- self.original_concretetype = original_concretetype
- self.timeshifter = timeshifter
- # xxx
- # this could avoid using a wrapper box completely
- # which means that if the fields are all green we could get back the original situation
- # but is unclear whether there are issues with gc tracking for non-gc struct pointers,
- # likely things are preserved but the timeshifted graph may introduce sufficient
- # differences to make that a problem
- self.lowleveltype = timeshifter.r_RedBox.lowleveltype
- if virtualstructdef.vparent is None:
- self.ENVELOPE = lltype.GcForwardReference()
- self.vstructdef = virtualstructdef
-
- def fldname(self, name):
- return name
-
- def _setup_repr(self):
- field_reprs = {}
- fields = []
- vstructdef = self.vstructdef
- hrtyper = self.timeshifter.hrtyper
- T = self.original_concretetype.TO
- for name in vstructdef.names:
- fieldvalue = vstructdef.fields[name]
- field_repr = hrtyper.getrepr(fieldvalue.s_value)
- field_reprs[name] = field_repr
- SUBFIELD = getattr(T, name)
- if isinstance(SUBFIELD, lltype.Struct):
- # virtual substructure case
- field_lltype = field_repr.DATA
- else:
- field_lltype = field_repr.lowleveltype
- fields.append((self.fldname(name), field_lltype))
- self.field_reprs = field_reprs
- self.DATA = lltype.Struct('vstruct', *fields)
- if vstructdef.vparent is None:
- self.ENVELOPE.become(lltype.GcStruct('vstruct_envelope', ('tag', rtimeshift.VCONTAINER),
- ('data', self.DATA)))
+## class BlueStructRepr(BlueRepr):
+## def __init__(self, original_concretetype, virtualstructdef, timeshifter):
+## self.original_concretetype = original_concretetype
+## self.timeshifter = timeshifter
+## # xxx
+## # this could avoid using a wrapper box completely
+## # which means that if the fields are all green we could get back the original situation
+## # but is unclear whether there are issues with gc tracking for non-gc struct pointers,
+## # likely things are preserved but the timeshifted graph may introduce sufficient
+## # differences to make that a problem
+## self.lowleveltype = timeshifter.r_RedBox.lowleveltype
+## if virtualstructdef.vparent is None:
+## self.ENVELOPE = lltype.GcForwardReference()
+## self.vstructdef = virtualstructdef
+
+## def fldname(self, name):
+## return name
+
+## def _setup_repr(self):
+## field_reprs = {}
+## fields = []
+## vstructdef = self.vstructdef
+## hrtyper = self.timeshifter.hrtyper
+## T = self.original_concretetype.TO
+## for name in vstructdef.names:
+## fieldvalue = vstructdef.fields[name]
+## field_repr = hrtyper.getrepr(fieldvalue.s_value)
+## field_reprs[name] = field_repr
+## SUBFIELD = getattr(T, name)
+## if isinstance(SUBFIELD, lltype.Struct):
+## # virtual substructure case
+## field_lltype = field_repr.DATA
+## else:
+## field_lltype = field_repr.lowleveltype
+## fields.append((self.fldname(name), field_lltype))
+## self.field_reprs = field_reprs
+## self.DATA = lltype.Struct('vstruct', *fields)
+## if vstructdef.vparent is None:
+## self.ENVELOPE.become(lltype.GcStruct('vstruct_envelope', ('tag', rtimeshift.VCONTAINER),
+## ('data', self.DATA)))
- # helpers
+## # helpers
- def create(self, hop):
- llops = hop.llops
- c_ENVELOPE = inputconst(lltype.Void, self.ENVELOPE)
- v_envelope = hop.genop('malloc', [c_ENVELOPE], resulttype=lltype.Ptr(self.ENVELOPE))
- c_data = inputconst(lltype.Void, 'data')
- v_data = hop.genop('getsubstruct', [v_envelope, c_data], lltype.Ptr(self.DATA))
- for name, field_repr in self.field_reprs.iteritems():
- if isinstance(field_repr, RedRepr):
- T = field_repr.original_concretetype
- c_defl = inputconst(T, T._defl())
- s_defl = annmodel.lltype_to_annotation(T)
- v_field = llops.genmixlevelhelpercall(rtimeshift.ConstRedBox.ll_fromvalue,
- [s_defl], [c_defl],
- self.timeshifter.s_RedBox)
- c_name = inputconst(lltype.Void, self.fldname(name))
- hop.genop('setfield', [v_data, c_name, v_field])
- VCONTPTR = lltype.Ptr(rtimeshift.VCONTAINER)
- v_envelope = hop.genop('cast_pointer', [v_envelope],
- resulttype=VCONTPTR)
- v_content = hop.genop('cast_ptr_to_adr', [v_data], resulttype=llmemory.Address)
- return llops.genmixlevelhelpercall(rtimeshift.ContainerRedBox.ll_make_container_box,
- [annmodel.SomePtr(VCONTPTR), annmodel.SomeAddress()],
- [v_envelope, v_content],
- self.timeshifter.s_RedBox)
-
- def getdata(self, hop, v_box):
- llops = hop.llops
- rtyper = self.timeshifter.rtyper
- DATAPTR = lltype.Ptr(self.DATA)
- v_data_addr = llops.genmixlevelhelpercall(rtimeshift.ll_getcontent,
- [self.timeshifter.s_RedBox],
- [v_box],
- annmodel.SomeAddress())
- # cannot do this inside ll_getcontent because DATAPTR parts can be setup only later :(
- v_data = hop.genop('cast_adr_to_ptr', [v_data_addr], resulttype=DATAPTR)
- return v_data
+## def create(self, hop):
+## llops = hop.llops
+## c_ENVELOPE = inputconst(lltype.Void, self.ENVELOPE)
+## v_envelope = hop.genop('malloc', [c_ENVELOPE], resulttype=lltype.Ptr(self.ENVELOPE))
+## c_data = inputconst(lltype.Void, 'data')
+## v_data = hop.genop('getsubstruct', [v_envelope, c_data], lltype.Ptr(self.DATA))
+## for name, field_repr in self.field_reprs.iteritems():
+## if isinstance(field_repr, RedRepr):
+## T = field_repr.original_concretetype
+## c_defl = inputconst(T, T._defl())
+## s_defl = annmodel.lltype_to_annotation(T)
+## v_field = llops.genmixlevelhelpercall(rtimeshift.ConstRedBox.ll_fromvalue,
+## [s_defl], [c_defl],
+## self.timeshifter.s_RedBox)
+## c_name = inputconst(lltype.Void, self.fldname(name))
+## hop.genop('setfield', [v_data, c_name, v_field])
+## VCONTPTR = lltype.Ptr(rtimeshift.VCONTAINER)
+## v_envelope = hop.genop('cast_pointer', [v_envelope],
+## resulttype=VCONTPTR)
+## v_content = hop.genop('cast_ptr_to_adr', [v_data], resulttype=llmemory.Address)
+## return llops.genmixlevelhelpercall(rtimeshift.ContainerRedBox.ll_make_container_box,
+## [annmodel.SomePtr(VCONTPTR), annmodel.SomeAddress()],
+## [v_envelope, v_content],
+## self.timeshifter.s_RedBox)
+
+## def getdata(self, hop, v_box):
+## llops = hop.llops
+## rtyper = self.timeshifter.rtyper
+## DATAPTR = lltype.Ptr(self.DATA)
+## v_data_addr = llops.genmixlevelhelpercall(rtimeshift.ll_getcontent,
+## [self.timeshifter.s_RedBox],
+## [v_box],
+## annmodel.SomeAddress())
+## # cannot do this inside ll_getcontent because DATAPTR parts can be setup only later :(
+## v_data = hop.genop('cast_adr_to_ptr', [v_data_addr], resulttype=DATAPTR)
+## return v_data
- def timeshift_setfield(self, hop):
- llops = hop.llops
- assert hop.args_s[1].is_constant()
- name = hop.args_s[1].const
- field_repr = self.field_reprs[name]
- v_box = hop.inputarg(self, arg=0)
- v_value = hop.inputarg(field_repr, arg=2)
- v_data = self.getdata(hop, v_box)
- c_name = inputconst(lltype.Void, self.fldname(name))
- hop.genop('setfield', [v_data, c_name, v_value])
-
- def timeshift_getfield(self, hop):
- llops = hop.llops
- assert hop.args_s[1].is_constant()
- name = hop.args_s[1].const
- field_repr = self.field_reprs[name]
- v_box = hop.inputarg(self, arg=0)
- v_data = self.getdata(hop, v_box)
- c_name = inputconst(lltype.Void, self.fldname(name))
- return hop.genop('getfield', [v_data, c_name],
- resulttype=field_repr.lowleveltype)
-
- def timeshift_getsubstruct(self, hop):
- llops = hop.llops
- assert hop.args_s[1].is_constant()
- name = hop.args_s[1].const
- field_repr = self.field_reprs[name]
- v_box = hop.inputarg(self, arg=0)
- v_data = self.getdata(hop, v_box)
- c_name = inputconst(lltype.Void, self.fldname(name))
- NEWDATAPTR = lltype.Ptr(field_repr.DATA)
- v_newdata = hop.genop('getsubstruct', [v_data, c_name],
- resulttype=NEWDATAPTR)
- v_content = hop.genop('cast_ptr_to_adr', [v_newdata], resulttype=llmemory.Address)
- return llops.genmixlevelhelpercall(rtimeshift.ContainerRedBox.ll_make_subcontainer_box,
- [self.timeshifter.s_RedBox, annmodel.SomeAddress()],
- [v_box, v_content],
- self.timeshifter.s_RedBox)
+## def timeshift_setfield(self, hop):
+## llops = hop.llops
+## assert hop.args_s[1].is_constant()
+## name = hop.args_s[1].const
+## field_repr = self.field_reprs[name]
+## v_box = hop.inputarg(self, arg=0)
+## v_value = hop.inputarg(field_repr, arg=2)
+## v_data = self.getdata(hop, v_box)
+## c_name = inputconst(lltype.Void, self.fldname(name))
+## hop.genop('setfield', [v_data, c_name, v_value])
+
+## def timeshift_getfield(self, hop):
+## llops = hop.llops
+## assert hop.args_s[1].is_constant()
+## name = hop.args_s[1].const
+## field_repr = self.field_reprs[name]
+## v_box = hop.inputarg(self, arg=0)
+## v_data = self.getdata(hop, v_box)
+## c_name = inputconst(lltype.Void, self.fldname(name))
+## return hop.genop('getfield', [v_data, c_name],
+## resulttype=field_repr.lowleveltype)
+
+## def timeshift_getsubstruct(self, hop):
+## llops = hop.llops
+## assert hop.args_s[1].is_constant()
+## name = hop.args_s[1].const
+## field_repr = self.field_reprs[name]
+## v_box = hop.inputarg(self, arg=0)
+## v_data = self.getdata(hop, v_box)
+## c_name = inputconst(lltype.Void, self.fldname(name))
+## NEWDATAPTR = lltype.Ptr(field_repr.DATA)
+## v_newdata = hop.genop('getsubstruct', [v_data, c_name],
+## resulttype=NEWDATAPTR)
+## v_content = hop.genop('cast_ptr_to_adr', [v_newdata], resulttype=llmemory.Address)
+## return llops.genmixlevelhelpercall(rtimeshift.ContainerRedBox.ll_make_subcontainer_box,
+## [self.timeshifter.s_RedBox, annmodel.SomeAddress()],
+## [v_box, v_content],
+## self.timeshifter.s_RedBox)
More information about the Pypy-commit
mailing list