Author: Armin Rigo <ar...@tunes.org> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit