Author: Antonio Cuni <anto.c...@gmail.com> Branch: cpyext-nowrapper Changeset: r92629:9c8e90ccce77 Date: 2017-10-07 12:33 +0200 http://bitbucket.org/pypy/pypy/changeset/9c8e90ccce77/
Log: copy&adapt state.C from the branch cpyext-avoid-roundtrip, to be able to directly call functions defined in C; improve _PyObject_NewVar to compare tp directly with PyType_Type, without passing through the space diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -1108,6 +1108,14 @@ _reinit_tls() add_fork_hook('child', reinit_tls) + +def attach_c_functions(space, eci, prefix): + state = space.fromcache(State) + state.C._PyPy_get_PyType_Type = rffi.llexternal( + '_PyPy_get_PyType_Type', [], PyTypeObjectPtr, + compilation_info=eci, _nowrapper=True) + + def init_function(func): INIT_FUNCTIONS.append(func) return func @@ -1176,6 +1184,7 @@ space.fromcache(State).install_dll(eci) modulename = py.path.local(eci.libraries[-1]) + attach_c_functions(space, eci, prefix) run_bootstrap_functions(space) # load the bridge, and init structure @@ -1419,6 +1428,7 @@ source_dir / "pythread.c", source_dir / "missing.c", source_dir / "pymem.c", + source_dir / "typeobject.c", ] def build_eci(code, use_micronumpy=False, translating=False): @@ -1513,6 +1523,7 @@ eci = build_eci(code, use_micronumpy, translating=True) space.fromcache(State).install_dll(eci) + attach_c_functions(space, eci, prefix) run_bootstrap_functions(space) # emit uninitialized static data diff --git a/pypy/module/cpyext/include/object.h b/pypy/module/cpyext/include/object.h --- a/pypy/module/cpyext/include/object.h +++ b/pypy/module/cpyext/include/object.h @@ -330,7 +330,7 @@ PyAPI_FUNC(int) PyPyType_Register(PyTypeObject *); #define PyObject_Length PyObject_Size #define _PyObject_GC_Del PyObject_GC_Del - +PyAPI_FUNC(PyTypeObject*) _PyPy_get_PyType_Type(void); #ifdef __cplusplus } diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py --- a/pypy/module/cpyext/object.py +++ b/pypy/module/cpyext/object.py @@ -9,6 +9,7 @@ get_typedescr) from pypy.module.cpyext.typeobject import PyTypeObjectPtr from pypy.module.cpyext.pyerrors import PyErr_NoMemory, PyErr_BadInternalCall +from pypy.module.cpyext.state import State from pypy.objspace.std.typeobject import W_TypeObject from pypy.interpreter.error import OperationError, oefmt import pypy.module.__builtin__.operation as operation @@ -50,11 +51,10 @@ @cpython_api([PyTypeObjectPtr, Py_ssize_t], PyObject, result_is_ll=True) def _PyObject_NewVar(space, tp, nitems): from pypy.module.cpyext.pyobject import _allocate_generic_object - - w_type = from_ref(space, rffi.cast(PyObject, tp)) - assert isinstance(w_type, W_TypeObject) - if w_type is space.w_type: - # XXX: integrate this logic with the one below + state = space.fromcache(State) + if tp is state.C._PyPy_get_PyType_Type(): + w_type = from_ref(space, rffi.cast(PyObject, tp)) + assert isinstance(w_type, W_TypeObject) typedescr = get_typedescr(w_type.layout.typedef) pyobj = typedescr.allocate(space, w_type, itemcount=nitems) else: diff --git a/pypy/module/cpyext/src/typeobject.c b/pypy/module/cpyext/src/typeobject.c new file mode 100644 --- /dev/null +++ b/pypy/module/cpyext/src/typeobject.c @@ -0,0 +1,7 @@ +#include "Python.h" + +PyTypeObject* +_PyPy_get_PyType_Type(void) +{ + return &PyType_Type; +} diff --git a/pypy/module/cpyext/state.py b/pypy/module/cpyext/state.py --- a/pypy/module/cpyext/state.py +++ b/pypy/module/cpyext/state.py @@ -14,6 +14,7 @@ self.programname = lltype.nullptr(rffi.CCHARP.TO) self.version = lltype.nullptr(rffi.CCHARP.TO) self.builder = None + self.C = CNamespace() def reset(self): from pypy.module.cpyext.modsupport import PyMethodDef @@ -168,6 +169,11 @@ return w_mod +class CNamespace: + def _freeze_(self): + return True + + def _rawrefcount_perform(space): from pypy.module.cpyext.pyobject import PyObject, decref while True: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit