Author: Armin Rigo <ar...@tunes.org>
Branch: sandbox-lib
Changeset: r83174:446297152ae0
Date: 2016-03-19 19:49 +0100
http://bitbucket.org/pypy/pypy/changeset/446297152ae0/

Log:    in-progress, but looks like the wrong level somewhere

diff --git a/rpython/annotator/policy.py b/rpython/annotator/policy.py
--- a/rpython/annotator/policy.py
+++ b/rpython/annotator/policy.py
@@ -90,6 +90,7 @@
                     s_result = s_func.s_result
                     from rpython.translator.sandboxlib.rsandbox import 
make_sandbox_trampoline
                     sandbox_trampoline = make_sandbox_trampoline(
+                        annotator.translator,
                         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)
diff --git a/rpython/config/translationoption.py 
b/rpython/config/translationoption.py
--- a/rpython/config/translationoption.py
+++ b/rpython/config/translationoption.py
@@ -109,6 +109,7 @@
     BoolOption("sandboxlib", "Produce a fully-sandboxed library",
                default=False, cmdline="--sandboxlib",
                requires=[("translation.thread", False),
+                         ("translation.continuation", False),
                          ("translation.shared", True)],
                suggests=[("translation.gc", "minimark"),
                          ("translation.gcrootfinder", "shadowstack")]),
diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py
--- a/rpython/rtyper/rtyper.py
+++ b/rpython/rtyper/rtyper.py
@@ -584,7 +584,8 @@
             else:
                 args_s = [v.annotation for v in graph.getargs()]
                 s_result = graph.getreturnvar().annotation
-                sandboxed = make_sandbox_trampoline(name, args_s, s_result)
+                sandboxed = make_sandbox_trampoline(self.annotator.translator,
+                                                    name, args_s, s_result)
                 return self.getannmixlevel().delayedfunction(
                         sandboxed, args_s, s_result)
 
diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -853,6 +853,10 @@
         print >>fi, "#define PYPY_INSTRUMENT_NCOUNTER %d" % n
         fi.close()
 
+    if 'RPY_SANDBOXED' in defines:
+        from rpython.translator.sandboxlib.rsandbox import add_sandbox_files
+        eci = add_sandbox_files(database.translator, eci)
+
     eci = add_extra_files(eci)
     eci = eci.convert_sources_to_files()
     return eci, filename, sg.getextrafiles(), headers_to_precompile
diff --git a/rpython/translator/platform/posix.py 
b/rpython/translator/platform/posix.py
--- a/rpython/translator/platform/posix.py
+++ b/rpython/translator/platform/posix.py
@@ -121,7 +121,9 @@
 
         if shared:
             libname = exe_name.new(ext='').basename
-            target_name = 'lib' + exe_name.new(ext=self.so_ext).basename
+            if sandboxlib:
+                libname += '-sandbox'
+            target_name = 'lib%s.%s' % (libname, self.so_ext)
         else:
             target_name = exe_name.basename
 
@@ -201,9 +203,10 @@
         for rule in rules:
             m.rule(*rule)
 
+        if shared:
+            m.definition('SHARED_IMPORT_LIB', libname)
+            m.definition('PYPY_MAIN_FUNCTION', "pypy_main_startup")
         if shared and not sandboxlib:
-            m.definition('SHARED_IMPORT_LIB', libname),
-            m.definition('PYPY_MAIN_FUNCTION', "pypy_main_startup")
             m.rule('main.c', '',
                    'echo "'
                    'int $(PYPY_MAIN_FUNCTION)(int, char*[]); '
diff --git a/rpython/translator/sandboxlib/rsandbox.py 
b/rpython/translator/sandboxlib/rsandbox.py
--- a/rpython/translator/sandboxlib/rsandbox.py
+++ b/rpython/translator/sandboxlib/rsandbox.py
@@ -1,13 +1,92 @@
+import py
+from rpython.rlib import jit
+from rpython.annotator import model as annmodel
+from rpython.rtyper.extregistry import ExtRegistryEntry
+from rpython.rtyper.lltypesystem import lltype, rffi
 
 
-def make_sandbox_trampoline(fnname, args_s, s_result):
+class SandboxExternalFunc(object):
+    def __init__(self, cptrname):
+        self.cptrname = cptrname
+
+
+def make_sandbox_trampoline(translator, fnname, args_s, s_result):
     """Create a trampoline function with the specified signature.
 
     The trampoline is meant to be used in place of real calls to the external
     function named 'fnname'.  Instead, it calls a function pointer that is
     under control of the main C program using the sandboxed library.
     """
+    try:
+        extfuncs, seen = translator._sandboxlib_fnnames
+    except AttributeError:
+        extfuncs, seen = translator._sandboxlib_fnnames = {}, set()
+
+    if fnname not in extfuncs:
+        # map from 'fnname' to the C name of the function pointer
+        cptrname = fnname
+        if '.' in fnname:
+            cptrname = fnname.split('.', 1)[1]   # drop the part before the '.'
+        cptrname = 'sandbox_' + cptrname
+        assert cptrname not in seen, "duplicate name %r" % (cptrname,)
+        seen.add(cptrname)
+        sandboxfunc = SandboxExternalFunc(cptrname)
+        extfuncs[fnname] = sandboxfunc
+    else:
+        sandboxfunc = extfuncs[fnname]
+        pargs_s, s_presult = sandboxfunc.args_s, sandboxfunc.s_result
+        assert len(args_s) == len(pargs_s), (
+            "non-constant argument length for %r" % (fnname,))
+        args_s = [annmodel.unionof(s1, s2) for (s1, s2) in zip(args_s, 
pargs_s)]
+        s_result = annmodel.unionof(s_result, s_presult)
+    sandboxfunc.args_s = args_s
+    sandboxfunc.s_result = s_result
+    #
+    @jit.dont_look_inside
     def execute(*args):
-        raise NotImplementedError
+        return _call_sandbox(fnname, *args)
     execute.__name__ = 'sandboxed_%s' % (fnname,)
     return execute
+
+def _call_sandbox(fnname, *args):
+    "NOT_RPYTHON"
+    raise NotImplementedError
+
+class ExtEntry(ExtRegistryEntry):
+    _about_ = _call_sandbox
+
+    def compute_result_annotation(self, s_fnname, *args_s):
+        fnname = s_fnname.const
+        translator = self.bookkeeper.annotator.translator
+        sandboxfunc = translator._sandboxlib_fnnames[0][fnname]
+        return sandboxfunc.s_result
+
+    def specialize_call(self, hop):
+        fnname = hop.spaceop.args[1].value
+        translator = hop.rtyper.annotator.translator
+        sandboxfunc = translator._sandboxlib_fnnames[0][fnname]
+        args_s, s_result = sandboxfunc.args_s, sandboxfunc.s_result
+        nb_args = len(args_s)
+        assert len(hop.spaceop.args) == 2 + nb_args
+
+        args_r = [hop.rtyper.getrepr(s) for s in args_s]
+        r_result = hop.rtyper.getrepr(s_result)
+        FUNCPTR = lltype.Ptr(lltype.FuncType([r.lowleveltype for r in args_r],
+                                             r_result.lowleveltype))
+        externalfuncptr = rffi.CConstant(sandbox.cptrname, FUNCPTR)
+        import pdb;pdb.set_trace()
+        
+        for i in range(nb_args):
+            v_arg = hop.inputarg(args_r[i], 2 + i)
+            xxx
+
+
+def add_sandbox_files(translator, eci):
+    srcdir = py.path.local(__file__).join('..', 'src')
+    files = [
+        srcdir / 'foo.c',
+    ]
+    fnnames = sorted(translator._sandboxlib_fnnames[0])
+    import pdb;pdb.set_trace()
+    
+    return eci.merge(ExternalCompilationInfo(separate_module_files=files))
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to