Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77573:a695000cce2a
Date: 2015-05-26 13:38 +0200
http://bitbucket.org/pypy/pypy/changeset/a695000cce2a/

Log:    hack enough to start passing resume tests

diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -653,11 +653,11 @@
         return lltype.cast_opaque_ptr(llmemory.GCREF,
                                       lltype.malloc(sizedescr.S, zero=True))
 
-    def bh_new_with_vtable(self, vtable, descr):
+    def bh_new_with_vtable(self, descr):
         result = lltype.malloc(descr.S, zero=True)
         result_as_objptr = lltype.cast_pointer(rclass.OBJECTPTR, result)
         result_as_objptr.typeptr = support.cast_from_int(rclass.CLASSTYPE,
-                                                         vtable)
+                                                descr._corresponding_vtable)
         return lltype.cast_opaque_ptr(llmemory.GCREF, result)
 
     def bh_new_array(self, length, arraydescr):
diff --git a/rpython/jit/metainterp/executor.py 
b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -227,11 +227,8 @@
     else:
         return BoxInt(cpu.bh_raw_load_i(addr, offset, arraydescr))
 
-def exec_new_with_vtable(cpu, clsbox):
-    from rpython.jit.codewriter import heaptracker
-    vtable = clsbox.getint()
-    descr = heaptracker.vtable2descr(cpu, vtable)
-    return cpu.bh_new_with_vtable(vtable, descr)
+def exec_new_with_vtable(cpu, descr):
+    return cpu.bh_new_with_vtable(descr)
 
 def do_new_with_vtable(cpu, _, clsbox):
     return exec_new_with_vtable(cpu, clsbox)
diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -1,4 +1,5 @@
 
+from rpython.rlib.objectmodel import specialize
 from rpython.jit.metainterp.resoperation import AbstractValue, ResOperation,\
      rop
 from rpython.jit.metainterp.history import ConstInt
@@ -19,8 +20,6 @@
 INFO_NONNULL = 1
 INFO_UNKNOWN = 2
 
-FLAG_VIRTUAL = 1
-
 class AbstractInfo(AbstractValue):
     is_info_class = True
 
@@ -71,9 +70,11 @@
         assert self.get_last_guard(optimizer).is_guard()
 
 class AbstractVirtualPtrInfo(NonNullPtrInfo):
-    _attrs_ = ('flags',)
+    _attrs_ = ('_cached_vinfo', 'vdescr')
+    # XXX merge _cached_vinfo with vdescr
 
-    flags = 0
+    _cached_vinfo = None
+    vdescr = None
 
     def force_box(self, op, optforce):
         if self.is_virtual():
@@ -82,13 +83,13 @@
             newop = optforce.getlastop()
             op.set_forwarded(newop)
             newop.set_forwarded(self)
-            self.flags &= ~FLAG_VIRTUAL # clean the virtual flag
+            self.vdescr = None
             self._force_elements(newop, optforce)
             return newop
         return op
 
     def is_virtual(self):
-        return self.flags & FLAG_VIRTUAL
+        return self.vdescr is not None
 
 class AbstractStructPtrInfo(AbstractVirtualPtrInfo):
     _attrs_ = ('_fields',)
@@ -97,8 +98,7 @@
         self._fields = [None] * len(descr.all_fielddescrs)
 
     def clear_cache(self):
-        assert self.flags & FLAG_VIRTUAL == 0
-        self.flags = 0
+        assert not self.is_virtual()
         self._fields = [None] * len(self._fields)
 
     def setfield(self, descr, op, optheap=None, cf=None):
@@ -130,32 +130,45 @@
     _attrs_ = ('_known_class',)
     _fields = None
 
-    def __init__(self, known_class=None, is_virtual=False):
+    def __init__(self, known_class=None, vdescr=None):
         self._known_class = known_class
-        if is_virtual:
-            self.flags = FLAG_VIRTUAL
+        self.vdescr = vdescr
 
     def get_known_class(self, cpu):
         return self._known_class
 
+    def visitor_walk_recursive(self, instbox, visitor):
+        if visitor.already_seen_virtual(instbox):
+            return
+        #lst = op.getdescr().parent_descr.all_fielddescrs
+        assert self.is_virtual()
+        visitor.register_virtual_fields(instbox,
+                                        [box for box in self._fields if box])
+        #for i in range(len(lst)):
+        #    descr = lst[descr]
+        #    fieldvalue = self._fields[ofs]
+        #    fieldvalue.visitor_walk_recursive(visitor)
+
+    @specialize.argtype(1)
+    def visitor_dispatch_virtual_type(self, visitor):
+        fielddescrs = self.vdescr.all_fielddescrs
+        assert self.is_virtual()
+        return visitor.visit_virtual(self.vdescr, fielddescrs)
+
 class StructPtrInfo(AbstractStructPtrInfo):
-    def __init__(self, is_virtual=False):
-        if is_virtual:
-            self.flags = FLAG_VIRTUAL
+    def __init__(self, vdescr=None):
+        self.vdescr = vdescr
     
 class ArrayPtrInfo(AbstractVirtualPtrInfo):
-    _attrs_ = ('length', '_items', '_descr', 'lenbound')
+    _attrs_ = ('length', '_items', 'lenbound')
 
-    flags = 0
     _items = None
     lenbound = None
     length = -1
 
-    def __init__(self, descr, const=None, size=0, clear=False,
-                 is_virtual=False):
-        self._descr = descr
-        if is_virtual:
-            self.flags = FLAG_VIRTUAL
+    def __init__(self, const=None, size=0, clear=False, vdescr=None):
+        self.vdescr = vdescr
+        if vdescr is not None:
             self._init_items(const, size, clear)
 
     def _init_items(self, const, size, clear):
@@ -199,11 +212,10 @@
         return self.length
 
 class ArrayStructInfo(ArrayPtrInfo):
-    def __init__(self, descr, size, is_virtual):
+    def __init__(self, size, vdescr=None):
         self.length = size
-        lgt = len(descr.all_interiorfielddescrs)
-        if is_virtual:
-            self.flags = FLAG_VIRTUAL
+        lgt = len(vdescr.all_interiorfielddescrs)
+        self.vdescr = vdescr
         self._items = [None] * (size * lgt)
 
     def _compute_index(self, index, fielddescr):
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py 
b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -213,11 +213,10 @@
             v2 = self.get_box_replacement(rhs)
 
             if v1.is_constant():
-                xxxx
-                if v1.box.getfloatstorage() == 1.0:
+                if v1.getfloatstorage() == 1.0:
                     self.make_equal_to(op, v2)
                     return
-                elif v1.box.getfloatstorage() == -1.0:
+                elif v1.getfloatstorage() == -1.0:
                     newop = self.replace_op_with(op, rop.FLOAT_NEG, args=[rhs])
                     self.emit_operation(newop)
                     return
@@ -227,12 +226,12 @@
     def optimize_FLOAT_TRUEDIV(self, op):
         arg1 = op.getarg(0)
         arg2 = op.getarg(1)
-        v2 = self.getvalue(arg2)
+        v2 = self.get_box_replacement(arg2)
 
         # replace "x / const" by "x * (1/const)" if possible
         newop = op
         if v2.is_constant():
-            divisor = v2.box.getfloatstorage()
+            divisor = v2.getfloatstorage()
             fraction = math.frexp(divisor)[0]
             # This optimization is valid for powers of two
             # but not for zeroes, some denormals and NaN:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -1621,7 +1621,7 @@
         """
         expected = """
         [p1, i2, i3]
-        guard_true(i3) []
+        guard_true(i3) [p1]
         i4 = int_neg(i2)
         setfield_gc(p1, NULL, descr=nextdescr)
         jump(p1, i2, i4)
@@ -1641,7 +1641,7 @@
         """
         expected = """
         [p1, i2, i3]
-        guard_true(i3) [] # [i2, p1]
+        guard_true(i3) [i2, p1]
         i4 = int_neg(i2)
         setfield_gc(p1, NULL, descr=nextdescr)
         jump(p1, i2, i4)
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -521,7 +521,7 @@
     _last_guard_not_forced_2 = None
 
     def make_virtual(self, known_class, source_op, descr):
-        opinfo = info.InstancePtrInfo(known_class, is_virtual=True)
+        opinfo = info.InstancePtrInfo(known_class, vdescr=descr)
         opinfo.init_fields(descr)
         source_op.set_forwarded(opinfo)
         return opinfo
@@ -529,15 +529,15 @@
     def make_varray(self, arraydescr, size, source_op, clear=False):
         if arraydescr.is_array_of_structs():
             assert clear
-            opinfo = info.ArrayStructInfo(arraydescr, size, True)
+            opinfo = info.ArrayStructInfo(size, vdescr=arraydescr)
         else:
             const = self.new_const_item(arraydescr)
-            opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear, True)
+            opinfo = info.ArrayPtrInfo(const, size, clear, vdescr=arraydescr)
         source_op.set_forwarded(opinfo)
         return opinfo
 
     def make_vstruct(self, structdescr, source_op):
-        opinfo = info.StructPtrInfo(True)
+        opinfo = info.StructPtrInfo(vdescr=structdescr)
         opinfo.init_fields(structdescr)
         source_op.set_forwarded(opinfo)
         return opinfo
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -438,9 +438,7 @@
 
     @arguments("descr")
     def opimpl_new_with_vtable(self, sizedescr):
-        cpu = self.metainterp.cpu
-        cls = heaptracker.descr2vtable(cpu, sizedescr)
-        return self.metainterp.execute_new_with_vtable(ConstInt(cls))
+        return self.metainterp.execute_new_with_vtable(descr=sizedescr)
 
     @arguments("box", "descr")
     def opimpl_new_array(self, lengthbox, itemsizedescr):
@@ -2024,9 +2022,8 @@
         if op.type != 'v':
             return op
 
-    def execute_new_with_vtable(self, known_class):
-        resbox = self.execute_and_record(rop.NEW_WITH_VTABLE, None,
-                                         known_class)
+    def execute_new_with_vtable(self, descr):
+        resbox = self.execute_and_record(rop.NEW_WITH_VTABLE, descr)
         self.heapcache.new(resbox)
         self.heapcache.class_now_known(resbox)
         return resbox
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -289,23 +289,21 @@
         self.snapshot_storage = snapshot_storage
         self.memo = memo
 
-    def make_virtual_info(self, value, fieldnums):
-        from rpython.jit.metainterp.optimizeopt.virtualize import 
AbstractVirtualValue
-        assert isinstance(value, AbstractVirtualValue)
+    def make_virtual_info(self, descr, info, fieldnums):
         assert fieldnums is not None
-        vinfo = value._cached_vinfo
+        vinfo = info._cached_vinfo
         if vinfo is not None and vinfo.equals(fieldnums):
             return vinfo
-        vinfo = value.visitor_dispatch_virtual_type(self)
+        vinfo = info.visitor_dispatch_virtual_type(self)
         vinfo.set_content(fieldnums)
-        value._cached_vinfo = vinfo
+        info._cached_vinfo = vinfo
         return vinfo
 
     def visit_not_virtual(self, value):
         assert 0, "unreachable"
 
-    def visit_virtual(self, known_class, fielddescrs):
-        return VirtualInfo(known_class, fielddescrs)
+    def visit_virtual(self, descr, fielddescrs):
+        return VirtualInfo(descr, fielddescrs)
 
     def visit_vstruct(self, typedescr, fielddescrs):
         return VStructInfo(typedescr, fielddescrs)
@@ -392,20 +390,20 @@
                 liveboxes[i] = box
             else:
                 assert tagbits == TAGVIRTUAL
-                value = optimizer.getvalue(box)
-                value.visitor_walk_recursive(self)
+                info = optimizer.getptrinfo(box)
+                info.visitor_walk_recursive(box, self)
 
-        for item in pending_setfields:
-            pass
-            #_, box, fieldbox, _ = item
-            # XXX fixme
-            #self.register_box(box)
-            #self.register_box(fieldbox)
-            #value = optimizer.getvalue(fieldbox)
-            #value.visitor_walk_recursive(self)
+        for setfield_op in pending_setfields:
+            box = setfield_op.getarg(0)
+            fieldbox = setfield_op.getarg(1)
+            self.register_box(box)
+            self.register_box(fieldbox)
+            info = optimizer.getptrinfo(fieldbox)
+            assert info is not None and info.is_virtual()
+            info.visitor_walk_recursive(fieldbox, self)
 
         self._number_virtuals(liveboxes, optimizer, v)
-        self._add_pending_fields([]) # XXX fixme pending_setfields)
+        self._add_pending_fields(pending_setfields)
 
         storage.rd_consts = self.memo.consts
         return liveboxes[:]
@@ -450,10 +448,12 @@
             memo.nvholes += length - len(vfieldboxes)
             for virtualbox, fieldboxes in vfieldboxes.iteritems():
                 num, _ = untag(self.liveboxes[virtualbox])
-                value = optimizer.getvalue(virtualbox)
+                info = optimizer.getptrinfo(virtualbox)
+                assert info.is_virtual()
                 fieldnums = [self._gettagged(box)
                              for box in fieldboxes]
-                vinfo = self.make_virtual_info(value, fieldnums)
+                descr = info.vdescr
+                vinfo = self.make_virtual_info(descr, info, fieldnums)
                 # if a new vinfo instance is made, we get the fieldnums list we
                 # pass in as an attribute. hackish.
                 if vinfo.fieldnums is not fieldnums:
@@ -478,19 +478,23 @@
             n = len(pending_setfields)
             rd_pendingfields = lltype.malloc(PENDINGFIELDSP.TO, n)
             for i in range(n):
-                descr, box, fieldbox, itemindex = pending_setfields[i]
+                op = pending_setfields[i]
+                box = op.getarg(0)
+                fieldbox = op.getarg(1)
+                descr = op.getdescr()
+                #descr, box, fieldbox, itemindex = pending_setfields[i]
                 lldescr = annlowlevel.cast_instance_to_base_ptr(descr)
                 num = self._gettagged(box)
                 fieldnum = self._gettagged(fieldbox)
                 # the index is limited to 2147483647 (64-bit machines only)
-                if itemindex > 2147483647:
-                    raise TagOverflow
-                itemindex = rffi.cast(rffi.INT, itemindex)
+                #if itemindex > 2147483647:
+                #    raise TagOverflow
+                #itemindex = rffi.cast(rffi.INT, itemindex)
                 #
                 rd_pendingfields[i].lldescr = lldescr
                 rd_pendingfields[i].num = num
                 rd_pendingfields[i].fieldnum = fieldnum
-                rd_pendingfields[i].itemindex = itemindex
+                rd_pendingfields[i].itemindex = rffi.cast(rffi.INT, 0) # XXXX 
itemindex
         self.storage.rd_pendingfields = rd_pendingfields
 
     def _gettagged(self, box):
@@ -538,13 +542,13 @@
                         str(untag(self.fieldnums[i])))
 
 class VirtualInfo(AbstractVirtualStructInfo):
-    def __init__(self, known_class, fielddescrs):
+    def __init__(self, descr, fielddescrs):
         AbstractVirtualStructInfo.__init__(self, fielddescrs)
-        self.known_class = known_class
+        self.descr = descr
 
     @specialize.argtype(1)
     def allocate(self, decoder, index):
-        struct = decoder.allocate_with_vtable(self.known_class)
+        struct = decoder.allocate_with_vtable(descr=self.descr)
         decoder.virtuals_cache.set_ptr(index, struct)
         return self.setfields(decoder, struct)
 
@@ -1008,8 +1012,8 @@
         virtualref_boxes = self.consume_virtualref_boxes(numb, end)
         return virtualizable_boxes, virtualref_boxes
 
-    def allocate_with_vtable(self, known_class):
-        return self.metainterp.execute_new_with_vtable(known_class)
+    def allocate_with_vtable(self, descr=None):
+        return self.metainterp.execute_new_with_vtable(descr=descr)
 
     def allocate_struct(self, typedescr):
         return self.metainterp.execute_new(typedescr)
diff --git a/rpython/jit/metainterp/test/test_resume.py 
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -159,9 +159,8 @@
         self.trace.append((opnum, list(argboxes), resvalue, descr))
         return op
 
-    def execute_new_with_vtable(self, known_class):
-        return self.execute_and_record(rop.NEW_WITH_VTABLE, None,
-                                       known_class)
+    def execute_new_with_vtable(self, descr=None):
+        return self.execute_and_record(rop.NEW_WITH_VTABLE, descr)
 
     def execute_new(self, typedescr):
         return self.execute_and_record(rop.NEW, typedescr)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to