[pypy-commit] pypy llimpl: Create SomeExternalFunction, clean up signature checking and sandboxing of externals

rlamy pypy.commits at gmail.com
Mon Feb 15 23:18:04 EST 2016


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: llimpl
Changeset: r82275:7b8f4a3f1bd2
Date: 2016-02-16 04:17 +0000
http://bitbucket.org/pypy/pypy/changeset/7b8f4a3f1bd2/

Log:	Create SomeExternalFunction, clean up signature checking and
	sandboxing of externals

diff --git a/rpython/annotator/policy.py b/rpython/annotator/policy.py
--- a/rpython/annotator/policy.py
+++ b/rpython/annotator/policy.py
@@ -86,12 +86,11 @@
                     continue
                 key = ('sandboxing', s_func.const)
                 if key not in bk.emulated_pbc_calls:
-                    entry = s_func.entry
-                    params_s = entry.signature_args
-                    s_result = entry.signature_result
+                    params_s = s_func.args_s
+                    s_result = s_func.s_result
                     from rpython.translator.sandbox.rsandbox import make_sandbox_trampoline
                     sandbox_trampoline = make_sandbox_trampoline(
-                        entry.name, params_s, s_result)
+                        s_func.name, params_s, s_result)
                     sandbox_trampoline._signature_ = [SomeTuple(items=params_s)], s_result
                     bk.emulate_pbc_call(key, bk.immutablevalue(sandbox_trampoline), params_s)
                 else:
diff --git a/rpython/rtyper/extfunc.py b/rpython/rtyper/extfunc.py
--- a/rpython/rtyper/extfunc.py
+++ b/rpython/rtyper/extfunc.py
@@ -1,16 +1,22 @@
 from rpython.rtyper.extregistry import ExtRegistryEntry
 from rpython.rtyper.lltypesystem.lltype import typeOf, FuncType, functionptr, _ptr
-from rpython.annotator.model import unionof
+from rpython.annotator.model import unionof, SomeBuiltin
 from rpython.annotator.signature import annotation, SignatureError
 
-class ExtFuncEntry(ExtRegistryEntry):
-    safe_not_sandboxed = False
+class SomeExternalFunction(SomeBuiltin):
+    def __init__(self, name, args_s, s_result):
+        self.name = name
+        self.args_s = args_s
+        self.s_result = s_result
 
-    def check_args(self, *args_s):
-        params_s = self.signature_args
-        assert len(args_s) == len(params_s),\
-               "Argument number mismatch"
-
+    def check_args(self, callspec):
+        params_s = self.args_s
+        args_s, kwargs = callspec.unpack()
+        if kwargs:
+            raise SignatureError(
+                "External functions cannot be called with keyword arguments")
+        if len(args_s) != len(params_s):
+            raise SignatureError("Argument number mismatch")
         for i, s_param in enumerate(params_s):
             arg = unionof(args_s[i], s_param)
             if not s_param.contains(arg):
@@ -18,18 +24,20 @@
                                 "arg %d must be %s,\n"
                                 "          got %s" % (
                     self.name, i+1, s_param, args_s[i]))
-        return params_s
 
-    def compute_result_annotation(self, *args_s):
-        self.check_args(*args_s)
-        return self.signature_result
+    def call(self, callspec):
+        self.check_args(callspec)
+        return self.s_result
+
+class ExtFuncEntry(ExtRegistryEntry):
+    safe_not_sandboxed = False
 
     def compute_annotation(self):
-        s_result = super(ExtFuncEntry, self).compute_annotation()
+        s_result = SomeExternalFunction(
+                self.name, self.signature_args, self.signature_result)
         if (self.bookkeeper.annotator.translator.config.translation.sandbox
                 and not self.safe_not_sandboxed):
             s_result.needs_sandboxing = True
-            s_result.entry = self
         return s_result
 
     def specialize_call(self, hop):


More information about the pypy-commit mailing list