From: Guido van Rossum <guido@python.org>
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;