Index: Python/ceval.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/ceval.c,v retrieving revision 2.396 diff -c -r2.396 ceval.c *** Python/ceval.c 11 Apr 2004 14:59:33 -0000 2.396 --- Python/ceval.c 10 May 2004 10:28:35 -0000 *************** *** 573,585 **** static PyObject * eval_frame(PyFrameObject *f) { #ifdef DXPAIRS int lastopcode = 0; #endif ! PyObject **stack_pointer; /* Next free slot in value stack */ ! register unsigned char *next_instr; ! register int opcode=0; /* Current opcode */ ! register int oparg=0; /* Current opcode argument, if any */ register enum why_code why; /* Reason for block stack unwind */ register int err; /* Error status -- nonzero if error */ register PyObject *x; /* Result object -- NULL if error */ --- 573,593 ---- static PyObject * eval_frame(PyFrameObject *f) { + #if defined(__GNUC__) && defined(__i386__) + #define IN_386_REGISTER(rg) asm(rg) /* high-perf tweak for 386 machines */ + #else + #define IN_386_REGISTER(rg) /* empty */ + #endif + #ifdef DXPAIRS int lastopcode = 0; #endif ! register PyObject **stack_pointer /* Next free slot in value stack */ ! IN_386_REGISTER("ebx"); ! register unsigned char *next_instr ! IN_386_REGISTER("esi"); ! register int opcode; /* Current opcode */ ! register int oparg; /* Current opcode argument, if any */ register enum why_code why; /* Reason for block stack unwind */ register int err; /* Error status -- nonzero if error */ register PyObject *x; /* Result object -- NULL if error */ *************** *** 861,866 **** --- 869,876 ---- /* Extract opcode and argument */ opcode = NEXTOP(); + oparg = 0; /* allows oparg to be stored in a register because + it doesn't have to be remembered across a full loop */ if (HAS_ARG(opcode)) oparg = NEXTARG(); dispatch_opcode: *************** *** 2122,2133 **** continue; case CALL_FUNCTION: PCALL(PCALL_ALL); ! x = call_function(&stack_pointer, oparg); PUSH(x); if (x != NULL) continue; break; case CALL_FUNCTION_VAR: case CALL_FUNCTION_KW: --- 2132,2148 ---- continue; case CALL_FUNCTION: + { + PyObject **sp; PCALL(PCALL_ALL); ! sp = stack_pointer; ! x = call_function(&sp, oparg); ! stack_pointer = sp; PUSH(x); if (x != NULL) continue; break; + } case CALL_FUNCTION_VAR: case CALL_FUNCTION_KW: *************** *** 2137,2143 **** int nk = (oparg>>8) & 0xff; int flags = (opcode - CALL_FUNCTION) & 3; int n = na + 2 * nk; ! PyObject **pfunc, *func; PCALL(PCALL_ALL); if (flags & CALL_FLAG_VAR) n++; --- 2152,2158 ---- int nk = (oparg>>8) & 0xff; int flags = (opcode - CALL_FUNCTION) & 3; int n = na + 2 * nk; ! PyObject **pfunc, *func, **sp; PCALL(PCALL_ALL); if (flags & CALL_FLAG_VAR) n++; *************** *** 2158,2164 **** n++; } else Py_INCREF(func); ! x = ext_do_call(func, &stack_pointer, flags, na, nk); Py_DECREF(func); while (stack_pointer > pfunc) { --- 2173,2181 ---- n++; } else Py_INCREF(func); ! sp = stack_pointer; ! x = ext_do_call(func, &sp, flags, na, nk); ! stack_pointer = sp; Py_DECREF(func); while (stack_pointer > pfunc) {