From 7254e5a3edd85563d333ba5aa2978d7cd7daa96a Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sat, 6 Oct 2001 17:45:17 +0000 Subject: _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. --- Objects/object.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index a008245..ed5f360 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -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); } -- cgit v0.12