[pypy-commit] pypy hpy: Begin implementing hpy_universal.load()
rlamy
pypy.commits at gmail.com
Sat Nov 16 11:01:55 EST 2019
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: hpy
Changeset: r98075:54d6b14f3362
Date: 2019-11-16 17:01 +0100
http://bitbucket.org/pypy/pypy/changeset/54d6b14f3362/
Log: Begin implementing hpy_universal.load()
diff --git a/pypy/module/hpy_universal/interp_hpy.py b/pypy/module/hpy_universal/interp_hpy.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/hpy_universal/interp_hpy.py
@@ -0,0 +1,36 @@
+from rpython.rtyper.lltypesystem import rffi
+from rpython.rlib.rdynload import dlopen, dlsym, DLOpenError
+
+from pypy.interpreter.gateway import unwrap_spec
+from pypy.interpreter.error import raise_import_error
+
+
+def create_hpy_module(space, name, origin, lib, initfunc):
+ state = space.fromcache(State)
+ ctx = state.context
+ h_module = generic_cpy_call_dont_convert_result(space, initfunc, ctx)
+ return from_hpy(h_module)
+
+ at unwrap_spec(origin='fsencode', init_name='text')
+def descr_load(space, origin, init_name):
+ # XXX: this looks a lot like cpyext.api.create_extension_module()
+ name = init_name[len('HPyInit_'):]
+ try:
+ with rffi.scoped_str2charp(origin) as ll_libname:
+ lib = dlopen(ll_libname, space.sys.dlopenflags)
+ except DLOpenError as e:
+ w_path = space.newfilename(origin)
+ w_name = space.newtext(name)
+ raise raise_import_error(space,
+ space.newfilename(e.msg), w_name, w_path)
+
+ try:
+ initptr = dlsym(lib, init_name)
+ except KeyError:
+ msg = b"function %s not found in library %s" % (
+ init_name, space.utf8_w(space.newfilename(origin)))
+ w_path = space.newfilename(origin)
+ w_name = space.newtext(name)
+ raise raise_import_error(
+ space, space.newtext(msg), w_name, w_path)
+ return create_hpy_module(space, name, origin, lib, initptr)
diff --git a/pypy/module/hpy_universal/moduledef.py b/pypy/module/hpy_universal/moduledef.py
--- a/pypy/module/hpy_universal/moduledef.py
+++ b/pypy/module/hpy_universal/moduledef.py
@@ -1,5 +1,7 @@
from pypy.interpreter.mixedmodule import MixedModule
class Module(MixedModule):
- interpleveldefs ={}
+ interpleveldefs = {
+ 'load': 'interp_hpy.descr_load'
+ }
appleveldefs = {}
More information about the pypy-commit
mailing list