[pypy-commit] pypy optresult: fix the backend

fijal noreply at buildbot.pypy.org
Tue Jun 2 13:47:06 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77757:4180412b78a9
Date: 2015-06-02 13:47 +0200
http://bitbucket.org/pypy/pypy/changeset/4180412b78a9/

Log:	fix the backend

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
@@ -66,7 +66,7 @@
 
 BaseSizeDescr = SizeDescr
 
-def get_size_descr(cpu, gccache, STRUCT, is_object):
+def get_size_descr(gccache, STRUCT, is_object):
     cache = gccache._cache_size
     try:
         return cache[STRUCT]
@@ -74,13 +74,13 @@
         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: #heaptracker.has_gcstruct_a_vtable(STRUCT):
-            #assert is_object
+        if is_object:
+            assert heaptracker.has_gcstruct_a_vtable(STRUCT)
             sizedescr = SizeDescrWithVTable(size, count_fields_if_immut,
                                             gc_fielddescrs, None,
-                heaptracker.get_vtable_for_gcstruct(cpu, STRUCT))
+                heaptracker.get_vtable_for_gcstruct(gccache, STRUCT))
         else:
-            #assert not is_object
+            assert not heaptracker.has_gcstruct_a_vtable(STRUCT)
             sizedescr = SizeDescr(size, count_fields_if_immut,
                                   gc_fielddescrs, None)
         gccache.init_size_descr(STRUCT, sizedescr)
@@ -172,7 +172,8 @@
         fielddescr = FieldDescr(name, offset, size, flag, index_in_parent)
         cachedict = cache.setdefault(STRUCT, {})
         cachedict[fieldname] = fielddescr
-        fielddescr.parent_descr = get_size_descr(None, gccache, STRUCT, False)
+        fielddescr.parent_descr = get_size_descr(gccache, STRUCT,
+                                  heaptracker.has_gcstruct_a_vtable(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
@@ -299,7 +299,7 @@
         return rffi.cast(TYPE, x)
 
     def sizeof(self, S, is_object):
-        return get_size_descr(self, self.gc_ll_descr, S, is_object)
+        return get_size_descr(self.gc_ll_descr, S, is_object)
 
     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
@@ -56,24 +56,24 @@
             return False
     return True
 
-def get_vtable_for_gcstruct(cpu, GCSTRUCT):
+def get_vtable_for_gcstruct(gccache, GCSTRUCT):
     # xxx hack: from a GcStruct representing an instance's
     # lowleveltype, return the corresponding vtable pointer.
     # Returns None if the GcStruct does not belong to an instance.
     assert isinstance(GCSTRUCT, lltype.GcStruct)
     if not has_gcstruct_a_vtable(GCSTRUCT):
         return None
-    setup_cache_gcstruct2vtable(cpu)
-    return cpu._cache_gcstruct2vtable[GCSTRUCT]
+    setup_cache_gcstruct2vtable(gccache)
+    return gccache._cache_gcstruct2vtable[GCSTRUCT]
 
-def setup_cache_gcstruct2vtable(cpu):
-    if not hasattr(cpu, '_cache_gcstruct2vtable'):
+def setup_cache_gcstruct2vtable(gccache):
+    if not hasattr(gccache, '_cache_gcstruct2vtable'):
         cache = {}
         cache.update(testing_gcstruct2vtable)
-        if cpu.rtyper:
-            for rinstance in cpu.rtyper.instance_reprs.values():
+        if gccache.rtyper:
+            for rinstance in gccache.rtyper.instance_reprs.values():
                 cache[rinstance.lowleveltype.TO] = rinstance.rclass.getvtable()
-        cpu._cache_gcstruct2vtable = cache
+            gccache._cache_gcstruct2vtable = cache
 
 def set_testing_vtable_for_gcstruct(GCSTRUCT, vtable, name):
     # only for tests that need to register the vtable of their malloc'ed
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
@@ -27,6 +27,7 @@
         adr = heaptracker.adr2int(adr)
         self.jit_virtual_ref_const_class = history.ConstInt(adr)
         fielddescrof = self.cpu.fielddescrof
+        self.cpu.gc_ll_descr._cache_gcstruct2vtable[self.JIT_VIRTUAL_REF] = self.jit_virtual_ref_vtable
         self.descr_virtual_token = fielddescrof(self.JIT_VIRTUAL_REF,
                                                 'virtual_token')
         self.descr_forced = fielddescrof(self.JIT_VIRTUAL_REF, 'forced')


More information about the pypy-commit mailing list