[pypy-commit] pypy exctrans: Move *_gcheader_initdata() methods from gcpolicy to gctransformer
rlamy
pypy.commits at gmail.com
Wed Dec 30 06:51:33 EST 2015
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: exctrans
Changeset: r81499:925913cbec05
Date: 2015-12-30 03:31 +0100
http://bitbucket.org/pypy/pypy/changeset/925913cbec05/
Log: Move *_gcheader_initdata() methods from gcpolicy to gctransformer
diff --git a/rpython/memory/gctransform/boehm.py b/rpython/memory/gctransform/boehm.py
--- a/rpython/memory/gctransform/boehm.py
+++ b/rpython/memory/gctransform/boehm.py
@@ -74,7 +74,7 @@
def gct_fv_gc_malloc_varsize(self, hop, flags, TYPE, v_length, c_const_size, c_item_size,
c_offset_to_length):
- # XXX same behavior for zero=True: in theory that's wrong
+ # XXX same behavior for zero=True: in theory that's wrong
if c_offset_to_length is None:
v_raw = hop.genop("direct_call",
[self.malloc_varsize_no_length_ptr, v_length,
@@ -156,6 +156,11 @@
resulttype = lltype.Signed)
hop.genop('int_invert', [v_int], resultvar=hop.spaceop.result)
+ def gcheader_initdata(self, defnode):
+ hdr = lltype.malloc(self.HDR, immortal=True)
+ hdr.hash = lltype.identityhash_nocache(defnode.obj._as_ptr())
+ return hdr._obj
+
########## weakrefs ##########
# Boehm: weakref objects are small structures containing only a Boehm
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
@@ -292,7 +292,6 @@
s_gcref = SomePtr(llmemory.GCREF)
gcdata = self.gcdata
- translator = self.translator
#use the GC flag to find which malloc method to use
#malloc_zero_filled == Ture -> malloc_fixedsize/varsize_clear
#malloc_zero_filled == Flase -> malloc_fixedsize/varsize
@@ -326,7 +325,7 @@
GCClass.malloc_varsize.im_func,
[s_gc, s_typeid16]
+ [annmodel.SomeInteger(nonneg=True) for i in range(4)], s_gcref)
-
+
self.collect_ptr = getfn(GCClass.collect.im_func,
[s_gc, annmodel.SomeInteger()], annmodel.s_None)
self.can_move_ptr = getfn(GCClass.can_move.im_func,
@@ -1389,7 +1388,7 @@
[v] + previous_steps + [c_name, c_null])
else:
llops.genop('bare_setfield', [v, c_name, c_null])
-
+
return
elif isinstance(TYPE, lltype.Array):
ITEM = TYPE.OF
@@ -1416,6 +1415,25 @@
resulttype=llmemory.Address)
llops.genop('raw_memclear', [v_adr, v_totalsize])
+ def gcheader_initdata(self, defnode):
+ o = lltype.top_container(defnode.obj)
+ needs_hash = self.get_prebuilt_hash(o) is not None
+ hdr = self.gc_header_for(o, needs_hash)
+ return hdr._obj
+
+ def get_prebuilt_hash(self, obj):
+ # for prebuilt objects that need to have their hash stored and
+ # restored. Note that only structures that are StructNodes all
+ # the way have their hash stored (and not e.g. structs with var-
+ # sized arrays at the end). 'obj' must be the top_container.
+ TYPE = lltype.typeOf(obj)
+ if not isinstance(TYPE, lltype.GcStruct):
+ return None
+ if TYPE._is_varsize():
+ return None
+ return getattr(obj, '_hash_cache_', None)
+
+
class TransformerLayoutBuilder(gctypelayout.TypeLayoutBuilder):
diff --git a/rpython/memory/gctransform/refcounting.py b/rpython/memory/gctransform/refcounting.py
--- a/rpython/memory/gctransform/refcounting.py
+++ b/rpython/memory/gctransform/refcounting.py
@@ -285,3 +285,7 @@
resulttype=llmemory.Address)
hop.genop("direct_call", [self.identityhash_ptr, v_adr],
resultvar=hop.spaceop.result)
+
+ def gcheader_initdata(self, defnode):
+ top = lltype.top_container(defnode.obj)
+ return self.gcheaderbuilder.header_of_object(top)._obj
diff --git a/rpython/memory/gctransform/transform.py b/rpython/memory/gctransform/transform.py
--- a/rpython/memory/gctransform/transform.py
+++ b/rpython/memory/gctransform/transform.py
@@ -378,6 +378,10 @@
return hop.cast_result(rmodel.inputconst(lltype.Ptr(ARRAY_TYPEID_MAP),
lltype.nullptr(ARRAY_TYPEID_MAP)))
+ def get_prebuilt_hash(self, obj):
+ return None
+
+
class MinimalGCTransformer(BaseGCTransformer):
def __init__(self, parenttransformer):
BaseGCTransformer.__init__(self, parenttransformer.translator)
diff --git a/rpython/translator/c/gc.py b/rpython/translator/c/gc.py
--- a/rpython/translator/c/gc.py
+++ b/rpython/translator/c/gc.py
@@ -1,8 +1,7 @@
import sys
from rpython.flowspace.model import Constant
-from rpython.rtyper.lltypesystem import lltype
-from rpython.rtyper.lltypesystem.lltype import (typeOf, RttiStruct,
- RuntimeTypeInfo, top_container)
+from rpython.rtyper.lltypesystem.lltype import (RttiStruct,
+ RuntimeTypeInfo)
from rpython.translator.c.node import ContainerNode
from rpython.translator.c.support import cdecl
from rpython.translator.tool.cbuild import ExternalCompilationInfo
@@ -18,23 +17,12 @@
return defnode.db.gctransformer.HDR
return None
- def common_gcheader_initdata(self, defnode):
- if defnode.db.gctransformer is not None:
- raise NotImplementedError
- return None
-
def struct_gcheader_definition(self, defnode):
return self.common_gcheader_definition(defnode)
- def struct_gcheader_initdata(self, defnode):
- return self.common_gcheader_initdata(defnode)
-
def array_gcheader_definition(self, defnode):
return self.common_gcheader_definition(defnode)
- def array_gcheader_initdata(self, defnode):
- return self.common_gcheader_initdata(defnode)
-
def compilation_info(self):
if not self.db:
return ExternalCompilationInfo()
@@ -46,9 +34,6 @@
]
)
- def get_prebuilt_hash(self, obj):
- return None
-
def need_no_typeptr(self):
return False
@@ -113,13 +98,6 @@
from rpython.memory.gctransform import refcounting
return refcounting.RefcountingGCTransformer(translator)
- def common_gcheader_initdata(self, defnode):
- if defnode.db.gctransformer is not None:
- gct = defnode.db.gctransformer
- top = top_container(defnode.obj)
- return gct.gcheaderbuilder.header_of_object(top)._obj
- return None
-
# for structs
def struct_setup(self, structdefnode, rtti):
@@ -201,13 +179,6 @@
from rpython.memory.gctransform import boehm
return boehm.BoehmGCTransformer(translator)
- def common_gcheader_initdata(self, defnode):
- if defnode.db.gctransformer is not None:
- hdr = lltype.malloc(defnode.db.gctransformer.HDR, immortal=True)
- hdr.hash = lltype.identityhash_nocache(defnode.obj._as_ptr())
- return hdr._obj
- return None
-
def array_setup(self, arraydefnode):
pass
@@ -362,24 +333,6 @@
args = [funcgen.expr(v) for v in op.args]
return '%s = %s; /* for moving GCs */' % (args[1], args[0])
- def common_gcheader_initdata(self, defnode):
- o = top_container(defnode.obj)
- needs_hash = self.get_prebuilt_hash(o) is not None
- hdr = defnode.db.gctransformer.gc_header_for(o, needs_hash)
- return hdr._obj
-
- def get_prebuilt_hash(self, obj):
- # for prebuilt objects that need to have their hash stored and
- # restored. Note that only structures that are StructNodes all
- # the way have their hash stored (and not e.g. structs with var-
- # sized arrays at the end). 'obj' must be the top_container.
- TYPE = typeOf(obj)
- if not isinstance(TYPE, lltype.GcStruct):
- return None
- if TYPE._is_varsize():
- return None
- return getattr(obj, '_hash_cache_', None)
-
def need_no_typeptr(self):
config = self.db.translator.config
return config.translation.gcremovetypeptr
diff --git a/rpython/translator/c/node.py b/rpython/translator/c/node.py
--- a/rpython/translator/c/node.py
+++ b/rpython/translator/c/node.py
@@ -566,7 +566,11 @@
data = []
if needs_gcheader(T):
- gc_init = self.db.gcpolicy.struct_gcheader_initdata(self)
+ gct = defnode.db.gctransformer
+ if gct is not None:
+ gc_init = gct.gcheader_initdata(self)
+ else:
+ gc_init = None
data.append(('gcheader', gc_init))
for name in defnode.fieldnames:
@@ -640,7 +644,7 @@
def implementation(self):
hash_typename = self.get_hash_typename()
- hash = self.db.gcpolicy.get_prebuilt_hash(self.obj)
+ hash = self.db.gctransformer.get_prebuilt_hash(self.obj)
assert hash is not None
lines = list(self.initializationexpr())
lines.insert(0, '%s = { {' % (
@@ -650,7 +654,7 @@
return lines
def gcstructnode_factory(db, T, obj):
- if db.gcpolicy.get_prebuilt_hash(obj) is not None:
+ if db.gctransformer.get_prebuilt_hash(obj) is not None:
cls = GcStructNodeWithHash
else:
cls = StructNode
@@ -680,7 +684,11 @@
T = self.getTYPE()
yield '{'
if needs_gcheader(T):
- gc_init = self.db.gcpolicy.array_gcheader_initdata(self)
+ gct = self.db.gctransformer
+ if gct is not None:
+ gc_init = gct.gcheader_initdata(self)
+ else:
+ gc_init = None
lines = generic_initializationexpr(self.db, gc_init, 'gcheader',
'%sgcheader' % (decoration,))
for line in lines:
More information about the pypy-commit
mailing list