Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r78031:12b6a3d6cfcf
Date: 2015-06-11 17:59 +0200
http://bitbucket.org/pypy/pypy/changeset/12b6a3d6cfcf/

Log:    a hack to make sure that we have a correct type in fielddescr

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
@@ -126,6 +126,16 @@
     def __repr__(self):
         return 'FieldDescr<%s>' % (self.name,)
 
+    def check_correct_type(self, struct):
+        if isinstance(self.parent_descr, SizeDescrWithVTable):
+            cls = llmemory.cast_adr_to_ptr(
+                heaptracker.int2adr(self.parent_descr.get_vtable()),
+                lltype.Ptr(rclass.OBJECT_VTABLE))
+            assert rclass.ll_isinstance(lltype.cast_opaque_ptr(
+                rclass.OBJECTPTR, struct), cls)
+        else:
+            pass
+
     def is_pointer_field(self):
         return self.flag == FLAG_POINTER
 
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
@@ -577,15 +577,18 @@
     @specialize.argtype(1)
     def bh_setfield_gc_i(self, struct, newvalue, fielddescr):
         ofs, size, _ = self.unpack_fielddescr_size(fielddescr)
+        fielddescr.check_correct_type(struct)
         self.write_int_at_mem(struct, ofs, size, newvalue)
 
     def bh_setfield_gc_r(self, struct, newvalue, fielddescr):
         ofs = self.unpack_fielddescr(fielddescr)
+        fielddescr.check_correct_type(struct)
         self.write_ref_at_mem(struct, ofs, newvalue)
 
     @specialize.argtype(1)
     def bh_setfield_gc_f(self, struct, newvalue, fielddescr):
         ofs = self.unpack_fielddescr(fielddescr)
+        fielddescr.check_correct_type(struct)
         self.write_float_at_mem(struct, ofs, newvalue)
 
     bh_setfield_raw_i = bh_setfield_gc_i
diff --git a/rpython/memory/gc/base.py b/rpython/memory/gc/base.py
--- a/rpython/memory/gc/base.py
+++ b/rpython/memory/gc/base.py
@@ -124,6 +124,9 @@
     def get_size(self, obj):
         return self._get_size_for_typeid(obj, self.get_type_id(obj))
 
+    def get_type_id_cast(self, obj):
+        return rffi.cast(lltype.Signed, self.get_type_id(obj))
+
     def get_size_incl_hash(self, obj):
         return self.get_size(obj)
 
diff --git a/rpython/memory/gctransform/framework.py 
b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -335,6 +335,10 @@
                 [s_gc, annmodel.SomeInteger(knowntype=llgroup.r_halfword)],
                 annmodel.SomeInteger())
 
+        self.gc_gettypeid_ptr = getfn(GCClass.get_type_id_cast,
+                                       [s_gc, SomeAddress()],
+                                       annmodel.SomeInteger())
+
         if hasattr(GCClass, 'writebarrier_before_copy'):
             self.wb_before_copy_ptr = \
                     getfn(GCClass.writebarrier_before_copy.im_func,
@@ -780,6 +784,16 @@
                                   v_addr, v_length],
                   resultvar=op.result)
 
+    def gct_gc_gettypeid(self, hop):
+        op = hop.spaceop
+        v_addr = op.args[0]
+        if v_addr.concretetype != llmemory.Address:
+            v_addr = hop.genop("cast_ptr_to_adr", [v_addr],
+                               resulttype=llmemory.Address)
+        hop.genop("direct_call", [self.gc_gettypeid_ptr, self.c_const_gc,
+                                  v_addr],
+                         resultvar=op.result)
+
     def gct_gc_writebarrier(self, hop):
         if self.write_barrier_ptr is None:
             return
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -74,6 +74,9 @@
             return lltype.malloc(TYPE, n, flavor=flavor, zero=zero,
                                  track_allocation=track_allocation)
 
+    def gettypeid(self, obj):
+        return self.get_type_id(lltype.typeOf(obj).TO)
+
     def add_memory_pressure(self, size):
         if hasattr(self.gc, 'raw_malloc_memory_pressure'):
             self.gc.raw_malloc_memory_pressure(size)
diff --git a/rpython/memory/test/gc_test_base.py 
b/rpython/memory/test/gc_test_base.py
--- a/rpython/memory/test/gc_test_base.py
+++ b/rpython/memory/test/gc_test_base.py
@@ -864,6 +864,16 @@
         else:
             assert res == 0 or res == 13
 
+    def test_gettypeid(self):
+        class A(object):
+            pass
+        
+        def fn():
+            a = A()
+            return rgc.get_typeid(a)
+
+        self.interpret(fn, [])
+
 
 from rpython.rlib.objectmodel import UnboxedValue
 
diff --git a/rpython/memory/test/test_transformed_gc.py 
b/rpython/memory/test/test_transformed_gc.py
--- a/rpython/memory/test/test_transformed_gc.py
+++ b/rpython/memory/test/test_transformed_gc.py
@@ -1353,6 +1353,22 @@
         res = func([])
         assert res == -1999
 
+    def define_gettypeid(cls):
+        class A(object):
+            pass
+        
+        def fn():
+            a = A()
+            return rgc.get_typeid(a)
+
+        return fn
+
+    def test_gettypeid(self):
+        func = self.runner("gettypeid")
+        res = func([])
+        print res
+
+
 from rpython.rlib.objectmodel import UnboxedValue
 
 class TaggedBase(object):
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -715,3 +715,19 @@
         funcptr = hop.rtyper.annotate_helper_fn(ll_func, args_s)
         hop.exception_cannot_occur()
         lltype.attachRuntimeTypeInfo(TP, destrptr=funcptr)
+
+all_typeids = {}
+        
+def get_typeid(obj):
+    raise Exception("does not work untranslated")
+
+class GetTypeidEntry(ExtRegistryEntry):
+    _about_ = get_typeid
+
+    def compute_result_annotation(self, s_obj):
+        from rpython.annotator import model as annmodel
+        return annmodel.SomeInteger()
+
+    def specialize_call(self, hop):
+        hop.exception_cannot_occur()
+        return hop.genop('gc_gettypeid', hop.args_v, resulttype=hop.r_result)
diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py
--- a/rpython/rtyper/llinterp.py
+++ b/rpython/rtyper/llinterp.py
@@ -708,6 +708,9 @@
     def op_gc_add_memory_pressure(self, size):
         self.heap.add_memory_pressure(size)
 
+    def op_gc_gettypeid(self, obj):
+        return lltype.cast_primitive(lltype.Signed, self.heap.gettypeid(obj))
+
     def op_shrink_array(self, obj, smallersize):
         return self.heap.shrink_array(obj, smallersize)
 
diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -498,6 +498,7 @@
     'gc_dump_rpy_heap'    : LLOp(),
     'gc_typeids_z'        : LLOp(),
     'gc_typeids_list'     : LLOp(),
+    'gc_gettypeid'        : LLOp(),
     'gc_gcflag_extra'     : LLOp(),
     'gc_add_memory_pressure': LLOp(),
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to