use inlined setattr also for delattr
authorStefan Behnel <stefan_ml@behnel.de>
Sat, 9 Mar 2013 08:03:11 +0000 (09:03 +0100)
committerStefan Behnel <stefan_ml@behnel.de>
Sat, 9 Mar 2013 08:03:11 +0000 (09:03 +0100)
Cython/Compiler/ExprNodes.py
Cython/Utility/ObjectHandling.c

index dfe09b6..924918e 100755 (executable)
@@ -1953,8 +1953,10 @@ class NameNode(AtomicExprNode):
             else:
                 code.put_error_if_neg(self.pos, del_code)
         elif self.entry.is_pyglobal:
+            code.globalstate.use_utility_code(
+                UtilityCode.load_cached("PyObjectSetAttrStr", "ObjectHandling.c"))
             interned_cname = code.intern_identifier(self.entry.name)
-            del_code = 'PyObject_DelAttr(%s, %s)' % (
+            del_code = '__Pyx_PyObject_DelAttrStr(%s, %s)' % (
                 Naming.module_cname, interned_cname)
             if ignore_nonexisting:
                 code.putln('if (unlikely(%s < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s }' % (
@@ -5210,10 +5212,12 @@ class AttributeNode(ExprNode):
 
     def generate_deletion_code(self, code, ignore_nonexisting=False):
         self.obj.generate_evaluation_code(code)
-        if self.is_py_attr or (isinstance(self.entry.scope, Symtab.PropertyScope)
+        if self.is_py_attr or (self.entry.scope.is_property_scope
                                and u'__del__' in self.entry.scope.entries):
+            code.globalstate.use_utility_code(
+                UtilityCode.load_cached("PyObjectSetAttrStr", "ObjectHandling.c"))
             code.put_error_if_neg(self.pos,
-                'PyObject_DelAttr(%s, %s)' % (
+                '__Pyx_PyObject_DelAttrStr(%s, %s)' % (
                     self.obj.py_result(),
                     code.intern_identifier(self.attribute)))
         else:
index 075b7fd..151d60d 100644 (file)
@@ -660,6 +660,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
 /////////////// PyObjectSetAttrStr.proto ///////////////
 
 #if CYTHON_COMPILING_IN_CPYTHON
+#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL)
 static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
     PyTypeObject* tp = Py_TYPE(obj);
     if (likely(tp->tp_setattro))
@@ -671,6 +672,7 @@ static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr
     return PyObject_SetAttr(obj, attr_name, value);
 }
 #else
+#define __Pyx_PyObject_DelAttrStr(o,n)   PyObject_DelAttr(o,n)
 #define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
 #endif