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