code.error_goto_if_null(type.typeptr_cname, pos))
self.use_type_import_utility_code(env)
if type.vtabptr_cname:
- code.putln(
- "if (__Pyx_GetVtable(%s->tp_dict, &%s) < 0) %s" % (
- type.typeptr_cname,
- type.vtabptr_cname,
- code.error_goto(pos)))
env.use_utility_code(Nodes.get_vtable_utility_code)
+ code.putln("%s = (struct %s*)__Pyx_GetVtable(%s->tp_dict); %s" % (
+ type.vtabptr_cname,
+ type.vtabstruct_cname,
+ type.typeptr_cname,
+ code.error_goto_if_null(type.vtabptr_cname, pos)))
env.types_imported[type] = 1
py3_type_name_map = {'str' : 'bytes', 'unicode' : 'str'}
get_vtable_utility_code = UtilityCode(
proto = """
-static int __Pyx_GetVtable(PyObject *dict, void *vtabptr); /*proto*/
+static void* __Pyx_GetVtable(PyObject *dict); /*proto*/
""",
impl = r"""
-static int __Pyx_GetVtable(PyObject *dict, void *vtabptr) {
+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)
- *(void **)vtabptr = PyCapsule_GetPointer(ob, 0);
+ ptr = PyCapsule_GetPointer(ob, 0);
#else
- *(void **)vtabptr = PyCObject_AsVoidPtr(ob);
+ ptr = PyCObject_AsVoidPtr(ob);
#endif
- if (!*(void **)vtabptr)
- goto bad;
+ if (!ptr && !PyErr_Occurred())
+ PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type");
Py_DECREF(ob);
- return 0;
+ return ptr;
bad:
Py_XDECREF(ob);
- return -1;
+ return NULL;
}
""")