Author: Armin Rigo <[email protected]>
Branch: continulet-jit-3
Changeset: r58252:f476428da6ef
Date: 2012-10-19 19:14 +0200
http://bitbucket.org/pypy/pypy/changeset/f476428da6ef/

Log:    Enough to pass the test and another one about virtualizables with
        arrays.

diff --git a/pypy/jit/backend/llgraph/runner.py 
b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -135,6 +135,14 @@
     def is_pointer_field(self):
         return True
 
+class JFValueDescr(AbstractDescr):
+    def __init__(self, kind):
+        self.kind = kind
+    def is_pointer_field(self):
+        return self.kind == 'ref'
+    def is_float_field(self):
+        return self.kind == 'float'
+
 _example_res = {'v': None,
                 'r': lltype.nullptr(llmemory.GCREF.TO),
                 'i': 0,
@@ -149,6 +157,10 @@
 
     JITFRAMEPTR = llmemory.GCREF
 
+    jfdescr_for_int   = JFValueDescr('int')
+    jfdescr_for_ref   = JFValueDescr('ref')
+    jfdescr_for_float = JFValueDescr('float')
+
     def __init__(self, rtyper, stats=None, *ignored_args, **ignored_kwds):
         model.AbstractCPU.__init__(self)
         self.rtyper = rtyper
@@ -381,7 +393,11 @@
 
     def bh_getfield_gc(self, p, descr):
         if isinstance(descr, JFDescrDescr):
-            p.latest_descr._TYPE = llmemory.GCREF # <XXX> HACK <XXX/>
+            result = p.latest_descr
+            # <XXX> HACK
+            result._TYPE = llmemory.GCREF
+            result._identityhash = lambda: hash(result)   # for rd_hash()
+            # <XXX/>
             return p.latest_descr
         p = support.cast_arg(lltype.Ptr(descr.S), p)
         return support.cast_result(descr.FIELD, getattr(p, descr.fieldname))
@@ -445,6 +461,9 @@
     bh_setarrayitem_raw_f = bh_setarrayitem_raw
 
     def bh_getinteriorfield_gc(self, a, index, descr):
+        if isinstance(descr, JFValueDescr):
+            assert isinstance(a, LLFrame)
+            return a.latest_values[index]
         array = a._obj.container
         return support.cast_result(descr.FIELD,
                           getattr(array.getitem(index), descr.fieldname))
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -595,6 +595,14 @@
         self.metainterp_sd = metainterp_sd
         self.jitdriver_sd = jitdriver_sd
 
+    def store_final_boxes(self, guard_op, boxes):
+        # override this method to also store the length on 'self'
+        ResumeGuardDescr.store_final_boxes(self, guard_op, boxes)
+        self.latest_value_count = len(boxes)
+
+    def get_latest_value_count(self):
+        return self.latest_value_count
+
     def handle_fail(self, metainterp_sd, jitdriver_sd, jitframe):
         # Failures of a GUARD_NOT_FORCED are never compiled, but
         # always just blackholed.  First fish for the data saved when
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -751,7 +751,7 @@
         if not descr:
             return
         resume.rebuild_virtualizable_from_resumedata(self.metainterp, descr,
-                                                     vinfo, box)
+                                                     vinfo, box, jfbox)
 
     def _get_virtualizable_field_index(self, fielddescr):
         # Get the index of a fielddescr.  Must only be called for
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -1004,21 +1004,58 @@
     def write_a_float(self, index, box):
         self.boxes_f[index] = box
 
-def rebuild_virtualizable_from_resumedata(metainterp, storage,
-                                          virtualizable_info, vable_box):
+def rebuild_virtualizable_from_resumedata(metainterp, storage, vinfo,
+                                          vable_box, jfbox):
     resumereader = ResumeDataForceVirtualizableReader(storage, metainterp,
-                                                      vable_box)
-    resumereader.consume_vref_and_vable_boxes(virtualizable_info,
-                                              None)
+                                                      jfbox)
+    numb = resumereader.cur_numb
+    virtualizable = vinfo.unwrap_virtualizable_box(vable_box)
+    boxes = vinfo.load_list_of_boxes(virtualizable, resumereader, numb)
+    #
+    for i in range(len(vinfo.static_field_descrs)):
+        descr = vinfo.static_field_descrs[i]
+        metainterp.execute_and_record(rop.SETFIELD_GC, descr,
+                                      vable_box, boxes[i])
+    srcindex = len(vinfo.static_field_descrs)
+    for array_index in range(len(vinfo.array_field_descrs)):
+        length = vinfo.get_array_length(virtualizable, array_index)
+        box_array = metainterp.execute_and_record(rop.GETFIELD_GC,
+                        vinfo.array_field_descrs[array_index], vable_box)
+        array_descr = vinfo.array_descrs[array_index]
+        for i in range(length):
+            metainterp.execute_and_record(rop.SETARRAYITEM_GC, array_descr,
+                                          box_array, ConstInt(i),
+                                          boxes[srcindex])
+            srcindex += 1
+    assert srcindex + 1 == len(boxes)
 
 class ResumeDataForceVirtualizableReader(ResumeDataBoxReader):
-    def __init__(self, storage, metainterp, vable_box):
+    def __init__(self, storage, metainterp, jfbox):
         self.metainterp = metainterp
         self._init(metainterp.cpu, storage)
-        self.liveboxes = [None] * xxx
+        count = storage.get_latest_value_count()
+        self.liveboxes = [None] * count
+        self.jfbox = jfbox
+        self._prepare_virtuals(storage.rd_virtuals)
 
     def load_box_from_cpu(self, num, kind):
-        xxx
+        if num < 0:
+            num += len(self.liveboxes)
+            assert num >= 0
+        cpu = self.metainterp.cpu
+        if kind == INT:
+            descr = cpu.jfdescr_for_int
+        elif kind == REF:
+            descr = cpu.jfdescr_for_ref
+        elif kind == FLOAT:
+            descr = cpu.jfdescr_for_float
+        else:
+            assert 0, "bad kind: %d" % ord(kind)
+        box = self.metainterp.execute_and_record(rop.GETINTERIORFIELD_GC,
+                                                 descr, self.jfbox,
+                                                 ConstInt(num))
+        self.liveboxes[num] = box
+        return box
 
 # ---------- when resuming for blackholing, get direct values ----------
 
diff --git a/pypy/jit/metainterp/test/test_recursive.py 
b/pypy/jit/metainterp/test/test_recursive.py
--- a/pypy/jit/metainterp/test/test_recursive.py
+++ b/pypy/jit/metainterp/test/test_recursive.py
@@ -867,6 +867,9 @@
                 self.l = l
                 self.s = s
 
+        class Oups(Exception):
+            pass
+
         def main(codeno, n, a):
             frame = Frame([a, a+1, a+2, a+3], 0)
             return f(codeno, n, a, frame)
@@ -886,11 +889,14 @@
                 if codeno == 0:
                     subframe = Frame([n, n+1, n+2, n+3], 0)
                     x += f(1, 10, 1, subframe)
+                    if subframe.l[3] != 42:
+                        raise Oups
                 s = frame.s
                 assert s >= 0
                 x += frame.l[s]
                 x += len(frame.l)
                 frame.s -= 1
+            frame.l[3] = 42
             return x
 
         res = self.meta_interp(main, [0, 10, 1], listops=True, inline=True)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to