mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Remove the simple slicing API. All slicing is now done with slice objects.
This commit is contained in:
		
							parent
							
								
									582b586617
								
							
						
					
					
						commit
						d2cf20eea2
					
				
					 32 changed files with 78 additions and 810 deletions
				
			
		
							
								
								
									
										131
									
								
								Python/ceval.c
									
										
									
									
									
								
							
							
						
						
									
										131
									
								
								Python/ceval.c
									
										
									
									
									
								
							|  | @ -111,9 +111,6 @@ static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *); | |||
| static int maybe_call_line_trace(Py_tracefunc, PyObject *, | ||||
| 				  PyFrameObject *, int *, int *, int *); | ||||
| 
 | ||||
| static PyObject * apply_slice(PyObject *, PyObject *, PyObject *); | ||||
| static int assign_slice(PyObject *, PyObject *, | ||||
| 			PyObject *, PyObject *); | ||||
| static PyObject * cmp_outcome(int, PyObject *, PyObject *); | ||||
| static PyObject * import_from(PyObject *, PyObject *); | ||||
| static int import_all_from(PyObject *, PyObject *); | ||||
|  | @ -1416,70 +1413,6 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) | |||
| 			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(); | ||||
|  | @ -3895,70 +3828,6 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) | |||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| #undef ISINDEX | ||||
| #define ISINDEX(x) ((x) == NULL || \ | ||||
| 		    PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x)) | ||||
| 
 | ||||
| static PyObject * | ||||
| apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */ | ||||
| { | ||||
| 	PyTypeObject *tp = u->ob_type; | ||||
| 	PySequenceMethods *sq = tp->tp_as_sequence; | ||||
| 
 | ||||
| 	if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) { | ||||
| 		Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX; | ||||
| 		if (!_PyEval_SliceIndex(v, &ilow)) | ||||
| 			return NULL; | ||||
| 		if (!_PyEval_SliceIndex(w, &ihigh)) | ||||
| 			return NULL; | ||||
| 		return PySequence_GetSlice(u, ilow, ihigh); | ||||
| 	} | ||||
| 	else { | ||||
| 		PyObject *slice = PySlice_New(v, w, NULL); | ||||
| 		if (slice != NULL) { | ||||
| 			PyObject *res = PyObject_GetItem(u, slice); | ||||
| 			Py_DECREF(slice); | ||||
| 			return res; | ||||
| 		} | ||||
| 		else | ||||
| 			return NULL; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) | ||||
| 	/* u[v:w] = x */ | ||||
| { | ||||
| 	PyTypeObject *tp = u->ob_type; | ||||
| 	PySequenceMethods *sq = tp->tp_as_sequence; | ||||
| 
 | ||||
| 	if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) { | ||||
| 		Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX; | ||||
| 		if (!_PyEval_SliceIndex(v, &ilow)) | ||||
| 			return -1; | ||||
| 		if (!_PyEval_SliceIndex(w, &ihigh)) | ||||
| 			return -1; | ||||
| 		if (x == NULL) | ||||
| 			return PySequence_DelSlice(u, ilow, ihigh); | ||||
| 		else | ||||
| 			return PySequence_SetSlice(u, ilow, ihigh, x); | ||||
| 	} | ||||
| 	else { | ||||
| 		PyObject *slice = PySlice_New(v, w, NULL); | ||||
| 		if (slice != NULL) { | ||||
| 			int res; | ||||
| 			if (x != NULL) | ||||
| 				res = PyObject_SetItem(u, slice, x); | ||||
| 			else | ||||
| 				res = PyObject_DelItem(u, slice); | ||||
| 			Py_DECREF(slice); | ||||
| 			return res; | ||||
| 		} | ||||
| 		else | ||||
| 			return -1; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ | ||||
| 			 "BaseException is not allowed" | ||||
| 
 | ||||
|  |  | |||
|  | @ -707,33 +707,6 @@ opcode_stack_effect(int opcode, int oparg) | |||
| 		case INPLACE_TRUE_DIVIDE: | ||||
| 			return -1; | ||||
| 
 | ||||
| 		case SLICE+0: | ||||
| 			return 1; | ||||
| 		case SLICE+1: | ||||
| 			return 0; | ||||
| 		case SLICE+2: | ||||
| 			return 0; | ||||
| 		case SLICE+3: | ||||
| 			return -1; | ||||
| 
 | ||||
| 		case STORE_SLICE+0: | ||||
| 			return -2; | ||||
| 		case STORE_SLICE+1: | ||||
| 			return -3; | ||||
| 		case STORE_SLICE+2: | ||||
| 			return -3; | ||||
| 		case STORE_SLICE+3: | ||||
| 			return -4; | ||||
| 
 | ||||
| 		case DELETE_SLICE+0: | ||||
| 			return -1; | ||||
| 		case DELETE_SLICE+1: | ||||
| 			return -2; | ||||
| 		case DELETE_SLICE+2: | ||||
| 			return -2; | ||||
| 		case DELETE_SLICE+3: | ||||
| 			return -3; | ||||
| 
 | ||||
| 		case INPLACE_ADD: | ||||
| 		case INPLACE_SUBTRACT: | ||||
| 		case INPLACE_MULTIPLY: | ||||
|  | @ -3507,57 +3480,6 @@ compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) | |||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) | ||||
| { | ||||
| 	int op = 0, slice_offset = 0, stack_count = 0; | ||||
| 
 | ||||
| 	assert(s->v.Slice.step == NULL); | ||||
| 	if (s->v.Slice.lower) { | ||||
| 		slice_offset++; | ||||
| 		stack_count++; | ||||
| 		if (ctx != AugStore)  | ||||
| 			VISIT(c, expr, s->v.Slice.lower); | ||||
| 	} | ||||
| 	if (s->v.Slice.upper) { | ||||
| 		slice_offset += 2; | ||||
| 		stack_count++; | ||||
| 		if (ctx != AugStore)  | ||||
| 			VISIT(c, expr, s->v.Slice.upper); | ||||
| 	} | ||||
| 
 | ||||
| 	if (ctx == AugLoad) { | ||||
| 		switch (stack_count) { | ||||
| 		case 0: ADDOP(c, DUP_TOP); break; | ||||
| 		case 1: ADDOP_I(c, DUP_TOPX, 2); break; | ||||
| 		case 2: ADDOP_I(c, DUP_TOPX, 3); break; | ||||
| 		} | ||||
| 	} | ||||
| 	else if (ctx == AugStore) { | ||||
| 		switch (stack_count) { | ||||
| 		case 0: ADDOP(c, ROT_TWO); break; | ||||
| 		case 1: ADDOP(c, ROT_THREE); break; | ||||
| 		case 2: ADDOP(c, ROT_FOUR); break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	switch (ctx) { | ||||
| 	case AugLoad: /* fall through to Load */ | ||||
| 	case Load: op = SLICE; break; | ||||
| 	case AugStore:/* fall through to Store */ | ||||
| 	case Store: op = STORE_SLICE; break; | ||||
| 	case Del: op = DELETE_SLICE; break; | ||||
| 	case Param: | ||||
| 	default: | ||||
| 		PyErr_SetString(PyExc_SystemError, | ||||
| 				"param invalid in simple slice"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	ADDOP(c, op + slice_offset); | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| compiler_visit_nested_slice(struct compiler *c, slice_ty s,  | ||||
| 			    expr_context_ty ctx) | ||||
|  | @ -3590,8 +3512,6 @@ compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) | |||
| 		break; | ||||
| 	case Slice_kind: | ||||
| 		kindname = "slice"; | ||||
| 		if (!s->v.Slice.step)  | ||||
| 			return compiler_simple_slice(c, s, ctx); | ||||
| 		if (ctx != AugStore) { | ||||
| 			if (!compiler_slice(c, s, ctx)) | ||||
| 				return 0; | ||||
|  |  | |||
|  | @ -875,6 +875,7 @@ PyDoc_STR( | |||
| Static objects:\n\ | ||||
| \n\ | ||||
| maxint -- the largest supported integer (the smallest is -maxint-1)\n\ | ||||
| maxsize -- the largest supported length of containers.\n\ | ||||
| maxunicode -- the largest supported character\n\ | ||||
| builtin_module_names -- tuple of module names built into this interpreter\n\ | ||||
| version -- the version of this interpreter as a string\n\ | ||||
|  | @ -1087,6 +1088,8 @@ _PySys_Init(void) | |||
| 		   	    PyUnicode_FromString(Py_GetExecPrefix())); | ||||
| 	SET_SYS_FROM_STRING("maxint", | ||||
| 			    PyInt_FromLong(PyInt_GetMax())); | ||||
| 	SET_SYS_FROM_STRING("maxsize", | ||||
| 			    PyInt_FromLong(PY_SSIZE_T_MAX)); | ||||
| 	SET_SYS_FROM_STRING("maxunicode", | ||||
| 			    PyInt_FromLong(PyUnicode_GetMax())); | ||||
| 	SET_SYS_FROM_STRING("builtin_module_names", | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thomas Wouters
						Thomas Wouters