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