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