Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit