diff options
author | Guido van Rossum <guido@python.org> | 1997-07-17 23:12:42 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-07-17 23:12:42 (GMT) |
commit | c12da6980fc886664ef0989c68eaf8d2ac8d1cf2 (patch) | |
tree | 5ade1490790c4893a7ad0caf9051dca5d0f0b2ce /Python/ceval.c | |
parent | 77eecfa94df1e23e19599de7349cf60845a01242 (diff) | |
download | cpython-c12da6980fc886664ef0989c68eaf8d2ac8d1cf2.zip cpython-c12da6980fc886664ef0989c68eaf8d2ac8d1cf2.tar.gz cpython-c12da6980fc886664ef0989c68eaf8d2ac8d1cf2.tar.bz2 |
Huge speedup by inlining some common integer operations:
int+int, int-int, int <compareop> int, and list[int].
(Unfortunately, int*int is way too much code to inline.)
Also corrected a NULL that should have been a zero.
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 80 |
1 files changed, 75 insertions, 5 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index bd312b2..ab1e90f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -762,7 +762,22 @@ eval_code2(co, globals, locals, case BINARY_ADD: w = POP(); v = POP(); - x = PyNumber_Add(v, w); + if (PyInt_Check(v) && PyInt_Check(w)) { + /* INLINE: int + int */ + register long a, b, i; + a = ((PyIntObject*) v)->ob_ival; + b = ((PyIntObject*) w)->ob_ival; + i = a + b; + if ((i^a) < 0 && (i^b) < 0) { + PyErr_SetString(PyExc_OverflowError, + "integer addition"); + x = NULL; + } + else + x = PyInt_FromLong(i); + } + else + x = PyNumber_Add(v, w); Py_DECREF(v); Py_DECREF(w); PUSH(x); @@ -772,7 +787,22 @@ eval_code2(co, globals, locals, case BINARY_SUBTRACT: w = POP(); v = POP(); - x = PyNumber_Subtract(v, w); + if (PyInt_Check(v) && PyInt_Check(w)) { + /* INLINE: int - int */ + register long a, b, i; + a = ((PyIntObject*) v)->ob_ival; + b = ((PyIntObject*) w)->ob_ival; + i = a - b; + if ((i^a) < 0 && (i^~b) < 0) { + PyErr_SetString(PyExc_OverflowError, + "integer subtraction"); + x = NULL; + } + else + x = PyInt_FromLong(i); + } + else + x = PyNumber_Subtract(v, w); Py_DECREF(v); Py_DECREF(w); PUSH(x); @@ -782,7 +812,24 @@ eval_code2(co, globals, locals, case BINARY_SUBSCR: w = POP(); v = POP(); - x = PyObject_GetItem(v, w); + if (PyList_Check(v) && PyInt_Check(w)) { + /* INLINE: list[int] */ + long i = PyInt_AsLong(w); + if (i < 0) + i += ((PyListObject*) v)->ob_size; + if (i < 0 || + i >= ((PyListObject*) v)->ob_size) { + PyErr_SetString(PyExc_IndexError, + "list index out of range"); + x = NULL; + } + else { + x = ((PyListObject*) v)->ob_item[i]; + Py_INCREF(x); + } + } + else + x = PyObject_GetItem(v, w); Py_DECREF(v); Py_DECREF(w); PUSH(x); @@ -934,7 +981,7 @@ eval_code2(co, globals, locals, f->f_builtins, "_", v)) == 0 && !Py_SuppressPrintingFlag) { err = Py_FlushLine(); - if (err == NULL) { + if (err == 0) { x = PySys_GetObject("stdout"); if (x == NULL) err = -1; @@ -1287,7 +1334,30 @@ eval_code2(co, globals, locals, case COMPARE_OP: w = POP(); v = POP(); - x = cmp_outcome(oparg, v, w); + if (PyInt_Check(v) && PyInt_Check(w)) { + /* INLINE: cmp(int, int) */ + register long a, b; + register int res; + a = ((PyIntObject*) v)->ob_ival; + b = ((PyIntObject*) w)->ob_ival; + switch (oparg) { + case LT: res = a < b; break; + case LE: res = a <= b; break; + case EQ: res = a == b; break; + case NE: res = a != b; break; + case GT: res = a > b; break; + case GE: res = a >= b; break; + case IS: res = v == w; break; + case IS_NOT: res = v != w; break; + default: goto slow_compare; + } + x = res ? Py_True : Py_False; + Py_INCREF(x); + } + else { + slow_compare: + x = cmp_outcome(oparg, v, w); + } Py_DECREF(v); Py_DECREF(w); PUSH(x); |