env.control_flow.set_state(self.pos, (self.name, 'source'), 'assignment')
if self.entry.is_declared_generic:
self.result_ctype = py_object_type
- if self.entry.is_pyglobal and self.entry.is_member:
- env.use_utility_code(type_cache_invalidation_code)
def analyse_types(self, env):
if self.entry is None:
self.interned_cname,
rhs.py_result()))
# in Py2.6+, we need to invalidate the method cache
- code.putln("__Pyx_TypeModified(%s);" %
+ code.putln("PyType_Modified(%s);" %
entry.scope.parent_type.typeptr_cname)
else:
code.put_error_if_neg(self.pos,
#------------------------------------------------------------------------------------
-type_cache_invalidation_code = [
-"""
-#if PY_VERSION_HEX >= 0x02060000
-/* #define __Pyx_TypeModified(t) PyType_Modified(t) */ /* Py3.0beta1 */
-static void __Pyx_TypeModified(PyTypeObject* type); /*proto*/
-#else
- #define __Pyx_TypeModified(t)
-#endif
-""","""
-#if PY_VERSION_HEX >= 0x02060000
-/* copied from typeobject.c in Python 3.0a5 */
-static void __Pyx_TypeModified(PyTypeObject* type) {
- PyObject *raw, *ref;
- Py_ssize_t i, n;
-
- if (!PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
- return;
-
- raw = type->tp_subclasses;
- if (raw != NULL) {
- n = PyList_GET_SIZE(raw);
- for (i = 0; i < n; i++) {
- ref = PyList_GET_ITEM(raw, i);
- ref = PyWeakref_GET_OBJECT(ref);
- if (ref != Py_None) {
- __Pyx_TypeModified((PyTypeObject *)ref);
- }
- }
- }
- type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
-}
-#endif
-"""
-]
-
-#------------------------------------------------------------------------------------
-
# If the is_unsigned flag is set, we need to do some extra work to make
# sure the index doesn't become negative.
code.putln(" #define Py_SIZE(ob) ((PyVarObject*)(ob))->ob_size)")
code.putln(" #define PyVarObject_HEAD_INIT(type, size) \\")
code.putln(" PyObject_HEAD_INIT(type) size,")
+ code.putln(" #define PyType_Modified(t)")
code.putln("")
code.putln(" typedef struct {")
code.putln(" void *buf;")