From: Guido van Rossum Date: Thu, 30 Aug 2001 16:06:23 +0000 (+0000) Subject: Do the int inlining only if the type is really an int, not whenever X-Git-Tag: v2.2a3~201 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=46add98758415f6180532326571d73f22966c34e;p=python Do the int inlining only if the type is really an int, not whenever PyInt_Check() succeeds. That returns true for subtypes of int, which may override __add__ or __sub__. --- diff --git a/Python/ceval.c b/Python/ceval.c index cb95aaa88d..6eebf948e4 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -548,6 +548,9 @@ eval_frame(PyFrameObject *f) #define POP() BASIC_POP() #endif +/* Strict int check macros */ +#define ISSTRICTINT(v) ((v)->ob_type == &PyInt_Type) + /* Local variable macros */ #define GETLOCAL(i) (fastlocals[i]) @@ -909,7 +912,7 @@ eval_frame(PyFrameObject *f) case BINARY_ADD: w = POP(); v = POP(); - if (PyInt_Check(v) && PyInt_Check(w)) { + if (ISSTRICTINT(v) && ISSTRICTINT(w)) { /* INLINE: int + int */ register long a, b, i; a = PyInt_AS_LONG(v); @@ -932,7 +935,7 @@ eval_frame(PyFrameObject *f) case BINARY_SUBTRACT: w = POP(); v = POP(); - if (PyInt_Check(v) && PyInt_Check(w)) { + if (ISSTRICTINT(v) && ISSTRICTINT(w)) { /* INLINE: int - int */ register long a, b, i; a = PyInt_AS_LONG(v); @@ -955,7 +958,7 @@ eval_frame(PyFrameObject *f) case BINARY_SUBSCR: w = POP(); v = POP(); - if (v->ob_type == &PyList_Type && PyInt_Check(w)) { + if (v->ob_type == &PyList_Type && ISSTRICTINT(w)) { /* INLINE: list[int] */ long i = PyInt_AsLong(w); if (i < 0) @@ -1092,7 +1095,7 @@ eval_frame(PyFrameObject *f) case INPLACE_ADD: w = POP(); v = POP(); - if (PyInt_Check(v) && PyInt_Check(w)) { + if (ISSTRICTINT(v) && ISSTRICTINT(w)) { /* INLINE: int + int */ register long a, b, i; a = PyInt_AS_LONG(v); @@ -1115,7 +1118,7 @@ eval_frame(PyFrameObject *f) case INPLACE_SUBTRACT: w = POP(); v = POP(); - if (PyInt_Check(v) && PyInt_Check(w)) { + if (ISSTRICTINT(v) && ISSTRICTINT(w)) { /* INLINE: int - int */ register long a, b, i; a = PyInt_AS_LONG(v); @@ -1718,7 +1721,7 @@ eval_frame(PyFrameObject *f) case COMPARE_OP: w = POP(); v = POP(); - if (PyInt_Check(v) && PyInt_Check(w)) { + if (ISSTRICTINT(v) && ISSTRICTINT(w)) { /* INLINE: cmp(int, int) */ register long a, b; register int res;