Author: Armin Rigo <ar...@tunes.org> Branch: optresult-unroll Changeset: r79203:c04209abbad1 Date: 2015-08-24 15:26 +0200 http://bitbucket.org/pypy/pypy/changeset/c04209abbad1/
Log: Fix fix fix 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 @@ -96,6 +96,7 @@ self._is_object = vtable is not None self.all_fielddescrs = heaptracker.all_fielddescrs(runner, S, get_field_descr=LLGraphCPU.fielddescrof) + self._runner = runner def get_all_fielddescrs(self): return self.all_fielddescrs @@ -104,6 +105,10 @@ return self._is_object def get_vtable(self): + assert self._vtable is not None + if self._vtable is Ellipsis: + self._vtable = heaptracker.get_vtable_for_gcstruct(self._runner, + self.S) return heaptracker.adr2int(llmemory.cast_ptr_to_adr(self._vtable)) def count_fields_if_immutable(self): @@ -411,11 +416,14 @@ def sizeof(self, S, vtable): key = ('size', S) try: - return self.descrs[key] + descr = self.descrs[key] except KeyError: descr = SizeDescr(S, vtable, self) self.descrs[key] = descr - return descr + if descr._is_object and vtable is not Ellipsis: + assert vtable + heaptracker.testing_gcstruct2vtable.setdefault(S, vtable) + return descr def fielddescrof(self, S, fieldname): key = ('field', S, fieldname) @@ -424,8 +432,7 @@ except KeyError: descr = FieldDescr(S, fieldname) self.descrs[key] = descr - is_obj = heaptracker.has_gcstruct_a_vtable(S) - descr.parent_descr = self.sizeof(S, is_obj) + descr.parent_descr = self.sizeof(S, Ellipsis) if self.vinfo_for_tests is not None: descr.vinfo = self.vinfo_for_tests return descr diff --git a/rpython/jit/backend/llsupport/descr.py b/rpython/jit/backend/llsupport/descr.py --- a/rpython/jit/backend/llsupport/descr.py +++ b/rpython/jit/backend/llsupport/descr.py @@ -195,10 +195,10 @@ cachedict = cache.setdefault(STRUCT, {}) cachedict[fieldname] = fielddescr if STRUCT is rclass.OBJECT: - fielddescr.parent_descr = get_size_descr(gccache, STRUCT, None) + vtable = None else: - fielddescr.parent_descr = get_size_descr(gccache, STRUCT, - heaptracker.get_vtable_for_gcstruct(gccache, STRUCT)) + vtable = heaptracker.get_vtable_for_gcstruct(gccache, STRUCT) + fielddescr.parent_descr = get_size_descr(gccache, STRUCT, vtable) return fielddescr def get_type_flag(TYPE): diff --git a/rpython/jit/codewriter/heaptracker.py b/rpython/jit/codewriter/heaptracker.py --- a/rpython/jit/codewriter/heaptracker.py +++ b/rpython/jit/codewriter/heaptracker.py @@ -67,12 +67,14 @@ if not has_gcstruct_a_vtable(GCSTRUCT): return None setup_cache_gcstruct2vtable(gccache) - return gccache._cache_gcstruct2vtable[GCSTRUCT] + try: + return gccache._cache_gcstruct2vtable[GCSTRUCT] + except KeyError: + return testing_gcstruct2vtable[GCSTRUCT] def setup_cache_gcstruct2vtable(gccache): if not hasattr(gccache, '_cache_gcstruct2vtable'): cache = {} - cache.update(testing_gcstruct2vtable) if gccache.rtyper: for rinstance in gccache.rtyper.instance_reprs.values(): cache[rinstance.lowleveltype.TO] = rinstance.rclass.getvtable() diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py --- a/rpython/jit/metainterp/optimizeopt/test/test_util.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py @@ -121,9 +121,9 @@ myptr2 = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(NODE)) nullptr = lltype.nullptr(llmemory.GCREF.TO) #nodebox2 = InputArgRef(lltype.cast_opaque_ptr(llmemory.GCREF, node2)) - nodesize = cpu.sizeof(NODE, True) - nodesize2 = cpu.sizeof(NODE2, True) - nodesize3 = cpu.sizeof(NODE3, True) + nodesize = cpu.sizeof(NODE, node_vtable) + nodesize2 = cpu.sizeof(NODE2, node_vtable2) + nodesize3 = cpu.sizeof(NODE3, node_vtable3) valuedescr = cpu.fielddescrof(NODE, 'value') floatdescr = cpu.fielddescrof(NODE, 'floatval') chardescr = cpu.fielddescrof(NODE, 'charval') @@ -139,7 +139,7 @@ QUASI = lltype.GcStruct('QUASIIMMUT', ('inst_field', lltype.Signed), ('mutate_field', rclass.OBJECTPTR), hints={'immutable_fields': accessor}) - quasisize = cpu.sizeof(QUASI, False) + quasisize = cpu.sizeof(QUASI, None) quasi = lltype.malloc(QUASI, immortal=True) quasi.inst_field = -4247 quasifielddescr = cpu.fielddescrof(QUASI, 'inst_field') @@ -162,8 +162,8 @@ intobj_immut_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True) noimmut_intval = cpu.fielddescrof(INTOBJ_NOIMMUT, 'intval') immut_intval = cpu.fielddescrof(INTOBJ_IMMUT, 'intval') - noimmut_descr = cpu.sizeof(INTOBJ_NOIMMUT, True) - immut_descr = cpu.sizeof(INTOBJ_IMMUT, True) + noimmut_descr = cpu.sizeof(INTOBJ_NOIMMUT, intobj_noimmut_vtable) + immut_descr = cpu.sizeof(INTOBJ_IMMUT, intobj_immut_vtable) PTROBJ_IMMUT = lltype.GcStruct('PTROBJ_IMMUT', ('parent', OBJECT), ('ptrval', lltype.Ptr(OBJECT)), @@ -178,7 +178,7 @@ # a GcStruct not inheriting from OBJECT S = lltype.GcStruct('TUPLE', ('a', lltype.Signed), ('abis', lltype.Signed), ('b', lltype.Ptr(NODE))) - ssize = cpu.sizeof(S, False) + ssize = cpu.sizeof(S, None) adescr = cpu.fielddescrof(S, 'a') abisdescr = cpu.fielddescrof(S, 'abis') bdescr = cpu.fielddescrof(S, 'b') @@ -201,7 +201,7 @@ inst_w_list = cpu.fielddescrof(W_ROOT, 'inst_w_list') w_root_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True) - tsize = cpu.sizeof(T, False) + tsize = cpu.sizeof(T, None) cdescr = cpu.fielddescrof(T, 'c') ddescr = cpu.fielddescrof(T, 'd') arraydescr3 = cpu.arraydescrof(lltype.GcArray(lltype.Ptr(NODE))) @@ -214,10 +214,10 @@ SIMPLE = lltype.GcStruct('simple', ('parent', OBJECT), ('value', lltype.Signed)) - simpledescr = cpu.sizeof(SIMPLE, True) simplevalue = cpu.fielddescrof(SIMPLE, 'value') simple_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True) - usize = cpu.sizeof(U, True) + simpledescr = cpu.sizeof(SIMPLE, simple_vtable) + #usize = cpu.sizeof(U, ...) onedescr = cpu.fielddescrof(U, 'one') FUNC = lltype.FuncType([lltype.Signed], lltype.Signed) @@ -349,7 +349,7 @@ jit_virtual_ref_vtable = vrefinfo.jit_virtual_ref_vtable jvr_vtable_adr = llmemory.cast_ptr_to_adr(jit_virtual_ref_vtable) - vref_descr = cpu.sizeof(vrefinfo.JIT_VIRTUAL_REF, False) + vref_descr = cpu.sizeof(vrefinfo.JIT_VIRTUAL_REF, jit_virtual_ref_vtable) namespace = locals() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit