cinap_lenrekadd hg and python4bb9e2215 years agoHistory
4351 lines · 104.0 KB · C
RawDownload
			if (err == 0) continue;			break; 		case DELETE_SUBSCR:			w = TOP();			v = SECOND();			STACKADJ(-2);			/* del v[w] */			err = PyObject_DelItem(v, w);			Py_DECREF(v);			Py_DECREF(w);			if (err == 0) continue;			break; 		case PRINT_EXPR:			v = POP();			w = PySys_GetObject("displayhook");			if (w == NULL) {				PyErr_SetString(PyExc_RuntimeError,						"lost sys.displayhook");				err = -1;				x = NULL;			}			if (err == 0) {				x = PyTuple_Pack(1, v);				if (x == NULL)					err = -1;			}			if (err == 0) {				w = PyEval_CallObject(w, x);				Py_XDECREF(w);				if (w == NULL)					err = -1;			}			Py_DECREF(v);			Py_XDECREF(x);			break; 		case PRINT_ITEM_TO:			w = stream = POP();			/* fall through to PRINT_ITEM */ 		case PRINT_ITEM:			v = POP();			if (stream == NULL || stream == Py_None) {				w = PySys_GetObject("stdout");				if (w == NULL) {					PyErr_SetString(PyExc_RuntimeError,							"lost sys.stdout");					err = -1;				}			}			/* PyFile_SoftSpace() can exececute arbitrary code			   if sys.stdout is an instance with a __getattr__.			   If __getattr__ raises an exception, w will			   be freed, so we need to prevent that temporarily. */			Py_XINCREF(w);			if (w != NULL && PyFile_SoftSpace(w, 0))				err = PyFile_WriteString(" ", w);			if (err == 0)				err = PyFile_WriteObject(v, w, Py_PRINT_RAW);			if (err == 0) {			    /* XXX move into writeobject() ? */			    if (PyString_Check(v)) {				char *s = PyString_AS_STRING(v);				Py_ssize_t len = PyString_GET_SIZE(v);				if (len == 0 ||				    !isspace(Py_CHARMASK(s[len-1])) ||				    s[len-1] == ' ')					PyFile_SoftSpace(w, 1);			    }#ifdef Py_USING_UNICODE			    else if (PyUnicode_Check(v)) {				Py_UNICODE *s = PyUnicode_AS_UNICODE(v);				Py_ssize_t len = PyUnicode_GET_SIZE(v);				if (len == 0 ||				    !Py_UNICODE_ISSPACE(s[len-1]) ||				    s[len-1] == ' ')				    PyFile_SoftSpace(w, 1);			    }#endif			    else			    	PyFile_SoftSpace(w, 1);			}			Py_XDECREF(w);			Py_DECREF(v);			Py_XDECREF(stream);			stream = NULL;			if (err == 0)				continue;			break; 		case PRINT_NEWLINE_TO:			w = stream = POP();			/* fall through to PRINT_NEWLINE */ 		case PRINT_NEWLINE:			if (stream == NULL || stream == Py_None) {				w = PySys_GetObject("stdout");				if (w == NULL)					PyErr_SetString(PyExc_RuntimeError,							"lost sys.stdout");			}			if (w != NULL) {				err = PyFile_WriteString("\n", w);				if (err == 0)					PyFile_SoftSpace(w, 0);			}			Py_XDECREF(stream);			stream = NULL;			break;  #ifdef CASE_TOO_BIG		default: switch (opcode) {#endif		case RAISE_VARARGS:			u = v = w = NULL;			switch (oparg) {			case 3:				u = POP(); /* traceback */				/* Fallthrough */			case 2:				v = POP(); /* value */				/* Fallthrough */			case 1:				w = POP(); /* exc */			case 0: /* Fallthrough */				why = do_raise(w, v, u);				break;			default:				PyErr_SetString(PyExc_SystemError,					   "bad RAISE_VARARGS oparg");				why = WHY_EXCEPTION;				break;			}			break; 		case LOAD_LOCALS:			if ((x = f->f_locals) != NULL) {				Py_INCREF(x);				PUSH(x);				continue;			}			PyErr_SetString(PyExc_SystemError, "no locals");			break; 		case RETURN_VALUE:			retval = POP();			why = WHY_RETURN;			goto fast_block_end; 		case YIELD_VALUE:			retval = POP();			f->f_stacktop = stack_pointer;			why = WHY_YIELD;			goto fast_yield; 		case EXEC_STMT:			w = TOP();			v = SECOND();			u = THIRD();			STACKADJ(-3);			READ_TIMESTAMP(intr0);			err = exec_statement(f, u, v, w);			READ_TIMESTAMP(intr1);			Py_DECREF(u);			Py_DECREF(v);			Py_DECREF(w);			break; 		case POP_BLOCK:			{				PyTryBlock *b = PyFrame_BlockPop(f);				while (STACK_LEVEL() > b->b_level) {					v = POP();					Py_DECREF(v);				}			}			continue; 		case END_FINALLY:			v = POP();			if (PyInt_Check(v)) {				why = (enum why_code) PyInt_AS_LONG(v);				assert(why != WHY_YIELD);				if (why == WHY_RETURN ||				    why == WHY_CONTINUE)					retval = POP();			}			else if (PyExceptionClass_Check(v) || PyString_Check(v)) {				w = POP();				u = POP();				PyErr_Restore(v, w, u);				why = WHY_RERAISE;				break;			}			else if (v != Py_None) {				PyErr_SetString(PyExc_SystemError,					"'finally' pops bad exception");				why = WHY_EXCEPTION;			}			Py_DECREF(v);			break; 		case BUILD_CLASS:			u = TOP();			v = SECOND();			w = THIRD();			STACKADJ(-2);			x = build_class(u, v, w);			SET_TOP(x);			Py_DECREF(u);			Py_DECREF(v);			Py_DECREF(w);			break; 		case STORE_NAME:			w = GETITEM(names, oparg);			v = POP();			if ((x = f->f_locals) != NULL) {				if (PyDict_CheckExact(x))					err = PyDict_SetItem(x, w, v);				else					err = PyObject_SetItem(x, w, v);				Py_DECREF(v);				if (err == 0) continue;				break;			}			PyErr_Format(PyExc_SystemError,				     "no locals found when storing %s",				     PyObject_REPR(w));			break; 		case DELETE_NAME:			w = GETITEM(names, oparg);			if ((x = f->f_locals) != NULL) {				if ((err = PyObject_DelItem(x, w)) != 0)					format_exc_check_arg(PyExc_NameError,								NAME_ERROR_MSG ,w);				break;			}			PyErr_Format(PyExc_SystemError,				     "no locals when deleting %s",				     PyObject_REPR(w));			break; 		PREDICTED_WITH_ARG(UNPACK_SEQUENCE);		case UNPACK_SEQUENCE:			v = POP();			if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) {				PyObject **items = ((PyTupleObject *)v)->ob_item;				while (oparg--) {					w = items[oparg];					Py_INCREF(w);					PUSH(w);				}				Py_DECREF(v);				continue;			} else if (PyList_CheckExact(v) && PyList_GET_SIZE(v) == oparg) {				PyObject **items = ((PyListObject *)v)->ob_item;				while (oparg--) {					w = items[oparg];					Py_INCREF(w);					PUSH(w);				}			} else if (unpack_iterable(v, oparg,						 stack_pointer + oparg)) {				stack_pointer += oparg;			} else {				/* unpack_iterable() raised an exception */				why = WHY_EXCEPTION;			}			Py_DECREF(v);			break; 		case STORE_ATTR:			w = GETITEM(names, oparg);			v = TOP();			u = SECOND();			STACKADJ(-2);			err = PyObject_SetAttr(v, w, u); /* v.w = u */			Py_DECREF(v);			Py_DECREF(u);			if (err == 0) continue;			break; 		case DELETE_ATTR:			w = GETITEM(names, oparg);			v = POP();			err = PyObject_SetAttr(v, w, (PyObject *)NULL);							/* del v.w */			Py_DECREF(v);			break; 		case STORE_GLOBAL:			w = GETITEM(names, oparg);			v = POP();			err = PyDict_SetItem(f->f_globals, w, v);			Py_DECREF(v);			if (err == 0) continue;			break; 		case DELETE_GLOBAL:			w = GETITEM(names, oparg);			if ((err = PyDict_DelItem(f->f_globals, w)) != 0)				format_exc_check_arg(				    PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);			break; 		case LOAD_NAME:			w = GETITEM(names, oparg);			if ((v = f->f_locals) == NULL) {				PyErr_Format(PyExc_SystemError,					     "no locals when loading %s",					     PyObject_REPR(w));				break;			}			if (PyDict_CheckExact(v)) {				x = PyDict_GetItem(v, w);				Py_XINCREF(x);			}			else {				x = PyObject_GetItem(v, w);				if (x == NULL && PyErr_Occurred()) {					if (!PyErr_ExceptionMatches(PyExc_KeyError))						break;					PyErr_Clear();				}			}			if (x == NULL) {				x = PyDict_GetItem(f->f_globals, w);				if (x == NULL) {					x = PyDict_GetItem(f->f_builtins, w);					if (x == NULL) {						format_exc_check_arg(							    PyExc_NameError,							    NAME_ERROR_MSG ,w);						break;					}				}				Py_INCREF(x);			}			PUSH(x);			continue; 		case LOAD_GLOBAL:			w = GETITEM(names, oparg);			if (PyString_CheckExact(w)) {				/* Inline the PyDict_GetItem() calls.				   WARNING: this is an extreme speed hack.				   Do not try this at home. */				long hash = ((PyStringObject *)w)->ob_shash;				if (hash != -1) {					PyDictObject *d;					PyDictEntry *e;					d = (PyDictObject *)(f->f_globals);					e = d->ma_lookup(d, w, hash);					if (e == NULL) {						x = NULL;						break;					}					x = e->me_value;					if (x != NULL) {						Py_INCREF(x);						PUSH(x);						continue;					}					d = (PyDictObject *)(f->f_builtins);					e = d->ma_lookup(d, w, hash);					if (e == NULL) {						x = NULL;						break;					}					x = e->me_value;					if (x != NULL) {						Py_INCREF(x);						PUSH(x);						continue;					}					goto load_global_error;				}			}			/* This is the un-inlined version of the code above */			x = PyDict_GetItem(f->f_globals, w);			if (x == NULL) {				x = PyDict_GetItem(f->f_builtins, w);				if (x == NULL) {				  load_global_error:					format_exc_check_arg(						    PyExc_NameError,						    GLOBAL_NAME_ERROR_MSG, w);					break;				}			}			Py_INCREF(x);			PUSH(x);			continue; 		case DELETE_FAST:			x = GETLOCAL(oparg);			if (x != NULL) {				SETLOCAL(oparg, NULL);				continue;			}			format_exc_check_arg(				PyExc_UnboundLocalError,				UNBOUNDLOCAL_ERROR_MSG,				PyTuple_GetItem(co->co_varnames, oparg)				);			break; 		case LOAD_CLOSURE:			x = freevars[oparg];			Py_INCREF(x);			PUSH(x);			if (x != NULL) continue;			break; 		case LOAD_DEREF:			x = freevars[oparg];			w = PyCell_Get(x);			if (w != NULL) {				PUSH(w);				continue;			}			err = -1;			/* Don't stomp existing exception */			if (PyErr_Occurred())				break;			if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {				v = PyTuple_GET_ITEM(co->co_cellvars,						       oparg);			       format_exc_check_arg(				       PyExc_UnboundLocalError,				       UNBOUNDLOCAL_ERROR_MSG,				       v);			} else {			       v = PyTuple_GET_ITEM(					      co->co_freevars,					      oparg - PyTuple_GET_SIZE(co->co_cellvars));			       format_exc_check_arg(				       PyExc_NameError,				       UNBOUNDFREE_ERROR_MSG,				       v);			}			break; 		case STORE_DEREF:			w = POP();			x = freevars[oparg];			PyCell_Set(x, w);			Py_DECREF(w);			continue; 		case BUILD_TUPLE:			x = PyTuple_New(oparg);			if (x != NULL) {				for (; --oparg >= 0;) {					w = POP();					PyTuple_SET_ITEM(x, oparg, w);				}				PUSH(x);				continue;			}			break; 		case BUILD_LIST:			x =  PyList_New(oparg);			if (x != NULL) {				for (; --oparg >= 0;) {					w = POP();					PyList_SET_ITEM(x, oparg, w);				}				PUSH(x);				continue;			}			break; 		case BUILD_MAP:			x = PyDict_New();			PUSH(x);			if (x != NULL) continue;			break; 		case LOAD_ATTR:			w = GETITEM(names, oparg);			v = TOP();			x = PyObject_GetAttr(v, w);			Py_DECREF(v);			SET_TOP(x);			if (x != NULL) continue;			break; 		case COMPARE_OP:			w = POP();			v = TOP();			if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {				/* INLINE: cmp(int, int) */				register long a, b;

Lines 1501–2000 of 4351. Previous lines