cinap_lenrekadd hg and python4bb9e2215 years agoHistory
4351 lines · 104.0 KB · C
RawDownload
				SET_SECOND(w);				SET_THIRD(v);				goto fast_next_opcode;			}			Py_FatalError("invalid argument to DUP_TOPX"				      " (bytecode corruption?)");			break; 		case UNARY_POSITIVE:			v = TOP();			x = PyNumber_Positive(v);			Py_DECREF(v);			SET_TOP(x);			if (x != NULL) continue;			break; 		case UNARY_NEGATIVE:			v = TOP();			x = PyNumber_Negative(v);			Py_DECREF(v);			SET_TOP(x);			if (x != NULL) continue;			break; 		case UNARY_NOT:			v = TOP();			err = PyObject_IsTrue(v);			Py_DECREF(v);			if (err == 0) {				Py_INCREF(Py_True);				SET_TOP(Py_True);				continue;			}			else if (err > 0) {				Py_INCREF(Py_False);				SET_TOP(Py_False);				err = 0;				continue;			}			STACKADJ(-1);			break; 		case UNARY_CONVERT:			v = TOP();			x = PyObject_Repr(v);			Py_DECREF(v);			SET_TOP(x);			if (x != NULL) continue;			break; 		case UNARY_INVERT:			v = TOP();			x = PyNumber_Invert(v);			Py_DECREF(v);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_POWER:			w = POP();			v = TOP();			x = PyNumber_Power(v, w, Py_None);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_MULTIPLY:			w = POP();			v = TOP();			x = PyNumber_Multiply(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_DIVIDE:			if (!_Py_QnewFlag) {				w = POP();				v = TOP();				x = PyNumber_Divide(v, w);				Py_DECREF(v);				Py_DECREF(w);				SET_TOP(x);				if (x != NULL) continue;				break;			}			/* -Qnew is in effect:	fall through to			   BINARY_TRUE_DIVIDE */		case BINARY_TRUE_DIVIDE:			w = POP();			v = TOP();			x = PyNumber_TrueDivide(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_FLOOR_DIVIDE:			w = POP();			v = TOP();			x = PyNumber_FloorDivide(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_MODULO:			w = POP();			v = TOP();			x = PyNumber_Remainder(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_ADD:			w = POP();			v = TOP();			if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {				/* INLINE: int + int */				register long a, b, i;				a = PyInt_AS_LONG(v);				b = PyInt_AS_LONG(w);				i = a + b;				if ((i^a) < 0 && (i^b) < 0)					goto slow_add;				x = PyInt_FromLong(i);			}			else if (PyString_CheckExact(v) &&				 PyString_CheckExact(w)) {				x = string_concatenate(v, w, f, next_instr);				/* string_concatenate consumed the ref to v */				goto skip_decref_vx;			}			else {			  slow_add:				x = PyNumber_Add(v, w);			}			Py_DECREF(v);		  skip_decref_vx:			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_SUBTRACT:			w = POP();			v = TOP();			if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {				/* INLINE: int - int */				register long a, b, i;				a = PyInt_AS_LONG(v);				b = PyInt_AS_LONG(w);				i = a - b;				if ((i^a) < 0 && (i^~b) < 0)					goto slow_sub;				x = PyInt_FromLong(i);			}			else {			  slow_sub:				x = PyNumber_Subtract(v, w);			}			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_SUBSCR:			w = POP();			v = TOP();			if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {				/* INLINE: list[int] */				Py_ssize_t i = PyInt_AsSsize_t(w);				if (i < 0)					i += PyList_GET_SIZE(v);				if (i >= 0 && i < PyList_GET_SIZE(v)) {					x = PyList_GET_ITEM(v, i);					Py_INCREF(x);				}				else					goto slow_get;			}			else			  slow_get:				x = PyObject_GetItem(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_LSHIFT:			w = POP();			v = TOP();			x = PyNumber_Lshift(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_RSHIFT:			w = POP();			v = TOP();			x = PyNumber_Rshift(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_AND:			w = POP();			v = TOP();			x = PyNumber_And(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_XOR:			w = POP();			v = TOP();			x = PyNumber_Xor(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case BINARY_OR:			w = POP();			v = TOP();			x = PyNumber_Or(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case LIST_APPEND:			w = POP();			v = POP();			err = PyList_Append(v, w);			Py_DECREF(v);			Py_DECREF(w);			if (err == 0) {				PREDICT(JUMP_ABSOLUTE);				continue;			}			break; 		case INPLACE_POWER:			w = POP();			v = TOP();			x = PyNumber_InPlacePower(v, w, Py_None);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_MULTIPLY:			w = POP();			v = TOP();			x = PyNumber_InPlaceMultiply(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_DIVIDE:			if (!_Py_QnewFlag) {				w = POP();				v = TOP();				x = PyNumber_InPlaceDivide(v, w);				Py_DECREF(v);				Py_DECREF(w);				SET_TOP(x);				if (x != NULL) continue;				break;			}			/* -Qnew is in effect:	fall through to			   INPLACE_TRUE_DIVIDE */		case INPLACE_TRUE_DIVIDE:			w = POP();			v = TOP();			x = PyNumber_InPlaceTrueDivide(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_FLOOR_DIVIDE:			w = POP();			v = TOP();			x = PyNumber_InPlaceFloorDivide(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_MODULO:			w = POP();			v = TOP();			x = PyNumber_InPlaceRemainder(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_ADD:			w = POP();			v = TOP();			if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {				/* INLINE: int + int */				register long a, b, i;				a = PyInt_AS_LONG(v);				b = PyInt_AS_LONG(w);				i = a + b;				if ((i^a) < 0 && (i^b) < 0)					goto slow_iadd;				x = PyInt_FromLong(i);			}			else if (PyString_CheckExact(v) &&				 PyString_CheckExact(w)) {				x = string_concatenate(v, w, f, next_instr);				/* string_concatenate consumed the ref to v */				goto skip_decref_v;			}			else {			  slow_iadd:				x = PyNumber_InPlaceAdd(v, w);			}			Py_DECREF(v);		  skip_decref_v:			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_SUBTRACT:			w = POP();			v = TOP();			if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {				/* INLINE: int - int */				register long a, b, i;				a = PyInt_AS_LONG(v);				b = PyInt_AS_LONG(w);				i = a - b;				if ((i^a) < 0 && (i^~b) < 0)					goto slow_isub;				x = PyInt_FromLong(i);			}			else {			  slow_isub:				x = PyNumber_InPlaceSubtract(v, w);			}			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_LSHIFT:			w = POP();			v = TOP();			x = PyNumber_InPlaceLshift(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_RSHIFT:			w = POP();			v = TOP();			x = PyNumber_InPlaceRshift(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_AND:			w = POP();			v = TOP();			x = PyNumber_InPlaceAnd(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_XOR:			w = POP();			v = TOP();			x = PyNumber_InPlaceXor(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case INPLACE_OR:			w = POP();			v = TOP();			x = PyNumber_InPlaceOr(v, w);			Py_DECREF(v);			Py_DECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case SLICE+0:		case SLICE+1:		case SLICE+2:		case SLICE+3:			if ((opcode-SLICE) & 2)				w = POP();			else				w = NULL;			if ((opcode-SLICE) & 1)				v = POP();			else				v = NULL;			u = TOP();			x = apply_slice(u, v, w);			Py_DECREF(u);			Py_XDECREF(v);			Py_XDECREF(w);			SET_TOP(x);			if (x != NULL) continue;			break; 		case STORE_SLICE+0:		case STORE_SLICE+1:		case STORE_SLICE+2:		case STORE_SLICE+3:			if ((opcode-STORE_SLICE) & 2)				w = POP();			else				w = NULL;			if ((opcode-STORE_SLICE) & 1)				v = POP();			else				v = NULL;			u = POP();			t = POP();			err = assign_slice(u, v, w, t); /* u[v:w] = t */			Py_DECREF(t);			Py_DECREF(u);			Py_XDECREF(v);			Py_XDECREF(w);			if (err == 0) continue;			break; 		case DELETE_SLICE+0:		case DELETE_SLICE+1:		case DELETE_SLICE+2:		case DELETE_SLICE+3:			if ((opcode-DELETE_SLICE) & 2)				w = POP();			else				w = NULL;			if ((opcode-DELETE_SLICE) & 1)				v = POP();			else				v = NULL;			u = POP();			err = assign_slice(u, v, w, (PyObject *)NULL);							/* del u[v:w] */			Py_DECREF(u);			Py_XDECREF(v);			Py_XDECREF(w);			if (err == 0) continue;			break; 		case STORE_SUBSCR:			w = TOP();			v = SECOND();			u = THIRD();			STACKADJ(-3);			/* v[w] = u */			err = PyObject_SetItem(v, w, u);			Py_DECREF(u);			Py_DECREF(v);			Py_DECREF(w);

Lines 1001–1500 of 4351. Previous lines