[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