[pypy-svn] r73194 - in pypy/branch/cpython-extension/pypy: rlib translator/c translator/c/test

xoraxax at codespeak.net xoraxax at codespeak.net
Wed Mar 31 00:56:37 CEST 2010


Author: xoraxax
Date: Wed Mar 31 00:56:34 2010
New Revision: 73194

Added:
   pypy/branch/cpython-extension/pypy/rlib/exports.py
Modified:
   pypy/branch/cpython-extension/pypy/translator/c/genc.py
   pypy/branch/cpython-extension/pypy/translator/c/node.py
   pypy/branch/cpython-extension/pypy/translator/c/test/test_genc.py
Log:
Add interface to export containers (currently only structs) in DLLs.

Added: pypy/branch/cpython-extension/pypy/rlib/exports.py
==============================================================================
--- (empty file)
+++ pypy/branch/cpython-extension/pypy/rlib/exports.py	Wed Mar 31 00:56:34 2010
@@ -0,0 +1,10 @@
+from pypy.rpython.lltypesystem.lltype import typeOf, ContainerType
+
+EXPORTS_names = set()
+EXPORTS_obj2name = {}
+
+def export_struct(name, struct):
+    assert name not in EXPORTS_names, "Duplicate export " + name
+    assert isinstance(typeOf(struct), ContainerType)
+    EXPORTS_names.add(name)
+    EXPORTS_obj2name[struct] = name

Modified: pypy/branch/cpython-extension/pypy/translator/c/genc.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/translator/c/genc.py	(original)
+++ pypy/branch/cpython-extension/pypy/translator/c/genc.py	Wed Mar 31 00:56:34 2010
@@ -13,6 +13,7 @@
 from pypy.translator.c.support import log, c_string_constant
 from pypy.rpython.typesystem import getfunctionptr
 from pypy.translator.c import gc
+from pypy.rlib import exports
 
 def import_module_from_directory(dir, modname):
     file, pathname, description = imp.find_module(modname, [str(dir)])
@@ -167,6 +168,9 @@
                 db.get(getfunctionptr(bk.getdesc(func).getuniquegraph()))
 
             self.c_entrypoint_name = pfname
+
+        for obj in exports.EXPORTS_obj2name.keys():
+            db.getcontainernode(obj)
         db.complete()
 
         self.collect_compilation_info(db)

Modified: pypy/branch/cpython-extension/pypy/translator/c/node.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/translator/c/node.py	(original)
+++ pypy/branch/cpython-extension/pypy/translator/c/node.py	Wed Mar 31 00:56:34 2010
@@ -10,6 +10,7 @@
 from pypy.translator.c.support import cdecl, forward_cdecl, somelettersfrom
 from pypy.translator.c.support import c_char_array_constant, barebonearray
 from pypy.translator.c.primitive import PrimitiveType, name_signed
+from pypy.rlib import exports
 from pypy.rlib.rarithmetic import isinf, isnan
 from pypy.rlib.rstackovf import _StackOverflow
 from pypy.translator.c import extfunc
@@ -475,7 +476,10 @@
         self.typename = db.gettype(T)  #, who_asks=self)
         self.implementationtypename = db.gettype(T, varlength=self.getlength())
         parent, parentindex = parentlink(obj)
-        if parent is None:
+        if obj in exports.EXPORTS_obj2name:
+            self.name = exports.EXPORTS_obj2name[obj]
+            self.globalcontainer = True
+        elif parent is None:
             self.name = db.namespace.uniquename('g_' + self.basename())
             self.globalcontainer = True
         else:

Modified: pypy/branch/cpython-extension/pypy/translator/c/test/test_genc.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/translator/c/test/test_genc.py	(original)
+++ pypy/branch/cpython-extension/pypy/translator/c/test/test_genc.py	Wed Mar 31 00:56:34 2010
@@ -414,3 +414,18 @@
         t.view()
     assert 'foobar' in t.driver.cbuilder.c_source_filename.read()
 
+def test_exportstruct():
+    from pypy.rlib.exports import export_struct
+    def f():
+        return 42
+    FOO = Struct("FOO", ("field1", Signed))
+    foo = malloc(FOO, flavor="raw")
+    foo.field1 = 43
+    export_struct("BarStruct", foo._obj)
+    t = Translation(f, [], backend="c")
+    t.annotate()
+    compiled_fn = t.compile_c()
+    if py.test.config.option.view:
+        t.view()
+    assert ' BarStruct ' in t.driver.cbuilder.c_source_filename.read()
+



More information about the Pypy-commit mailing list