Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult Changeset: r78109:db9ae212ed3c Date: 2015-06-15 13:00 +0200 http://bitbucket.org/pypy/pypy/changeset/db9ae212ed3c/
Log: an attempt to sort out vtable mess 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 @@ -89,9 +89,9 @@ return getkind(self.RESULT)[0] class SizeDescr(AbstractDescr): - def __init__(self, S, is_object, runner): + def __init__(self, S, vtable, runner): self.S = S - self._is_object = is_object + self._is_object = vtable is not None self.all_fielddescrs = heaptracker.all_fielddescrs(runner, S, get_field_descr=LLGraphCPU.fielddescrof) @@ -398,12 +398,12 @@ self.descrs[key] = descr return descr - def sizeof(self, S, is_object): + def sizeof(self, S, vtable): key = ('size', S) try: return self.descrs[key] except KeyError: - descr = SizeDescr(S, is_object, self) + descr = SizeDescr(S, vtable, self) self.descrs[key] = descr 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 @@ -70,7 +70,7 @@ BaseSizeDescr = SizeDescr -def get_size_descr(gccache, STRUCT, is_object): +def get_size_descr(gccache, STRUCT, vtable): cache = gccache._cache_size try: return cache[STRUCT] @@ -78,11 +78,10 @@ size = symbolic.get_size(STRUCT, gccache.translate_support_code) count_fields_if_immut = heaptracker.count_fields_if_immutable(STRUCT) gc_fielddescrs = heaptracker.gc_fielddescrs(gccache, STRUCT) - if is_object: + if vtable: assert heaptracker.has_gcstruct_a_vtable(STRUCT) sizedescr = SizeDescrWithVTable(size, count_fields_if_immut, - gc_fielddescrs, None, - heaptracker.get_vtable_for_gcstruct(gccache, STRUCT)) + gc_fielddescrs, None, vtable) else: assert not heaptracker.has_gcstruct_a_vtable(STRUCT) sizedescr = SizeDescr(size, count_fields_if_immut, @@ -193,7 +192,7 @@ cachedict = cache.setdefault(STRUCT, {}) cachedict[fieldname] = fielddescr fielddescr.parent_descr = get_size_descr(gccache, STRUCT, - heaptracker.has_gcstruct_a_vtable(STRUCT)) + heaptracker.get_vtable_for_gcstruct(STRUCT)) return fielddescr def get_type_flag(TYPE): diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py --- a/rpython/jit/backend/llsupport/llmodel.py +++ b/rpython/jit/backend/llsupport/llmodel.py @@ -298,8 +298,8 @@ def cast_int_to_ptr(self, x, TYPE): return rffi.cast(TYPE, x) - def sizeof(self, S, is_object): - return get_size_descr(self.gc_ll_descr, S, is_object) + def sizeof(self, S, vtable): + return get_size_descr(self.gc_ll_descr, S, vtable) def fielddescrof(self, STRUCT, fieldname): return get_field_descr(self.gc_ll_descr, STRUCT, fieldname) 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 @@ -64,8 +64,6 @@ if not has_gcstruct_a_vtable(GCSTRUCT): return None setup_cache_gcstruct2vtable(gccache) - if not hasattr(gccache, '_cache_gcstruct2vtable'): - return lltype.malloc(GCSTRUCT.typeptr.TO, flavor='raw', immortal=True) return gccache._cache_gcstruct2vtable[GCSTRUCT] def setup_cache_gcstruct2vtable(gccache): diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -933,7 +933,8 @@ opname = 'new_with_vtable' else: opname = 'new' - sizedescr = self.cpu.sizeof(STRUCT, opname == 'new_with_vtable') + vtable = None + sizedescr = self.cpu.sizeof(STRUCT, vtable) op1 = SpaceOperation(opname, [sizedescr], op.result) if zero: return self.zero_contents([op1], op.result, STRUCT) diff --git a/rpython/jit/metainterp/virtualref.py b/rpython/jit/metainterp/virtualref.py --- a/rpython/jit/metainterp/virtualref.py +++ b/rpython/jit/metainterp/virtualref.py @@ -20,6 +20,8 @@ self.jit_virtual_ref_vtable = lltype.malloc(rclass.OBJECT_VTABLE, zero=True, flavor='raw', immortal=True) + self.descr = self.cpu.sizeof(self.JIT_VIRTUAL_REF, + vtable=self.jit_virtual_ref_vtable) self.jit_virtual_ref_vtable.name = rclass.alloc_array_name( 'jit_virtual_ref') # build some constants @@ -33,7 +35,6 @@ self.descr_virtual_token = fielddescrof(self.JIT_VIRTUAL_REF, 'virtual_token') self.descr_forced = fielddescrof(self.JIT_VIRTUAL_REF, 'forced') - self.descr = self.cpu.sizeof(self.JIT_VIRTUAL_REF, False) # # record the type JIT_VIRTUAL_REF explicitly in the rtyper, too if hasattr(self.warmrunnerdesc, 'rtyper'): # <-- for tests _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit