_PyObject_GetDictPtr():

+ Use the _PyObject_VAR_SIZE macro to compute object size.
+ Break the computation into lines convenient for debugger inspection.
+ Speed the round-up-to-pointer-size computation.
This commit is contained in:
Tim Peters 2001-10-06 17:45:17 +00:00
parent 8c18f25850
commit 7254e5a3ed

View File

@ -1157,15 +1157,19 @@ _PyObject_GetDictPtr(PyObject *obj)
if (dictoffset == 0)
return NULL;
if (dictoffset < 0) {
dictoffset += tp->tp_basicsize;
dictoffset += tp->tp_itemsize * ((PyVarObject *)obj)->ob_size;
/* dictoffset is positive by the time we're ready to round
it, and compilers can generate faster rounding code if
they know that. */
unsigned long udo; /* unsigned dictoffset */
const long nitems = ((PyVarObject *)obj)->ob_size;
const long size = _PyObject_VAR_SIZE(tp, nitems);
dictoffset += size;
assert(dictoffset > 0); /* Sanity check */
/* Round up, if necessary */
if (dictoffset % PTRSIZE != 0) {
dictoffset /= PTRSIZE;
dictoffset += 1;
dictoffset *= PTRSIZE;
}
/* Round up to multiple of PTRSIZE. */
udo = (unsigned long)dictoffset;
udo = ((udo + PTRSIZE-1) / PTRSIZE) * PTRSIZE;
dictoffset = (long)udo;
}
return (PyObject **) ((char *)obj + dictoffset);
}