[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