From: Stefan Behnel Date: Sat, 9 Mar 2013 08:03:11 +0000 (+0100) Subject: use inlined setattr also for delattr X-Git-Tag: 0.19b1~80 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b421819ab1ffd58f121a51a0d2d7a6778a78fbd2;p=platform%2Fupstream%2Fpython-cython.git use inlined setattr also for delattr --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index dfe09b6..924918e 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -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: diff --git a/Cython/Utility/ObjectHandling.c b/Cython/Utility/ObjectHandling.c index 075b7fd..151d60d 100644 --- a/Cython/Utility/ObjectHandling.c +++ b/Cython/Utility/ObjectHandling.c @@ -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