[pypy-commit] pypy value-classes: Add value_class information to SizeDescr
sbauman
pypy.commits at gmail.com
Tue Sep 20 15:04:58 EDT 2016
Author: Spenser Bauman <sabauma at gmail.com>
Branch: value-classes
Changeset: r87259:ad12c5eab511
Date: 2016-09-20 14:52 -0400
http://bitbucket.org/pypy/pypy/changeset/ad12c5eab511/
Log: Add value_class information to SizeDescr
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
@@ -139,6 +139,9 @@
def is_immutable(self):
return heaptracker.is_immutable_struct(self.S)
+ def is_value_class(self):
+ return heaptracker.is_value_class(self.S)
+
def get_type_id(self):
assert isinstance(self.S, lltype.GcStruct)
return TypeIDSymbolic(self.S) # integer-like symbolic
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
@@ -61,16 +61,19 @@
tid = llop.combine_ushort(lltype.Signed, 0, 0)
vtable = lltype.nullptr(rclass.OBJECT_VTABLE)
immutable_flag = False
+ value_class_flag = False
def __init__(self, size, gc_fielddescrs=None, all_fielddescrs=None,
vtable=lltype.nullptr(rclass.OBJECT_VTABLE),
- immutable_flag=False):
+ immutable_flag=False,
+ value_class_flag=False):
assert lltype.typeOf(vtable) == lltype.Ptr(rclass.OBJECT_VTABLE)
self.size = size
self.gc_fielddescrs = gc_fielddescrs
self.all_fielddescrs = all_fielddescrs
self.vtable = vtable
self.immutable_flag = immutable_flag
+ self.value_class_flag = value_class_flag
def get_all_fielddescrs(self):
return self.all_fielddescrs
@@ -94,6 +97,9 @@
def is_immutable(self):
return self.immutable_flag
+ def is_value_class(self):
+ return self.value_class_flag
+
def get_vtable(self):
return heaptracker.adr2int(llmemory.cast_ptr_to_adr(self.vtable))
@@ -109,12 +115,14 @@
except KeyError:
size = symbolic.get_size(STRUCT, gccache.translate_support_code)
immutable_flag = heaptracker.is_immutable_struct(STRUCT)
+ value_class_flag = heaptracker.is_value_class(STRUCT)
if vtable:
assert heaptracker.has_gcstruct_a_vtable(STRUCT)
else:
assert not heaptracker.has_gcstruct_a_vtable(STRUCT)
sizedescr = SizeDescr(size, vtable=vtable,
- immutable_flag=immutable_flag)
+ immutable_flag=immutable_flag,
+ value_class_flag=value_class_flag)
gccache.init_size_descr(STRUCT, sizedescr)
cache[STRUCT] = sizedescr
# XXX do we really need gc_fielddescrs if we also have
diff --git a/rpython/jit/backend/llsupport/test/test_descr.py b/rpython/jit/backend/llsupport/test/test_descr.py
--- a/rpython/jit/backend/llsupport/test/test_descr.py
+++ b/rpython/jit/backend/llsupport/test/test_descr.py
@@ -52,6 +52,26 @@
descr_s = get_size_descr(c0, STRUCT)
assert descr_s.is_immutable() == True
+def test_get_size_descr_value_class():
+ hints = {'immutable': True, 'value_class': True}
+ S = lltype.GcStruct('S', hints=hints)
+ T = lltype.GcStruct('T', ('parent', S),
+ ('x', lltype.Char),
+ hints=hints)
+ U = lltype.GcStruct('U', ('parent', T),
+ ('u', lltype.Ptr(T)),
+ ('v', lltype.Signed),
+ hints=hints)
+ V = lltype.GcStruct('V', ('parent', U),
+ ('miss1', lltype.Void),
+ ('miss2', lltype.Void),
+ hints=hints)
+ for STRUCT in [S, T, U, V]:
+ for translated in [False, True]:
+ c0 = GcCache(translated)
+ descr_s = get_size_descr(c0, STRUCT)
+ assert descr_s.is_value_class() == True
+
def test_get_field_descr():
U = lltype.Struct('U')
T = lltype.GcStruct('T')
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
@@ -23,6 +23,9 @@
def is_immutable_struct(S):
return isinstance(S, lltype.GcStruct) and S._hints.get('immutable', False)
+def is_value_class(S):
+ return isinstance(S, lltype.GcStruct) and S._hints.get('value_class', False)
+
# ____________________________________________________________
def has_gcstruct_a_vtable(GCSTRUCT):
More information about the pypy-commit
mailing list