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