From: Guido van Rossum Date: Mon, 19 Aug 2002 16:50:48 +0000 (+0000) Subject: Inline call to _PyObject_GetDictPtr() in PyObject_GenericGetAttr(). X-Git-Tag: v2.3c1~4405 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c66ff4441e7c4806ff9a73a42ab9229a1988b8df;p=python Inline call to _PyObject_GetDictPtr() in PyObject_GenericGetAttr(). This causes a modest speedup. --- diff --git a/Objects/object.c b/Objects/object.c index 70ff3eda04..5120eb52f6 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1292,6 +1292,7 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name) PyObject *descr; PyObject *res = NULL; descrgetfunc f; + long dictoffset; PyObject **dictptr; if (!PyString_Check(name)){ @@ -1330,9 +1331,25 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name) } } - dictptr = _PyObject_GetDictPtr(obj); - if (dictptr != NULL) { - PyObject *dict = *dictptr; + /* Inline _PyObject_GetDictPtr */ + dictoffset = tp->tp_dictoffset; + if (dictoffset != 0) { + PyObject *dict; + if (dictoffset < 0) { + int tsize; + size_t size; + + tsize = ((PyVarObject *)obj)->ob_size; + if (tsize < 0) + tsize = -tsize; + size = _PyObject_VAR_SIZE(tp, tsize); + + dictoffset += (long)size; + assert(dictoffset > 0); + assert(dictoffset % SIZEOF_VOID_P == 0); + } + dictptr = (PyObject **) ((char *)obj + dictoffset); + dict = *dictptr; if (dict != NULL) { res = PyDict_GetItem(dict, name); if (res != NULL) {