SF bug #494668: PUSH() should assert-fail on overflow.

eval_frame():  Added asserts to the top of the eval loop, to verify
that the eval stack pointer is in bounds, plus some comments.
This commit is contained in:
Tim Peters 2001-12-19 04:11:07 +00:00
parent 81b61bdc1a
commit b6d14daa1c

View file

@ -497,7 +497,7 @@ eval_frame(PyFrameObject *f)
#ifdef DXPAIRS #ifdef DXPAIRS
int lastopcode = 0; int lastopcode = 0;
#endif #endif
PyObject **stack_pointer; PyObject **stack_pointer; /* Next free slot in value stack */
register unsigned char *next_instr; register unsigned char *next_instr;
register int opcode=0; /* Current opcode */ register int opcode=0; /* Current opcode */
register int oparg=0; /* Current opcode argument, if any */ register int oparg=0; /* Current opcode argument, if any */
@ -586,7 +586,7 @@ eval_frame(PyFrameObject *f)
next_instr = first_instr + f->f_lasti; next_instr = first_instr + f->f_lasti;
stack_pointer = f->f_stacktop; stack_pointer = f->f_stacktop;
assert(stack_pointer != NULL); assert(stack_pointer != NULL);
f->f_stacktop = NULL; f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
if (tstate->use_tracing) { if (tstate->use_tracing) {
if (tstate->c_tracefunc != NULL) { if (tstate->c_tracefunc != NULL) {
@ -634,6 +634,8 @@ eval_frame(PyFrameObject *f)
w = NULL; w = NULL;
for (;;) { for (;;) {
assert(stack_pointer >= f->f_valuestack); /* else underflow */
assert(STACK_LEVEL() <= f->f_stacksize); /* else overflow */
/* Do periodic things. Doing this every time through /* Do periodic things. Doing this every time through
the loop would add too much overhead, so we do it the loop would add too much overhead, so we do it
only every Nth instruction. We also do it if only every Nth instruction. We also do it if