[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