[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