cinap_lenrekadd hg and python4bb9e2215 years agoHistory
4351 lines · 104.0 KB · C
RawDownload
				register int res;				a = PyInt_AS_LONG(v);				b = PyInt_AS_LONG(w);				switch (oparg) {				case PyCmp_LT: res = a <  b; break;				case PyCmp_LE: res = a <= b; break;				case PyCmp_EQ: res = a == b; break;				case PyCmp_NE: res = a != b; break;				case PyCmp_GT: res = a >  b; break;				case PyCmp_GE: res = a >= b; break;				case PyCmp_IS: res = v == w; break;				case PyCmp_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);			SET_TOP(x);			if (x == NULL) break;			PREDICT(JUMP_IF_FALSE);			PREDICT(JUMP_IF_TRUE);			continue; 		case IMPORT_NAME:			w = GETITEM(names, oparg);			x = PyDict_GetItemString(f->f_builtins, "__import__");			if (x == NULL) {				PyErr_SetString(PyExc_ImportError,						"__import__ not found");				break;			}			v = POP();			u = TOP();			if (PyInt_AsLong(u) != -1 || PyErr_Occurred())				w = PyTuple_Pack(5,					    w,					    f->f_globals,					    f->f_locals == NULL ?						  Py_None : f->f_locals,					    v,					    u);			else				w = PyTuple_Pack(4,					    w,					    f->f_globals,					    f->f_locals == NULL ?						  Py_None : f->f_locals,					    v);			Py_DECREF(v);			Py_DECREF(u);			if (w == NULL) {				u = POP();				x = NULL;				break;			}			READ_TIMESTAMP(intr0);			x = PyEval_CallObject(x, w);			READ_TIMESTAMP(intr1);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case IMPORT_STAR:			v = POP();			PyFrame_FastToLocals(f);			if ((x = f->f_locals) == NULL) {				PyErr_SetString(PyExc_SystemError,					"no locals found during 'import *'");				break;			}			READ_TIMESTAMP(intr0);			err = import_all_from(x, v);			READ_TIMESTAMP(intr1);			PyFrame_LocalsToFast(f, 0);			Py_DECREF(v);			if (err == 0) continue;			break; 		case IMPORT_FROM:			w = GETITEM(names, oparg);			v = TOP();			READ_TIMESTAMP(intr0);			x = import_from(v, w);			READ_TIMESTAMP(intr1);			PUSH(x);			if (x != NULL) continue;			break; 		case JUMP_FORWARD:			JUMPBY(oparg);			goto fast_next_opcode; 		PREDICTED_WITH_ARG(JUMP_IF_FALSE);		case JUMP_IF_FALSE:			w = TOP();			if (w == Py_True) {				PREDICT(POP_TOP);				goto fast_next_opcode;			}			if (w == Py_False) {				JUMPBY(oparg);				goto fast_next_opcode;			}			err = PyObject_IsTrue(w);			if (err > 0)				err = 0;			else if (err == 0)				JUMPBY(oparg);			else				break;			continue; 		PREDICTED_WITH_ARG(JUMP_IF_TRUE);		case JUMP_IF_TRUE:			w = TOP();			if (w == Py_False) {				PREDICT(POP_TOP);				goto fast_next_opcode;			}			if (w == Py_True) {				JUMPBY(oparg);				goto fast_next_opcode;			}			err = PyObject_IsTrue(w);			if (err > 0) {				err = 0;				JUMPBY(oparg);			}			else if (err == 0)				;			else				break;			continue; 		PREDICTED_WITH_ARG(JUMP_ABSOLUTE);		case JUMP_ABSOLUTE:			JUMPTO(oparg);			continue; 		case GET_ITER:			/* before: [obj]; after [getiter(obj)] */			v = TOP();			x = PyObject_GetIter(v);			Py_DECREF(v);			if (x != NULL) {				SET_TOP(x);				PREDICT(FOR_ITER);				continue;			}			STACKADJ(-1);			break; 		PREDICTED_WITH_ARG(FOR_ITER);		case FOR_ITER:			/* before: [iter]; after: [iter, iter()] *or* [] */			v = TOP();			x = (*v->ob_type->tp_iternext)(v);			if (x != NULL) {				PUSH(x);				PREDICT(STORE_FAST);				PREDICT(UNPACK_SEQUENCE);				continue;			}			if (PyErr_Occurred()) {				if (!PyErr_ExceptionMatches(PyExc_StopIteration))					break;				PyErr_Clear();			}			/* iterator ended normally */ 			x = v = POP();			Py_DECREF(v);			JUMPBY(oparg);			continue; 		case BREAK_LOOP:			why = WHY_BREAK;			goto fast_block_end; 		case CONTINUE_LOOP:			retval = PyInt_FromLong(oparg);			if (!retval) {				x = NULL;				break;			}			why = WHY_CONTINUE;			goto fast_block_end; 		case SETUP_LOOP:		case SETUP_EXCEPT:		case SETUP_FINALLY:			/* NOTE: If you add any new block-setup opcodes that are not try/except/finally			   handlers, you may need to update the PyGen_NeedsFinalizing() function. */ 			PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,					   STACK_LEVEL());			continue; 		case WITH_CLEANUP:		{			/* TOP is the context.__exit__ bound method.			   Below that are 1-3 values indicating how/why			   we entered the finally clause:			   - SECOND = None			   - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval			   - SECOND = WHY_*; no retval below it			   - (SECOND, THIRD, FOURTH) = exc_info()			   In the last case, we must call			     TOP(SECOND, THIRD, FOURTH)			   otherwise we must call			     TOP(None, None, None) 			   In addition, if the stack represents an exception,			   *and* the function call returns a 'true' value, we			   "zap" this information, to prevent END_FINALLY from			   re-raising the exception.  (But non-local gotos			   should still be resumed.)			*/ 			x = TOP();			u = SECOND();			if (PyInt_Check(u) || u == Py_None) {				u = v = w = Py_None;			}			else {				v = THIRD();				w = FOURTH();			}			/* XXX Not the fastest way to call it... */			x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);			if (x == NULL)				break; /* Go to error exit */			if (u != Py_None && PyObject_IsTrue(x)) {				/* There was an exception and a true return */				Py_DECREF(x);				x = TOP(); /* Again */				STACKADJ(-3);				Py_INCREF(Py_None);				SET_TOP(Py_None);				Py_DECREF(x);				Py_DECREF(u);				Py_DECREF(v);				Py_DECREF(w);			} else {				/* Let END_FINALLY do its thing */				Py_DECREF(x);				x = POP();				Py_DECREF(x);			}			break;		} 		case CALL_FUNCTION:		{			PyObject **sp;			PCALL(PCALL_ALL);			sp = stack_pointer;#ifdef WITH_TSC			x = call_function(&sp, oparg, &intr0, &intr1);#else			x = call_function(&sp, oparg);#endif			stack_pointer = sp;			PUSH(x);			if (x != NULL)				continue;			break;		} 		case CALL_FUNCTION_VAR:		case CALL_FUNCTION_KW:		case CALL_FUNCTION_VAR_KW:		{		    int na = oparg & 0xff;		    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++;		    if (flags & CALL_FLAG_KW)			    n++;		    pfunc = stack_pointer - n - 1;		    func = *pfunc; 		    if (PyMethod_Check(func)			&& PyMethod_GET_SELF(func) != NULL) {			    PyObject *self = PyMethod_GET_SELF(func);			    Py_INCREF(self);			    func = PyMethod_GET_FUNCTION(func);			    Py_INCREF(func);			    Py_DECREF(*pfunc);			    *pfunc = self;			    na++;			    n++;		    } else			    Py_INCREF(func);		    sp = stack_pointer;		    READ_TIMESTAMP(intr0);		    x = ext_do_call(func, &sp, flags, na, nk);		    READ_TIMESTAMP(intr1);		    stack_pointer = sp;		    Py_DECREF(func); 		    while (stack_pointer > pfunc) {			    w = POP();			    Py_DECREF(w);		    }		    PUSH(x);		    if (x != NULL)			    continue;		    break;		} 		case MAKE_FUNCTION:			v = POP(); /* code object */			x = PyFunction_New(v, f->f_globals);			Py_DECREF(v);			/* XXX Maybe this should be a separate opcode? */			if (x != NULL && oparg > 0) {				v = PyTuple_New(oparg);				if (v == NULL) {					Py_DECREF(x);					x = NULL;					break;				}				while (--oparg >= 0) {					w = POP();					PyTuple_SET_ITEM(v, oparg, w);				}				err = PyFunction_SetDefaults(x, v);				Py_DECREF(v);			}			PUSH(x);			break; 		case MAKE_CLOSURE:		{			v = POP(); /* code object */			x = PyFunction_New(v, f->f_globals);			Py_DECREF(v);			if (x != NULL) {				v = POP();				err = PyFunction_SetClosure(x, v);				Py_DECREF(v);			}			if (x != NULL && oparg > 0) {				v = PyTuple_New(oparg);				if (v == NULL) {					Py_DECREF(x);					x = NULL;					break;				}				while (--oparg >= 0) {					w = POP();					PyTuple_SET_ITEM(v, oparg, w);				}				err = PyFunction_SetDefaults(x, v);				Py_DECREF(v);			}			PUSH(x);			break;		} 		case BUILD_SLICE:			if (oparg == 3)				w = POP();			else				w = NULL;			v = POP();			u = TOP();			x = PySlice_New(u, v, w);			Py_DECREF(u);			Py_DECREF(v);			Py_XDECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case EXTENDED_ARG:			opcode = NEXTOP();			oparg = oparg<<16 | NEXTARG();			goto dispatch_opcode; 		default:			fprintf(stderr,				"XXX lineno: %d, opcode: %d\n",				PyCode_Addr2Line(f->f_code, f->f_lasti),				opcode);			PyErr_SetString(PyExc_SystemError, "unknown opcode");			why = WHY_EXCEPTION;			break; #ifdef CASE_TOO_BIG		}#endif 		} /* switch */ 	    on_error: 		READ_TIMESTAMP(inst1); 		/* Quickly continue if no error occurred */ 		if (why == WHY_NOT) {			if (err == 0 && x != NULL) {#ifdef CHECKEXC				/* This check is expensive! */				if (PyErr_Occurred())					fprintf(stderr,						"XXX undetected error\n");				else {#endif					READ_TIMESTAMP(loop1);					continue; /* Normal, fast path */#ifdef CHECKEXC				}#endif			}			why = WHY_EXCEPTION;			x = Py_None;			err = 0;		} 		/* Double-check exception status */ 		if (why == WHY_EXCEPTION || why == WHY_RERAISE) {			if (!PyErr_Occurred()) {				PyErr_SetString(PyExc_SystemError,					"error return without exception set");				why = WHY_EXCEPTION;			}		}#ifdef CHECKEXC		else {			/* This check is expensive! */			if (PyErr_Occurred()) {				char buf[1024];				sprintf(buf, "Stack unwind with exception "					"set and why=%d", why);				Py_FatalError(buf);			}		}#endif 		/* Log traceback info if this is a real exception */ 		if (why == WHY_EXCEPTION) {			PyTraceBack_Here(f); 			if (tstate->c_tracefunc != NULL)				call_exc_trace(tstate->c_tracefunc,					       tstate->c_traceobj, f);		} 		/* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */ 		if (why == WHY_RERAISE)			why = WHY_EXCEPTION; 		/* Unwind stacks if a (pseudo) exception occurred */ fast_block_end:		while (why != WHY_NOT && f->f_iblock > 0) {			PyTryBlock *b = PyFrame_BlockPop(f); 			assert(why != WHY_YIELD);			if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {				/* For a continue inside a try block,				   don't pop the block for the loop. */				PyFrame_BlockSetup(f, b->b_type, b->b_handler,						   b->b_level);				why = WHY_NOT;				JUMPTO(PyInt_AS_LONG(retval));				Py_DECREF(retval);				break;			} 			while (STACK_LEVEL() > b->b_level) {				v = POP();				Py_XDECREF(v);			}			if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {				why = WHY_NOT;				JUMPTO(b->b_handler);				break;			}			if (b->b_type == SETUP_FINALLY ||			    (b->b_type == SETUP_EXCEPT &&			     why == WHY_EXCEPTION)) {				if (why == WHY_EXCEPTION) {					PyObject *exc, *val, *tb;

Lines 2001–2500 of 4351. Previous lines