mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	Move some opcodes to top of big eval_frame switch statement. Skip
things_to_do block for a few common opcodes that don't do any real work. Closes SF patch #512256.
This commit is contained in:
		
							parent
							
								
									54e5b89d77
								
							
						
					
					
						commit
						6354386d65
					
				
					 1 changed files with 45 additions and 44 deletions
				
			
		| 
						 | 
					@ -680,6 +680,7 @@ eval_frame(PyFrameObject *f)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fast_next_opcode:
 | 
				
			||||||
		/* Extract opcode and argument */
 | 
							/* Extract opcode and argument */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(Py_DEBUG) || defined(LLTRACE)
 | 
					#if defined(Py_DEBUG) || defined(LLTRACE)
 | 
				
			||||||
| 
						 | 
					@ -724,10 +725,53 @@ eval_frame(PyFrameObject *f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* case STOP_CODE: this is an error! */
 | 
							/* case STOP_CODE: this is an error! */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case SET_LINENO:
 | 
				
			||||||
 | 
					#ifdef LLTRACE
 | 
				
			||||||
 | 
								if (lltrace)
 | 
				
			||||||
 | 
									printf("--- %s:%d \n", filename, oparg);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
								f->f_lineno = oparg;
 | 
				
			||||||
 | 
								if (tstate->c_tracefunc == NULL || tstate->tracing)
 | 
				
			||||||
 | 
									goto fast_next_opcode;
 | 
				
			||||||
 | 
								/* Trace each line of code reached */
 | 
				
			||||||
 | 
								f->f_lasti = INSTR_OFFSET();
 | 
				
			||||||
 | 
								/* Inline call_trace() for performance: */
 | 
				
			||||||
 | 
								tstate->tracing++;
 | 
				
			||||||
 | 
								tstate->use_tracing = 0;
 | 
				
			||||||
 | 
								err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
 | 
				
			||||||
 | 
											    PyTrace_LINE, Py_None);
 | 
				
			||||||
 | 
								tstate->use_tracing = (tstate->c_tracefunc
 | 
				
			||||||
 | 
										       || tstate->c_profilefunc);
 | 
				
			||||||
 | 
								tstate->tracing--;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case LOAD_FAST:
 | 
				
			||||||
 | 
								x = GETLOCAL(oparg);
 | 
				
			||||||
 | 
								if (x != NULL) {
 | 
				
			||||||
 | 
									Py_INCREF(x);
 | 
				
			||||||
 | 
									PUSH(x);
 | 
				
			||||||
 | 
									goto fast_next_opcode;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								format_exc_check_arg(PyExc_UnboundLocalError,
 | 
				
			||||||
 | 
									UNBOUNDLOCAL_ERROR_MSG,
 | 
				
			||||||
 | 
									PyTuple_GetItem(co->co_varnames, oparg));
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case LOAD_CONST:
 | 
				
			||||||
 | 
								x = GETCONST(oparg);
 | 
				
			||||||
 | 
								Py_INCREF(x);
 | 
				
			||||||
 | 
								PUSH(x);
 | 
				
			||||||
 | 
								goto fast_next_opcode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case STORE_FAST:
 | 
				
			||||||
 | 
								v = POP();
 | 
				
			||||||
 | 
								SETLOCAL(oparg, v);
 | 
				
			||||||
 | 
								goto fast_next_opcode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case POP_TOP:
 | 
							case POP_TOP:
 | 
				
			||||||
			v = POP();
 | 
								v = POP();
 | 
				
			||||||
			Py_DECREF(v);
 | 
								Py_DECREF(v);
 | 
				
			||||||
			continue;
 | 
								goto fast_next_opcode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case ROT_TWO:
 | 
							case ROT_TWO:
 | 
				
			||||||
			v = POP();
 | 
								v = POP();
 | 
				
			||||||
| 
						 | 
					@ -1617,12 +1661,6 @@ eval_frame(PyFrameObject *f)
 | 
				
			||||||
				    PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
 | 
									    PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case LOAD_CONST:
 | 
					 | 
				
			||||||
			x = GETCONST(oparg);
 | 
					 | 
				
			||||||
			Py_INCREF(x);
 | 
					 | 
				
			||||||
			PUSH(x);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		case LOAD_NAME:
 | 
							case LOAD_NAME:
 | 
				
			||||||
			w = GETNAMEV(oparg);
 | 
								w = GETNAMEV(oparg);
 | 
				
			||||||
			if ((x = f->f_locals) == NULL) {
 | 
								if ((x = f->f_locals) == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -1664,23 +1702,6 @@ eval_frame(PyFrameObject *f)
 | 
				
			||||||
			PUSH(x);
 | 
								PUSH(x);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case LOAD_FAST:
 | 
					 | 
				
			||||||
			x = GETLOCAL(oparg);
 | 
					 | 
				
			||||||
			if (x != NULL) {
 | 
					 | 
				
			||||||
				Py_INCREF(x);
 | 
					 | 
				
			||||||
				PUSH(x);
 | 
					 | 
				
			||||||
				continue;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			format_exc_check_arg(PyExc_UnboundLocalError,
 | 
					 | 
				
			||||||
				UNBOUNDLOCAL_ERROR_MSG,
 | 
					 | 
				
			||||||
				PyTuple_GetItem(co->co_varnames, oparg));
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		case STORE_FAST:
 | 
					 | 
				
			||||||
			v = POP();
 | 
					 | 
				
			||||||
			SETLOCAL(oparg, v);
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		case DELETE_FAST:
 | 
							case DELETE_FAST:
 | 
				
			||||||
			x = GETLOCAL(oparg);
 | 
								x = GETLOCAL(oparg);
 | 
				
			||||||
			if (x == NULL) {
 | 
								if (x == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -1949,26 +1970,6 @@ eval_frame(PyFrameObject *f)
 | 
				
			||||||
					   STACK_LEVEL());
 | 
										   STACK_LEVEL());
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case SET_LINENO:
 | 
					 | 
				
			||||||
#ifdef LLTRACE
 | 
					 | 
				
			||||||
			if (lltrace)
 | 
					 | 
				
			||||||
				printf("--- %s:%d \n", filename, oparg);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
			f->f_lineno = oparg;
 | 
					 | 
				
			||||||
			if (tstate->c_tracefunc == NULL || tstate->tracing)
 | 
					 | 
				
			||||||
				continue;
 | 
					 | 
				
			||||||
			/* Trace each line of code reached */
 | 
					 | 
				
			||||||
			f->f_lasti = INSTR_OFFSET();
 | 
					 | 
				
			||||||
			/* Inline call_trace() for performance: */
 | 
					 | 
				
			||||||
			tstate->tracing++;
 | 
					 | 
				
			||||||
			tstate->use_tracing = 0;
 | 
					 | 
				
			||||||
			err = (tstate->c_tracefunc)(tstate->c_traceobj, f,
 | 
					 | 
				
			||||||
						    PyTrace_LINE, Py_None);
 | 
					 | 
				
			||||||
			tstate->use_tracing = (tstate->c_tracefunc
 | 
					 | 
				
			||||||
					       || tstate->c_profilefunc);
 | 
					 | 
				
			||||||
			tstate->tracing--;
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		case CALL_FUNCTION:
 | 
							case CALL_FUNCTION:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		    int na = oparg & 0xff;
 | 
							    int na = oparg & 0xff;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue