Commit b421819a authored by Stefan Behnel's avatar Stefan Behnel

use inlined setattr also for delattr

parent 76f2ea63
...@@ -1953,8 +1953,10 @@ class NameNode(AtomicExprNode): ...@@ -1953,8 +1953,10 @@ class NameNode(AtomicExprNode):
else: else:
code.put_error_if_neg(self.pos, del_code) code.put_error_if_neg(self.pos, del_code)
elif self.entry.is_pyglobal: elif self.entry.is_pyglobal:
code.globalstate.use_utility_code(
UtilityCode.load_cached("PyObjectSetAttrStr", "ObjectHandling.c"))
interned_cname = code.intern_identifier(self.entry.name) 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) Naming.module_cname, interned_cname)
if ignore_nonexisting: if ignore_nonexisting:
code.putln('if (unlikely(%s < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s }' % ( code.putln('if (unlikely(%s < 0)) { if (likely(PyErr_ExceptionMatches(PyExc_AttributeError))) PyErr_Clear(); else %s }' % (
...@@ -5210,10 +5212,12 @@ class AttributeNode(ExprNode): ...@@ -5210,10 +5212,12 @@ class AttributeNode(ExprNode):
def generate_deletion_code(self, code, ignore_nonexisting=False): def generate_deletion_code(self, code, ignore_nonexisting=False):
self.obj.generate_evaluation_code(code) 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): 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, code.put_error_if_neg(self.pos,
'PyObject_DelAttr(%s, %s)' % ( '__Pyx_PyObject_DelAttrStr(%s, %s)' % (
self.obj.py_result(), self.obj.py_result(),
code.intern_identifier(self.attribute))) code.intern_identifier(self.attribute)))
else: else:
......
...@@ -660,6 +660,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject ...@@ -660,6 +660,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
/////////////// PyObjectSetAttrStr.proto /////////////// /////////////// PyObjectSetAttrStr.proto ///////////////
#if CYTHON_COMPILING_IN_CPYTHON #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) { static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
PyTypeObject* tp = Py_TYPE(obj); PyTypeObject* tp = Py_TYPE(obj);
if (likely(tp->tp_setattro)) if (likely(tp->tp_setattro))
...@@ -671,6 +672,7 @@ static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr ...@@ -671,6 +672,7 @@ static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr
return PyObject_SetAttr(obj, attr_name, value); return PyObject_SetAttr(obj, attr_name, value);
} }
#else #else
#define __Pyx_PyObject_DelAttrStr(o,n) PyObject_DelAttr(o,n)
#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v) #define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment