Commit 76f2ea63 authored by Stefan Behnel's avatar Stefan Behnel

speed up object attribute setting a little

parent 8f428c03
...@@ -1837,7 +1837,7 @@ class NameNode(AtomicExprNode): ...@@ -1837,7 +1837,7 @@ class NameNode(AtomicExprNode):
elif entry.is_pyclass_attr: elif entry.is_pyclass_attr:
setter = 'PyObject_SetItem' setter = 'PyObject_SetItem'
else: else:
setter = 'PyObject_SetAttr' assert False, repr(entry)
code.put_error_if_neg( code.put_error_if_neg(
self.pos, self.pos,
'%s(%s, %s, %s)' % ( '%s(%s, %s, %s)' % (
...@@ -5171,8 +5171,10 @@ class AttributeNode(ExprNode): ...@@ -5171,8 +5171,10 @@ class AttributeNode(ExprNode):
def generate_assignment_code(self, rhs, code): def generate_assignment_code(self, rhs, code):
self.obj.generate_evaluation_code(code) self.obj.generate_evaluation_code(code)
if self.is_py_attr: if self.is_py_attr:
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_SetAttr(%s, %s, %s)' % ( '__Pyx_PyObject_SetAttrStr(%s, %s, %s)' % (
self.obj.py_result(), self.obj.py_result(),
code.intern_identifier(self.attribute), code.intern_identifier(self.attribute),
rhs.py_result())) rhs.py_result()))
......
...@@ -657,6 +657,23 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject ...@@ -657,6 +657,23 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
#endif #endif
/////////////// PyObjectSetAttrStr.proto ///////////////
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
PyTypeObject* tp = Py_TYPE(obj);
if (likely(tp->tp_setattro))
return tp->tp_setattro(obj, attr_name, value);
#if PY_MAJOR_VERSION < 3
if (likely(tp->tp_setattr))
return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value);
#endif
return PyObject_SetAttr(obj, attr_name, value);
}
#else
#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
#endif
/////////////// PyObjectCallMethod.proto /////////////// /////////////// PyObjectCallMethod.proto ///////////////
//@requires: PyObjectGetAttrStr //@requires: PyObjectGetAttrStr
//@substitute: naming //@substitute: naming
......
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