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

Reply via email to