Author: Ronan Lamy <ronan.l...@gmail.com> Branch: exctrans Changeset: r81838:2906290a8ebc Date: 2016-01-18 17:57 +0000 http://bitbucket.org/pypy/pypy/changeset/2906290a8ebc/
Log: Create sandbox stubs in the annotator and finally get rid of databasing-time creation of sandbox helpers diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py --- a/rpython/annotator/bookkeeper.py +++ b/rpython/annotator/bookkeeper.py @@ -358,6 +358,10 @@ 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,26 +903,12 @@ 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,13 +117,11 @@ dump_string = rmarshal.get_marshaller(str) load_int = rmarshal.get_loader(int) -def get_sandbox_stub(fnobj, rtyper): - """Build always-raising graph for unsupported external function.""" +def get_sandbox_stub(fnobj): + """Build always-raising stub function for unsupported external function.""" fnname = fnobj._name - args_s, s_result = sig_ll(fnobj) msg = "Not implemented: sandboxing for external function '%s'" % (fnname,) - execute = make_stub(fnname, msg) - return _annotate(rtyper, execute, args_s, s_result) + return make_stub(fnname, msg) 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,6 +8,7 @@ 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 @@ -292,6 +293,16 @@ 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