Index: Python/ceval.c =================================================================== --- Python/ceval.c (revision 88710) +++ Python/ceval.c (working copy) @@ -1481,6 +1481,28 @@ if (x != NULL) DISPATCH(); break; +#define TARGET_GENERIC_BINOP(TYPE, OPCODE, FUNC)\ + TARGET(TYPE##_##OPCODE)\ + w = POP();\ + v = TOP();\ + x = FUNC (v, w);\ + Py_DECREF(v);\ + Py_DECREF(w);\ + SET_TOP(x);\ + if (x != NULL) DISPATCH();\ + break;\ + + TARGET_GENERIC_BINOP(BINARY, MULTIPLY, PyNumber_Multiply) + TARGET_GENERIC_BINOP(BINARY, TRUE_DIVIDE, PyNumber_TrueDivide) + TARGET_GENERIC_BINOP(BINARY, FLOOR_DIVIDE, PyNumber_FloorDivide) + TARGET_GENERIC_BINOP(BINARY, SUBTRACT, PyNumber_Subtract) + TARGET_GENERIC_BINOP(BINARY, LSHIFT, PyNumber_Lshift) + TARGET_GENERIC_BINOP(BINARY, RSHIFT, PyNumber_Rshift) + TARGET_GENERIC_BINOP(BINARY, AND, PyNumber_And) + TARGET_GENERIC_BINOP(BINARY, XOR, PyNumber_Xor) + TARGET_GENERIC_BINOP(BINARY, OR, PyNumber_Or) + TARGET_GENERIC_BINOP(BINARY, SUBSCR, PyObject_GetItem) + TARGET(BINARY_POWER) w = POP(); v = TOP(); @@ -1491,36 +1513,6 @@ if (x != NULL) DISPATCH(); break; - TARGET(BINARY_MULTIPLY) - w = POP(); - v = TOP(); - x = PyNumber_Multiply(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_TRUE_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_TrueDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_FLOOR_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_FloorDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - TARGET(BINARY_MODULO) w = POP(); v = TOP(); @@ -1553,76 +1545,6 @@ if (x != NULL) DISPATCH(); break; - TARGET(BINARY_SUBTRACT) - w = POP(); - v = TOP(); - x = PyNumber_Subtract(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_SUBSCR) - w = POP(); - v = TOP(); - x = PyObject_GetItem(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_LSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_Lshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_RSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_Rshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_AND) - w = POP(); - v = TOP(); - x = PyNumber_And(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_XOR) - w = POP(); - v = TOP(); - x = PyNumber_Xor(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(BINARY_OR) - w = POP(); - v = TOP(); - x = PyNumber_Or(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - TARGET(LIST_APPEND) w = POP(); v = PEEK(oparg); @@ -1645,6 +1567,17 @@ } break; + TARGET_GENERIC_BINOP(INPLACE, MULTIPLY, PyNumber_InPlaceMultiply) + TARGET_GENERIC_BINOP(INPLACE, TRUE_DIVIDE, PyNumber_InPlaceTrueDivide) + TARGET_GENERIC_BINOP(INPLACE, FLOOR_DIVIDE, PyNumber_InPlaceFloorDivide) + TARGET_GENERIC_BINOP(INPLACE, SUBTRACT, PyNumber_InPlaceSubtract) + TARGET_GENERIC_BINOP(INPLACE, LSHIFT, PyNumber_InPlaceLshift) + TARGET_GENERIC_BINOP(INPLACE, RSHIFT, PyNumber_InPlaceRshift) + TARGET_GENERIC_BINOP(INPLACE, AND, PyNumber_InPlaceAnd) + TARGET_GENERIC_BINOP(INPLACE, XOR, PyNumber_InPlaceXor) + TARGET_GENERIC_BINOP(INPLACE, OR, PyNumber_InPlaceOr) + TARGET_GENERIC_BINOP(INPLACE, MODULO, PyNumber_InPlaceRemainder) + TARGET(INPLACE_POWER) w = POP(); v = TOP(); @@ -1655,46 +1588,6 @@ if (x != NULL) DISPATCH(); break; - TARGET(INPLACE_MULTIPLY) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceMultiply(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_TRUE_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceTrueDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_FLOOR_DIVIDE) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceFloorDivide(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_MODULO) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceRemainder(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - TARGET(INPLACE_ADD) w = POP(); v = TOP(); @@ -1714,66 +1607,6 @@ if (x != NULL) DISPATCH(); break; - TARGET(INPLACE_SUBTRACT) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceSubtract(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_LSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceLshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_RSHIFT) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceRshift(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_AND) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceAnd(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_XOR) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceXor(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - - TARGET(INPLACE_OR) - w = POP(); - v = TOP(); - x = PyNumber_InPlaceOr(v, w); - Py_DECREF(v); - Py_DECREF(w); - SET_TOP(x); - if (x != NULL) DISPATCH(); - break; - TARGET(STORE_SUBSCR) w = TOP(); v = SECOND();