[pypy-svn] r70539 - in pypy/branch/separate-compilation/pypy/translator: . c c/test
afa at codespeak.net
afa at codespeak.net
Tue Jan 12 17:32:25 CET 2010
Author: afa
Date: Tue Jan 12 17:32:24 2010
New Revision: 70539
Modified:
pypy/branch/separate-compilation/pypy/translator/c/genc.py
pypy/branch/separate-compilation/pypy/translator/c/test/test_separate.py
pypy/branch/separate-compilation/pypy/translator/exceptiontransform.py
pypy/branch/separate-compilation/pypy/translator/separate.py
Log:
Finally found how to convert a SomeInstance(classdef=S) to a pointer
to a GCStruct for the same class.
Now a RPython instance can be passed (as reference) between compilation units.
Still in-progress. Next step: move this code to another file.
The hack in exceptiontransform.py is obscure; it seems that some dealloc function
is attached to the GCstruct, together with its graph from the first annotation.
Modified: pypy/branch/separate-compilation/pypy/translator/c/genc.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/c/genc.py (original)
+++ pypy/branch/separate-compilation/pypy/translator/c/genc.py Tue Jan 12 17:32:24 2010
@@ -358,11 +358,44 @@
for funcname, import_name in self.export_node_names.items():
functype = lltype.typeOf(self.entrypoint[funcname])
- setattr(mod, funcname,
- rffi.llexternal(
- import_name, functype.TO.ARGS, functype.TO.RESULT,
- compilation_info=import_eci,
- ))
+ from pypy.annotation import model
+
+ imported_func = rffi.llexternal(
+ import_name, functype.TO.ARGS, functype.TO.RESULT,
+ compilation_info=import_eci,
+ )
+
+ if not functype.TO.ARGS:
+ func = imported_func
+ elif len(functype.TO.ARGS) == 1:
+ ARG = functype.TO.ARGS[0]
+ from pypy.rpython.lltypesystem import llmemory
+ from pypy.rpython.extregistry import ExtRegistryEntry
+
+ if isinstance(ARG, lltype.Ptr): # XXX more precise check?
+ def convert(x):
+ raiseNameError
+
+ class Entry(ExtRegistryEntry):
+ _about_ = convert
+ s_result_annotation = model.lltype_to_annotation(ARG)
+
+ def specialize_call(self, hop):
+ # TODO: input type check
+ [v_instance] = hop.inputargs(*hop.args_r)
+ return hop.genop('force_cast', [v_instance],
+ resulttype = ARG)
+ else:
+ def convert(x):
+ return x
+
+ def func(arg0):
+ ll_arg0 = convert(arg0)
+ ll_res = imported_func(ll_arg0)
+ return ll_res
+ else:
+ raise NotImplementedError("Not supported")
+ setattr(mod, funcname, func)
return mod
def gen_makefile(self, targetdir):
Modified: pypy/branch/separate-compilation/pypy/translator/c/test/test_separate.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/c/test/test_separate.py (original)
+++ pypy/branch/separate-compilation/pypy/translator/c/test/test_separate.py Tue Jan 12 17:32:24 2010
@@ -7,6 +7,7 @@
from pypy.annotation import model, description
import py
import sys, os
+import types
class TestSeparation:
def compile_function(self, func, argtypes):
@@ -28,6 +29,21 @@
if hasattr(func, 'argtypes'):
t.annotator.build_types(func, func.argtypes,
complete_now=False)
+ # annotate classes
+ for funcname, cls in exports.items():
+ if not isinstance(cls, (type, types.ClassType)):
+ continue
+ desc = bk.getdesc(cls)
+ classdef = desc.getuniqueclassdef()
+ s_init = desc.s_read_attribute('__init__')
+ if isinstance(s_init, model.SomeImpossibleValue):
+ continue
+
+ argtypes = (model.SomeInstance(classdef),)
+ argtypes += tuple(cls.__init__.argtypes)
+ t.annotator.build_types(cls.__init__.im_func, argtypes,
+ complete_now=False)
+ t.annotator.complete()
# ensure that functions without signature are not constant-folded
for funcname, func in exports.items():
@@ -42,11 +58,6 @@
newargs.append(newarg)
# and reflow
t.annotator.build_types(func, newargs)
- elif isinstance(desc, description.ClassDesc):
- s_init = desc.s_read_attribute('__init__')
- initfunc = s_init.const
- newargs = [func, float]
- t.annotator.build_types(initfunc, newargs)
t.buildrtyper().specialize()
@@ -127,7 +138,7 @@
def test_pass_structure(self):
class S:
- @export
+ @export(float)
def __init__(self, x):
self.x = x
@@ -138,10 +149,19 @@
firstmodule = self.compile_separated("first", f=f, S=S)
# call it from a function compiled in another module
- def fn():
+ @export()
+ def g():
s = S(41.0)
return firstmodule.f(s)
+ secondmodule = self.compile_separated("second", g=g)
- #assert fn() == 42.5
+ def fn():
+ return secondmodule.g()
+
+ if sys.platform == 'win32':
+ filepath = os.path.dirname(firstmodule.__file__)
+ os.environ['PATH'] = "%s;%s" % (filepath, os.environ['PATH'])
+
+ assert fn() == 42.5
c_fn = self.compile_function(fn, [])
assert c_fn() == 42.5
Modified: pypy/branch/separate-compilation/pypy/translator/exceptiontransform.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/exceptiontransform.py (original)
+++ pypy/branch/separate-compilation/pypy/translator/exceptiontransform.py Tue Jan 12 17:32:24 2010
@@ -173,11 +173,10 @@
Because of the added exitswitch we need an additional block.
"""
if hasattr(graph, 'exceptiontransformed'):
- assert self.same_obj(self.exc_data_ptr, graph.exceptiontransformed)
- return
- else:
- self.raise_analyzer.analyze_direct_call(graph)
- graph.exceptiontransformed = self.exc_data_ptr
+ if self.same_obj(self.exc_data_ptr, graph.exceptiontransformed):
+ return
+ self.raise_analyzer.analyze_direct_call(graph)
+ graph.exceptiontransformed = self.exc_data_ptr
self.always_exc_clear = always_exc_clear
join_blocks(graph)
Modified: pypy/branch/separate-compilation/pypy/translator/separate.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/separate.py (original)
+++ pypy/branch/separate-compilation/pypy/translator/separate.py Tue Jan 12 17:32:24 2010
@@ -22,7 +22,7 @@
decorated = export()(func)
del decorated.argtypes
return decorated
- return object.__new__(cls, *args, **kwds)
+ return object.__new__(cls)
def __init__(self, *args, **kwds):
self.argtypes = args
More information about the Pypy-commit
mailing list