Author: Ronan Lamy <ronan.l...@gmail.com> Branch: exctrans Changeset: r81859:7ec528e70b0f Date: 2016-01-19 18:52 +0000 http://bitbucket.org/pypy/pypy/changeset/7ec528e70b0f/
Log: Backed out changeset 2906290a8ebc The issue is that creating the external function stubs prevents the functions that need to be sandbox-transformed from being annotated correctly. diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py --- a/rpython/annotator/bookkeeper.py +++ b/rpython/annotator/bookkeeper.py @@ -358,10 +358,6 @@ return self.descs[obj_key] except KeyError: if isinstance(pyobj, types.FunctionType): - if self.annotator.translator.config.translation.sandbox: - if hasattr(pyobj, '_ptr') and not getattr(pyobj._ptr._obj, '_safe_not_sandboxed', True): - from rpython.translator.sandbox.rsandbox import get_sandbox_stub - pyobj = get_sandbox_stub(pyobj._ptr._obj) result = description.FunctionDesc(self, pyobj) elif isinstance(pyobj, (type, types.ClassType)): if pyobj is object: 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 @@ -903,12 +903,26 @@ funcgen.implementation_end() def new_funcnode(db, T, obj, forcename=None): + sandbox = db.sandbox and need_sandboxing(obj) + if sandbox: + if getattr(obj, 'external', None) is not None: + obj.__dict__['graph'] = rsandbox.get_sandbox_stub( + obj, db.translator.rtyper) + obj.__dict__.pop('_safe_not_sandboxed', None) + obj.__dict__.pop('external', None) + if forcename: name = forcename else: name = _select_name(db, obj) return FuncNode(db, T, obj, name) +def need_sandboxing(fnobj): + if hasattr(fnobj, '_safe_not_sandboxed'): + return not fnobj._safe_not_sandboxed + else: + return "if_external" + def select_function_code_generators(fnobj, db, functionname): if hasattr(fnobj, 'graph'): exception_policy = getattr(fnobj, 'exception_policy', None) diff --git a/rpython/translator/sandbox/rsandbox.py b/rpython/translator/sandbox/rsandbox.py --- a/rpython/translator/sandbox/rsandbox.py +++ b/rpython/translator/sandbox/rsandbox.py @@ -117,11 +117,13 @@ dump_string = rmarshal.get_marshaller(str) load_int = rmarshal.get_loader(int) -def get_sandbox_stub(fnobj): - """Build always-raising stub function for unsupported external function.""" +def get_sandbox_stub(fnobj, rtyper): + """Build always-raising graph for unsupported external function.""" fnname = fnobj._name + args_s, s_result = sig_ll(fnobj) msg = "Not implemented: sandboxing for external function '%s'" % (fnname,) - return make_stub(fnname, msg) + execute = make_stub(fnname, msg) + return _annotate(rtyper, execute, args_s, s_result) def get_external_function_sandbox_graph(fnobj, rtyper): """Build the graph of a helper trampoline function to be used diff --git a/rpython/translator/sandbox/test/test_sandbox.py b/rpython/translator/sandbox/test/test_sandbox.py --- a/rpython/translator/sandbox/test/test_sandbox.py +++ b/rpython/translator/sandbox/test/test_sandbox.py @@ -8,7 +8,6 @@ from rpython.translator.interactive import Translation from rpython.translator.sandbox.sandlib import read_message, write_message from rpython.translator.sandbox.sandlib import write_exception -from rpython.translator.tool.cbuild import ExternalCompilationInfo if hasattr(signal, 'alarm'): _orig_read_message = read_message @@ -293,16 +292,6 @@ rescode = pipe.wait() assert rescode == 0 -def test_llexternal(): - c_foo = rffi.llexternal('foo', [], rffi.INT) - def f(argv): - try: - c_foo() - except: - pass - return 0 - compile(f) # Check that this doesn't crash - class TestPrintedResults: def run(self, entry_point, args, expected): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit