Author: Armin Rigo <ar...@tunes.org> Branch: sandbox-lib Changeset: r83175:cd639cdf1174 Date: 2016-03-19 20:32 +0100 http://bitbucket.org/pypy/pypy/changeset/cd639cdf1174/
Log: in-progress 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 @@ -855,7 +855,7 @@ if 'RPY_SANDBOXED' in defines: from rpython.translator.sandboxlib.rsandbox import add_sandbox_files - eci = add_sandbox_files(database.translator, eci) + eci = add_sandbox_files(database, eci) eci = add_extra_files(eci) eci = eci.convert_sources_to_files() 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 @@ -6,8 +6,8 @@ class SandboxExternalFunc(object): - def __init__(self, cptrname): - self.cptrname = cptrname + def __init__(self, cfuncname): + self.cfuncname = cfuncname def make_sandbox_trampoline(translator, fnname, args_s, s_result): @@ -23,14 +23,14 @@ extfuncs, seen = translator._sandboxlib_fnnames = {}, set() if fnname not in extfuncs: - # map from 'fnname' to the C name of the function pointer - cptrname = fnname + # map from 'fnname' to the C function doing the call + cfuncname = 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) + cfuncname = fnname.split('.', 1)[1] # drop the part before the '.' + cfuncname = 'sandbox_' + cfuncname + assert cfuncname not in seen, "duplicate name %r" % (cfuncname,) + seen.add(cfuncname) + sandboxfunc = SandboxExternalFunc(cfuncname) extfuncs[fnname] = sandboxfunc else: sandboxfunc = extfuncs[fnname] @@ -68,25 +68,57 @@ args_s, s_result = sandboxfunc.args_s, sandboxfunc.s_result nb_args = len(args_s) assert len(hop.spaceop.args) == 2 + nb_args - + assert len(hop.args_r) == 1 + 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 + if not hasattr(sandboxfunc, 'externalfunc'): + externalfunc = rffi.llexternal(sandboxfunc.cfuncname, + [r.lowleveltype for r in args_r], + r_result.lowleveltype, + sandboxsafe=True, + _nowrapper=True) + sandboxfunc.externalfunc = externalfunc + else: + externalfunc = sandboxfunc.externalfunc -def add_sandbox_files(translator, eci): - srcdir = py.path.local(__file__).join('..', 'src') - files = [ - srcdir / 'foo.c', - ] - fnnames = sorted(translator._sandboxlib_fnnames[0]) + c_externalfunc = hop.inputconst(lltype.typeOf(externalfunc), + externalfunc) + + args_v = [hop.inputarg(args_r[i], 1 + i) for i in range(nb_args)] + hop.exception_cannot_occur() + return hop.genop("direct_call", [c_externalfunc] + args_v, + resulttype = r_result) + + +def add_sandbox_files(database, eci): + from rpython.translator.c.support import cdecl + + c_header = ['#include "common_header.h"\n'] + c_source = ['#include "sandboxlib.h"\n'] + fnnames = database.translator._sandboxlib_fnnames[0] + for fnname in sorted(fnnames): + sandboxfunc = fnnames[fnname] + if hasattr(sandboxfunc, 'externalfunc'): + externalfunc = sandboxfunc.externalfunc + TP = lltype.typeOf(externalfunc) + vardecl = cdecl(database.gettype(TP), sandboxfunc.cfuncname) + c_header.append('RPY_SANDBOX_EXPORTED %s;\n' % (vardecl,)) + # + emptyfuncname = 'empty_' + sandboxfunc.cfuncname + argnames = ['a%d' % i for i in range(len(TP.TO.ARGS))] + c_source.append(""" +static %s { + abort(); +}; +%s = %s; +""" % (cdecl(database.gettype(TP.TO, argnames=argnames), emptyfuncname), + vardecl, emptyfuncname)) + import pdb;pdb.set_trace() - return eci.merge(ExternalCompilationInfo(separate_module_files=files)) + #srcdir = py.path.local(__file__).join('..', 'src') + #files = [ + # srcdir / 'foo.c', + #] + #return eci.merge(ExternalCompilationInfo(separate_module_files=files)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit