[pypy-commit] pypy optresult: an attempt to sort out vtable mess
fijal
noreply at buildbot.pypy.org
Mon Jun 15 13:09:03 CEST 2015
Author: Maciej Fijalkowski <fijall at 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
More information about the pypy-commit
mailing list