mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	gh-107557: Setup abstract interpretation (#107847)
Co-authored-by: Guido van Rossum <gvanrossum@users.noreply.github.com> Co-authored-by: Jules <57632293+juliapoo@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									34e1917912
								
							
						
					
					
						commit
						e28b0dc86d
					
				
					 21 changed files with 1118 additions and 9 deletions
				
			
		
							
								
								
									
										761
									
								
								Python/abstract_interp_cases.c.h
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										761
									
								
								Python/abstract_interp_cases.c.h
									
										
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,761 @@ | |||
| // This file is generated by Tools/cases_generator/generate_cases.py
 | ||||
| // from:
 | ||||
| //   Python/bytecodes.c
 | ||||
| // Do not edit!
 | ||||
| 
 | ||||
|         case NOP: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case POP_TOP: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case PUSH_NULL: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case END_SEND: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNARY_NEGATIVE: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNARY_NOT: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case TO_BOOL: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case TO_BOOL_BOOL: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case TO_BOOL_INT: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case TO_BOOL_LIST: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case TO_BOOL_NONE: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case TO_BOOL_STR: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case TO_BOOL_ALWAYS_TRUE: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNARY_INVERT: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_BOTH_INT: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_BOTH_FLOAT: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _BINARY_OP_MULTIPLY_FLOAT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _BINARY_OP_ADD_FLOAT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _BINARY_OP_SUBTRACT_FLOAT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_BOTH_UNICODE: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _BINARY_OP_ADD_UNICODE: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BINARY_SUBSCR: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BINARY_SLICE: { | ||||
|             STACK_SHRINK(2); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_SLICE: { | ||||
|             STACK_SHRINK(4); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BINARY_SUBSCR_LIST_INT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BINARY_SUBSCR_STR_INT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BINARY_SUBSCR_TUPLE_INT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BINARY_SUBSCR_DICT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LIST_APPEND: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case SET_ADD: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_SUBSCR: { | ||||
|             STACK_SHRINK(3); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_SUBSCR_LIST_INT: { | ||||
|             STACK_SHRINK(3); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_SUBSCR_DICT: { | ||||
|             STACK_SHRINK(3); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DELETE_SUBSCR: { | ||||
|             STACK_SHRINK(2); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_INTRINSIC_1: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_INTRINSIC_2: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case GET_AITER: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case GET_ANEXT: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case GET_AWAITABLE: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case POP_EXCEPT: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_ASSERTION_ERROR: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_BUILD_CLASS: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_NAME: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DELETE_NAME: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNPACK_SEQUENCE: { | ||||
|             STACK_SHRINK(1); | ||||
|             STACK_GROW(oparg); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNPACK_SEQUENCE_TWO_TUPLE: { | ||||
|             STACK_SHRINK(1); | ||||
|             STACK_GROW(oparg); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNPACK_SEQUENCE_TUPLE: { | ||||
|             STACK_SHRINK(1); | ||||
|             STACK_GROW(oparg); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNPACK_SEQUENCE_LIST: { | ||||
|             STACK_SHRINK(1); | ||||
|             STACK_GROW(oparg); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case UNPACK_EX: { | ||||
|             STACK_GROW((oparg & 0xFF) + (oparg >> 8)); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - (oparg >> 8))), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_ATTR: { | ||||
|             STACK_SHRINK(2); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DELETE_ATTR: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_GLOBAL: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DELETE_GLOBAL: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _LOAD_LOCALS: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _LOAD_FROM_DICT_OR_GLOBALS: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_GLOBAL: { | ||||
|             STACK_GROW(1); | ||||
|             STACK_GROW(((oparg & 1) ? 1 : 0)); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - (oparg & 1 ? 1 : 0))), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-(oparg & 1 ? 1 : 0))), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_GLOBALS_VERSION: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_BUILTINS_VERSION: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _LOAD_GLOBAL_MODULE: { | ||||
|             STACK_GROW(1); | ||||
|             STACK_GROW(((oparg & 1) ? 1 : 0)); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - (oparg & 1 ? 1 : 0))), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-(oparg & 1 ? 1 : 0))), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _LOAD_GLOBAL_BUILTINS: { | ||||
|             STACK_GROW(1); | ||||
|             STACK_GROW(((oparg & 1) ? 1 : 0)); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - (oparg & 1 ? 1 : 0))), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-(oparg & 1 ? 1 : 0))), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DELETE_FAST: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DELETE_DEREF: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_FROM_DICT_OR_DEREF: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_DEREF: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case STORE_DEREF: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case COPY_FREE_VARS: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BUILD_STRING: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BUILD_TUPLE: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BUILD_LIST: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LIST_EXTEND: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case SET_UPDATE: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BUILD_SET: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BUILD_MAP: { | ||||
|             STACK_SHRINK(oparg*2); | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case SETUP_ANNOTATIONS: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BUILD_CONST_KEY_MAP: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DICT_UPDATE: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case DICT_MERGE: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case MAP_ADD: { | ||||
|             STACK_SHRINK(2); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_SUPER_ATTR_ATTR: { | ||||
|             STACK_SHRINK(2); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(0)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_SUPER_ATTR_METHOD: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-2)), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case LOAD_ATTR: { | ||||
|             STACK_GROW(((oparg & 1) ? 1 : 0)); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - (oparg & 1 ? 1 : 0))), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-(oparg & 1 ? 1 : 0))), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _GUARD_TYPE_VERSION: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _CHECK_MANAGED_OBJECT_HAS_VALUES: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _LOAD_ATTR_INSTANCE_VALUE: { | ||||
|             STACK_GROW(((oparg & 1) ? 1 : 0)); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - (oparg & 1 ? 1 : 0))), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-(oparg & 1 ? 1 : 0))), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case COMPARE_OP: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case COMPARE_OP_FLOAT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case COMPARE_OP_INT: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case COMPARE_OP_STR: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case IS_OP: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CONTAINS_OP: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CHECK_EG_MATCH: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-2)), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CHECK_EXC_MATCH: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case IS_NONE: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case GET_LEN: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case MATCH_CLASS: { | ||||
|             STACK_SHRINK(2); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case MATCH_MAPPING: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case MATCH_SEQUENCE: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case MATCH_KEYS: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case GET_ITER: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case GET_YIELD_FROM_ITER: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _ITER_CHECK_LIST: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _IS_ITER_EXHAUSTED_LIST: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _ITER_NEXT_LIST: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _ITER_CHECK_TUPLE: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _IS_ITER_EXHAUSTED_TUPLE: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _ITER_NEXT_TUPLE: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _ITER_CHECK_RANGE: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _IS_ITER_EXHAUSTED_RANGE: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _ITER_NEXT_RANGE: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case WITH_EXCEPT_START: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case PUSH_EXC_INFO: { | ||||
|             STACK_GROW(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-2)), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_TYPE_1: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_STR_1: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_TUPLE_1: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case EXIT_INIT_CHECK: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_BUILTIN_O: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_BUILTIN_FAST: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_LEN: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_ISINSTANCE: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_METHOD_DESCRIPTOR_O: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CALL_NO_KW_METHOD_DESCRIPTOR_FAST: { | ||||
|             STACK_SHRINK(oparg); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case MAKE_FUNCTION: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case SET_FUNCTION_ATTRIBUTE: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BUILD_SLICE: { | ||||
|             STACK_SHRINK(((oparg == 3) ? 1 : 0)); | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case CONVERT_VALUE: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case FORMAT_SIMPLE: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case FORMAT_WITH_SPEC: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case BINARY_OP: { | ||||
|             STACK_SHRINK(1); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case SWAP: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-2 - (oparg-2))), true); | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1)), true); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _POP_JUMP_IF_FALSE: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case _POP_JUMP_IF_TRUE: { | ||||
|             STACK_SHRINK(1); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case JUMP_TO_TOP: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case SAVE_IP: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case EXIT_TRACE: { | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case INSERT: { | ||||
|             PARTITIONNODE_OVERWRITE((_Py_PARTITIONNODE_t *)PARTITIONNODE_NULLROOT, PEEK(-(-1 - oparg)), true); | ||||
|             break; | ||||
|         } | ||||
|  | @ -3743,6 +3743,11 @@ dummy_func( | |||
|             return frame; | ||||
|         } | ||||
| 
 | ||||
|         op(INSERT, (unused[oparg], top -- top, unused[oparg])) { | ||||
|             // Inserts TOS at position specified by oparg;
 | ||||
|             memmove(&stack_pointer[-1 - oparg], &stack_pointer[-oparg], oparg * sizeof(stack_pointer[0])); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| // END BYTECODES //
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										9
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								Python/executor_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -2733,3 +2733,12 @@ | |||
|             return frame; | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case INSERT: { | ||||
|             PyObject *top; | ||||
|             top = stack_pointer[-1]; | ||||
|             // Inserts TOS at position specified by oparg;
 | ||||
|             memmove(&stack_pointer[-1 - oparg], &stack_pointer[-oparg], oparg * sizeof(stack_pointer[0])); | ||||
|             stack_pointer[-1 - oparg] = top; | ||||
|             break; | ||||
|         } | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| #include "pycore_opcode.h" | ||||
| #include "pycore_opcode_metadata.h" | ||||
| #include "pycore_opcode_utils.h" | ||||
| #include "pycore_optimizer.h" | ||||
| #include "pycore_pystate.h"       // _PyInterpreterState_GET() | ||||
| #include "pycore_uops.h" | ||||
| #include "cpython/optimizer.h" | ||||
|  | @ -103,7 +104,8 @@ error_optimize( | |||
|     _PyOptimizerObject* self, | ||||
|     PyCodeObject *code, | ||||
|     _Py_CODEUNIT *instr, | ||||
|     _PyExecutorObject **exec) | ||||
|     _PyExecutorObject **exec, | ||||
|     int Py_UNUSED(stack_entries)) | ||||
| { | ||||
|     PyErr_Format(PyExc_SystemError, "Should never call error_optimize"); | ||||
|     return -1; | ||||
|  | @ -164,7 +166,7 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI | |||
|     } | ||||
|     _PyOptimizerObject *opt = interp->optimizer; | ||||
|     _PyExecutorObject *executor = NULL; | ||||
|     int err = opt->optimize(opt, code, dest, &executor); | ||||
|     int err = opt->optimize(opt, code, dest, &executor, (int)(stack_pointer - _PyFrame_Stackbase(frame))); | ||||
|     if (err <= 0) { | ||||
|         assert(executor == NULL); | ||||
|         if (err < 0) { | ||||
|  | @ -254,7 +256,9 @@ counter_optimize( | |||
|     _PyOptimizerObject* self, | ||||
|     PyCodeObject *code, | ||||
|     _Py_CODEUNIT *instr, | ||||
|     _PyExecutorObject **exec_ptr) | ||||
|     _PyExecutorObject **exec_ptr, | ||||
|     int Py_UNUSED(curr_stackentries) | ||||
| ) | ||||
| { | ||||
|     _PyCounterExecutorObject *executor = (_PyCounterExecutorObject *)_PyObject_New(&CounterExecutor_Type); | ||||
|     if (executor == NULL) { | ||||
|  | @ -684,7 +688,8 @@ uop_optimize( | |||
|     _PyOptimizerObject *self, | ||||
|     PyCodeObject *code, | ||||
|     _Py_CODEUNIT *instr, | ||||
|     _PyExecutorObject **exec_ptr) | ||||
|     _PyExecutorObject **exec_ptr, | ||||
|     int curr_stackentries) | ||||
| { | ||||
|     _PyUOpInstruction trace[_Py_UOP_MAX_TRACE_LENGTH]; | ||||
|     int trace_length = translate_bytecode_to_trace(code, instr, trace, _Py_UOP_MAX_TRACE_LENGTH); | ||||
|  | @ -693,6 +698,10 @@ uop_optimize( | |||
|         return trace_length; | ||||
|     } | ||||
|     OBJECT_STAT_INC(optimization_traces_created); | ||||
|     char *uop_optimize = Py_GETENV("PYTHONUOPSOPTIMIZE"); | ||||
|     if (uop_optimize != NULL && *uop_optimize > '0') { | ||||
|         trace_length = _Py_uop_analyze_and_optimize(code, trace, trace_length, curr_stackentries); | ||||
|     } | ||||
|     _PyUOpExecutorObject *executor = PyObject_NewVar(_PyUOpExecutorObject, &UOpExecutor_Type, trace_length); | ||||
|     if (executor == NULL) { | ||||
|         return -1; | ||||
|  |  | |||
							
								
								
									
										26
									
								
								Python/optimizer_analysis.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Python/optimizer_analysis.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| #include "Python.h" | ||||
| #include "opcode.h" | ||||
| #include "pycore_interp.h" | ||||
| #include "pycore_opcode.h" | ||||
| #include "pycore_opcode_metadata.h" | ||||
| #include "pycore_opcode_utils.h" | ||||
| #include "pycore_pystate.h"       // _PyInterpreterState_GET() | ||||
| #include "pycore_uops.h" | ||||
| #include "pycore_long.h" | ||||
| #include "cpython/optimizer.h" | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <stddef.h> | ||||
| #include "pycore_optimizer.h" | ||||
| 
 | ||||
| 
 | ||||
| int | ||||
| _Py_uop_analyze_and_optimize( | ||||
|     PyCodeObject *co, | ||||
|     _PyUOpInstruction *trace, | ||||
|     int trace_len, | ||||
|     int curr_stacklen | ||||
| ) | ||||
| { | ||||
|     return trace_len; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ken Jin
						Ken Jin