[pypy-svn] r51727 - pypy/branch/unified-rtti/pypy/translator/c

arigo at codespeak.net arigo at codespeak.net
Thu Feb 21 16:24:15 CET 2008


Author: arigo
Date: Thu Feb 21 16:24:15 2008
New Revision: 51727

Modified:
   pypy/branch/unified-rtti/pypy/translator/c/node.py
Log:
Forgot dependencies.


Modified: pypy/branch/unified-rtti/pypy/translator/c/node.py
==============================================================================
--- pypy/branch/unified-rtti/pypy/translator/c/node.py	(original)
+++ pypy/branch/unified-rtti/pypy/translator/c/node.py	Thu Feb 21 16:24:15 2008
@@ -477,6 +477,9 @@
         return self.T._name
 
     def enum_dependencies(self):
+        if needs_gcheader(self.T):
+            for thing in self.db.gcpolicy.struct_gcheader_initdata(self):
+                yield thing
         for name in self.T._names:
             yield getattr(self.obj, name)
 
@@ -537,7 +540,10 @@
         return 'array'
 
     def enum_dependencies(self):
-        return self.obj.items
+        result = self.obj.items
+        if needs_gcheader(self.T):
+            result = result + self.db.gcpolicy.array_gcheader_initdata(self)
+        return result
 
     def getlength(self):
         return len(self.obj.items)
@@ -818,8 +824,6 @@
 
 
 def opaquenode_factory(db, T, obj):
-    if T == RuntimeTypeInfo:
-        return db.gcpolicy.rtti_node_factory()(db, T, obj)
     if T.hints.get("render_structure", False):
         return ExtType_OpaqueNode(db, T, obj)
     raise Exception("don't know about %r" % (T,))
@@ -875,12 +879,24 @@
     obj._converted_weakref = container     # hack for genllvm :-/
     return db.getcontainernode(container, _dont_write_c_code=False)
 
-def rttinode_factory(db, T, obj):
-    assert isinstance(obj, lltype._rtti)
-    wrapper = db.gcpolicy.convert_rtti(obj)
-    container = wrapper._obj
-    #obj._converted_rtti = container     # hack for genllvm :-/
-    return db.getcontainernode(container, _dont_write_c_code=False)
+class RttiNode(ContainerNode):
+    nodekind = 'rtti'
+
+    def __init__(self, db, T, obj):
+        assert isinstance(obj, lltype._rtti)
+        wrapper = db.gcpolicy.convert_rtti(obj)
+        self.realobj = wrapper._obj
+        self.realnode = db.getcontainernode(self.realobj)
+        ContainerNode.__init__(self, db, T, obj)
+
+    def basename(self):
+        return self.realnode.basename()
+
+    def enum_dependencies(self):
+        return self.realnode.enum_dependencies()
+
+    def initializationexpr(self, decoration=''):
+        return self.realnode.initializationexpr(decoration)
 
 
 ContainerNodeFactory = {
@@ -893,5 +909,5 @@
     OpaqueType:   opaquenode_factory,
     PyObjectType: PyObjectNode,
     llmemory._WeakRefType: weakrefnode_factory,
-    lltype.RuntimeTypeInfoType: rttinode_factory,
+    lltype.RuntimeTypeInfoType: RttiNode,
     }



More information about the Pypy-commit mailing list