[pypy-commit] pypy exctrans: Create sandbox stubs in the annotator and finally get rid of databasing-time creation of sandbox helpers

rlamy pypy.commits at gmail.com
Mon Jan 18 12:58:02 EST 2016


Author: Ronan Lamy <ronan.lamy at 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):


More information about the pypy-commit mailing list