From: Stefan Behnel Date: Wed, 1 May 2013 11:57:03 +0000 (+0200) Subject: move vtable get/set utility code into ExtensionTypes.c file X-Git-Tag: 0.19.1~25 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9053c1e79071c3874106a72cd6a3e56c170f9b83;p=platform%2Fupstream%2Fpython-cython.git move vtable get/set utility code into ExtensionTypes.c file --- diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index 933ea6e..8816688 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -2396,7 +2396,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): self.generate_type_import_call(type, code, code.error_goto_if_null(type.typeptr_cname, pos)) if type.vtabptr_cname: - env.use_utility_code(Nodes.get_vtable_utility_code) + code.globalstate.use_utility_code( + UtilityCode.load_cached('GetVTable', 'ExtensionTypes.c')) code.putln("%s = (struct %s*)__Pyx_GetVtable(%s->tp_dict); %s" % ( type.vtabptr_cname, type.vtabstruct_cname, @@ -2501,7 +2502,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): typeobj_cname, type.vtabptr_cname, code.error_goto(entry.pos))) - env.use_utility_code(Nodes.set_vtable_utility_code) + code.globalstate.use_utility_code( + UtilityCode.load_cached('SetVTable', 'ExtensionTypes.c')) if not type.scope.is_internal and not type.scope.directives['internal']: # scope.is_internal is set for types defined by # Cython (such as closures), the 'internal' diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index b8d5b9c..a4fa4c0 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -8099,55 +8099,3 @@ static PyObject *__Pyx_GetExceptionTuple(void) { } """, requires=[get_exception_utility_code]) - -#------------------------------------------------------------------------------------ - -set_vtable_utility_code = UtilityCode( -proto = """ -static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/ -""", -impl = """ -static int __Pyx_SetVtable(PyObject *dict, void *vtable) { -#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) - PyObject *ob = PyCapsule_New(vtable, 0, 0); -#else - PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); -#endif - if (!ob) - goto bad; - if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0) - goto bad; - Py_DECREF(ob); - return 0; -bad: - Py_XDECREF(ob); - return -1; -} -""") - -#------------------------------------------------------------------------------------ - -get_vtable_utility_code = UtilityCode( -proto = """ -static void* __Pyx_GetVtable(PyObject *dict); /*proto*/ -""", -impl = r""" -static void* __Pyx_GetVtable(PyObject *dict) { - void* ptr; - PyObject *ob = PyMapping_GetItemString(dict, (char *)"__pyx_vtable__"); - if (!ob) - goto bad; -#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) - ptr = PyCapsule_GetPointer(ob, 0); -#else - ptr = PyCObject_AsVoidPtr(ob); -#endif - if (!ptr && !PyErr_Occurred()) - PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); - Py_DECREF(ob); - return ptr; -bad: - Py_XDECREF(ob); - return NULL; -} -""") diff --git a/Cython/Utility/ExtensionTypes.c b/Cython/Utility/ExtensionTypes.c index 423ed96..f05f043 100644 --- a/Cython/Utility/ExtensionTypes.c +++ b/Cython/Utility/ExtensionTypes.c @@ -51,3 +51,52 @@ static void __Pyx_call_next_tp_clear(PyObject* obj, inquiry current_tp_clear) { if (type && type->tp_clear) type->tp_clear(obj); } + + +/////////////// SetVTable.proto /////////////// + +static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/ + +/////////////// SetVTable /////////////// + +static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#else + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/////////////// GetVTable.proto /////////////// + +static void* __Pyx_GetVtable(PyObject *dict); /*proto*/ + +/////////////// GetVTable /////////////// + +static void* __Pyx_GetVtable(PyObject *dict) { + void* ptr; + PyObject *ob = PyMapping_GetItemString(dict, (char *)"__pyx_vtable__"); + if (!ob) + goto bad; +#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) + ptr = PyCapsule_GetPointer(ob, 0); +#else + ptr = PyCObject_AsVoidPtr(ob); +#endif + if (!ptr && !PyErr_Occurred()) + PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); + Py_DECREF(ob); + return ptr; +bad: + Py_XDECREF(ob); + return NULL; +}