Author: Armin Rigo <[email protected]>
Branch:
Changeset: r70554:0d99c4a82b27
Date: 2014-04-11 16:34 +0200
http://bitbucket.org/pypy/pypy/changeset/0d99c4a82b27/
Log: Fix the test in 43da018e7015: consistently call new methods on the
metainterp from both the opimpl_xxx and from resume.py
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
@@ -387,24 +387,17 @@
@arguments("descr")
def opimpl_new(self, sizedescr):
- resbox = self.execute_with_descr(rop.NEW, sizedescr)
- self.metainterp.heapcache.new(resbox)
- return resbox
+ return self.metainterp.execute_new(sizedescr)
@arguments("descr")
def opimpl_new_with_vtable(self, sizedescr):
cpu = self.metainterp.cpu
cls = heaptracker.descr2vtable(cpu, sizedescr)
- resbox = self.execute(rop.NEW_WITH_VTABLE, ConstInt(cls))
- self.metainterp.heapcache.new(resbox)
- self.metainterp.heapcache.class_now_known(resbox)
- return resbox
+ return self.metainterp.execute_new_with_vtable(ConstInt(cls))
@arguments("box", "descr")
def opimpl_new_array(self, lengthbox, itemsizedescr):
- resbox = self.execute_with_descr(rop.NEW_ARRAY, itemsizedescr,
lengthbox)
- self.metainterp.heapcache.new_array(resbox, lengthbox)
- return resbox
+ return self.metainterp.execute_new_array(itemsizedescr, lengthbox)
@specialize.arg(1)
def _do_getarrayitem_gc_any(self, op, arraybox, indexbox, arraydescr):
@@ -467,10 +460,8 @@
@arguments("box", "box", "box", "descr")
def _opimpl_setarrayitem_gc_any(self, arraybox, indexbox, itembox,
arraydescr):
- self.execute_with_descr(rop.SETARRAYITEM_GC, arraydescr, arraybox,
- indexbox, itembox)
- self.metainterp.heapcache.setarrayitem(
- arraybox, indexbox, itembox, arraydescr)
+ self.metainterp.execute_setarrayitem_gc(arraydescr, arraybox,
+ indexbox, itembox)
opimpl_setarrayitem_gc_i = _opimpl_setarrayitem_gc_any
opimpl_setarrayitem_gc_r = _opimpl_setarrayitem_gc_any
@@ -623,21 +614,22 @@
tobox = self.metainterp.heapcache.getfield(box, fielddescr)
if tobox is valuebox:
return
- # The following test is disabled because buggy. It is supposed
+ self.metainterp.execute_setfield_gc(fielddescr, box, valuebox)
+ # The following logic is disabled because buggy. It is supposed
# to be: not(we're writing null into a freshly allocated object)
# but the bug is that is_unescaped() can be True even after the
# field cache is cleared --- see test_ajit:test_unescaped_write_zero
- if 1: # tobox is not None or not
self.metainterp.heapcache.is_unescaped(box) or not isinstance(valuebox, Const)
or valuebox.nonnull():
- self.execute_with_descr(rop.SETFIELD_GC, fielddescr, box, valuebox)
- self.metainterp.heapcache.setfield(box, valuebox, fielddescr)
+ #
+ # if tobox is not None or not
self.metainterp.heapcache.is_unescaped(box) or not isinstance(valuebox, Const)
or valuebox.nonnull():
+ # self.execute_with_descr(rop.SETFIELD_GC, fielddescr, box, valuebox)
+ # self.metainterp.heapcache.setfield(box, valuebox, fielddescr)
opimpl_setfield_gc_i = _opimpl_setfield_gc_any
opimpl_setfield_gc_r = _opimpl_setfield_gc_any
opimpl_setfield_gc_f = _opimpl_setfield_gc_any
@arguments("box", "box", "box", "descr")
def _opimpl_setinteriorfield_gc_any(self, array, index, value, descr):
- self.execute_with_descr(rop.SETINTERIORFIELD_GC, descr,
- array, index, value)
+ self.metainterp.execute_setinteriorfield_gc(descr, array, index, value)
opimpl_setinteriorfield_gc_i = _opimpl_setinteriorfield_gc_any
opimpl_setinteriorfield_gc_f = _opimpl_setinteriorfield_gc_any
opimpl_setinteriorfield_gc_r = _opimpl_setinteriorfield_gc_any
@@ -664,8 +656,8 @@
@arguments("box", "box", "box", "descr")
def _opimpl_raw_store(self, addrbox, offsetbox, valuebox, arraydescr):
- self.execute_with_descr(rop.RAW_STORE, arraydescr,
- addrbox, offsetbox, valuebox)
+ self.metainterp.execute_raw_store(arraydescr,
+ addrbox, offsetbox, valuebox)
opimpl_raw_store_i = _opimpl_raw_store
opimpl_raw_store_f = _opimpl_raw_store
@@ -1891,6 +1883,41 @@
self.attach_debug_info(op)
return resbox
+ def execute_new_with_vtable(self, known_class):
+ resbox = self.execute_and_record(rop.NEW_WITH_VTABLE, None,
+ known_class)
+ self.heapcache.new(resbox)
+ self.heapcache.class_now_known(resbox)
+ return resbox
+
+ def execute_new(self, typedescr):
+ resbox = self.execute_and_record(rop.NEW, typedescr)
+ self.heapcache.new(resbox)
+ return resbox
+
+ def execute_new_array(self, itemsizedescr, lengthbox):
+ resbox = self.execute_and_record(rop.NEW_ARRAY, itemsizedescr,
+ lengthbox)
+ self.heapcache.new_array(resbox, lengthbox)
+ return resbox
+
+ def execute_setfield_gc(self, fielddescr, box, valuebox):
+ self.execute_and_record(rop.SETFIELD_GC, fielddescr, box, valuebox)
+ self.heapcache.setfield(box, valuebox, fielddescr)
+
+ def execute_setarrayitem_gc(self, arraydescr, arraybox, indexbox, itembox):
+ self.execute_and_record(rop.SETARRAYITEM_GC, arraydescr,
+ arraybox, indexbox, itembox)
+ self.heapcache.setarrayitem(arraybox, indexbox, itembox, arraydescr)
+
+ def execute_setinteriorfield_gc(self, descr, array, index, value):
+ self.execute_and_record(rop.SETINTERIORFIELD_GC, descr,
+ array, index, value)
+
+ def execute_raw_store(self, arraydescr, addrbox, offsetbox, valuebox):
+ self.execute_and_record(rop.RAW_STORE, arraydescr,
+ addrbox, offsetbox, valuebox)
+
def attach_debug_info(self, op):
if (not we_are_translated() and op is not None
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
@@ -954,15 +954,14 @@
return virtualizable_boxes, virtualref_boxes
def allocate_with_vtable(self, known_class):
- return self.metainterp.execute_and_record(rop.NEW_WITH_VTABLE,
- None, known_class)
+ return self.metainterp.execute_new_with_vtable(known_class)
def allocate_struct(self, typedescr):
- return self.metainterp.execute_and_record(rop.NEW, typedescr)
+ return self.metainterp.execute_new(typedescr)
def allocate_array(self, length, arraydescr):
- return self.metainterp.execute_and_record(rop.NEW_ARRAY,
- arraydescr, ConstInt(length))
+ lengthbox = ConstInt(length)
+ return self.metainterp.execute_new_array(arraydescr, lengthbox)
def allocate_raw_buffer(self, size):
cic = self.metainterp.staticdata.callinfocollection
@@ -1034,8 +1033,7 @@
else:
kind = INT
fieldbox = self.decode_box(fieldnum, kind)
- self.metainterp.execute_and_record(rop.SETFIELD_GC, descr,
- structbox, fieldbox)
+ self.metainterp.execute_setfield_gc(descr, structbox, fieldbox)
def setinteriorfield(self, index, array, fieldnum, descr):
if descr.is_pointer_field():
@@ -1045,8 +1043,8 @@
else:
kind = INT
fieldbox = self.decode_box(fieldnum, kind)
- self.metainterp.execute_and_record(rop.SETINTERIORFIELD_GC, descr,
- array, ConstInt(index), fieldbox)
+ self.metainterp.execute_setinteriorfield_gc(descr, array,
+ ConstInt(index), fieldbox)
def setarrayitem_int(self, arraybox, index, fieldnum, arraydescr):
self._setarrayitem(arraybox, index, fieldnum, arraydescr, INT)
@@ -1059,9 +1057,8 @@
def _setarrayitem(self, arraybox, index, fieldnum, arraydescr, kind):
itembox = self.decode_box(fieldnum, kind)
- self.metainterp.execute_and_record(rop.SETARRAYITEM_GC,
- arraydescr, arraybox,
- ConstInt(index), itembox)
+ self.metainterp.execute_setarrayitem_gc(arraydescr, arraybox,
+ ConstInt(index), itembox)
def setrawbuffer_item(self, bufferbox, fieldnum, offset, arraydescr):
if arraydescr.is_array_of_pointers():
@@ -1071,8 +1068,8 @@
else:
kind = INT
itembox = self.decode_box(fieldnum, kind)
- return self.metainterp.execute_and_record(rop.RAW_STORE, arraydescr,
bufferbox,
- ConstInt(offset), itembox)
+ self.metainterp.execute_raw_store(arraydescr, bufferbox,
+ ConstInt(offset), itembox)
def decode_int(self, tagged):
return self.decode_box(tagged, INT)
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
@@ -93,6 +93,32 @@
self.resboxes.append(resbox)
return resbox
+ def execute_new_with_vtable(self, known_class):
+ return self.execute_and_record(rop.NEW_WITH_VTABLE, None,
+ known_class)
+
+ def execute_new(self, typedescr):
+ return self.execute_and_record(rop.NEW, typedescr)
+
+ def execute_new_array(self, itemsizedescr, lengthbox):
+ return self.execute_and_record(rop.NEW_ARRAY, itemsizedescr,
+ lengthbox)
+
+ def execute_setfield_gc(self, fielddescr, box, valuebox):
+ self.execute_and_record(rop.SETFIELD_GC, fielddescr, box, valuebox)
+
+ def execute_setarrayitem_gc(self, arraydescr, arraybox, indexbox, itembox):
+ self.execute_and_record(rop.SETARRAYITEM_GC, arraydescr,
+ arraybox, indexbox, itembox)
+
+ def execute_setinteriorfield_gc(self, descr, array, index, value):
+ self.execute_and_record(rop.SETINTERIORFIELD_GC, descr,
+ array, index, value)
+
+ def execute_raw_store(self, arraydescr, addrbox, offsetbox, valuebox):
+ self.execute_and_record(rop.RAW_STORE, arraydescr,
+ addrbox, offsetbox, valuebox)
+
S = lltype.GcStruct('S')
gcref1 = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(S))
gcref2 = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(S))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit