mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-98831: rewrite CHECK_EG_MATCH opcode in the instruction definition DSL (#101269)
This commit is contained in:
		
							parent
							
								
									7589d713a1
								
							
						
					
					
						commit
						8c183cddd3
					
				
					 4 changed files with 27 additions and 58 deletions
				
			
		|  | @ -1894,44 +1894,24 @@ dummy_func( | |||
|             b = Py_NewRef((res^oparg) ? Py_True : Py_False); | ||||
|         } | ||||
| 
 | ||||
|         // stack effect: ( -- )
 | ||||
|         inst(CHECK_EG_MATCH) { | ||||
|             PyObject *match_type = POP(); | ||||
|         inst(CHECK_EG_MATCH, (exc_value, match_type -- rest, match)) { | ||||
|             if (check_except_star_type_valid(tstate, match_type) < 0) { | ||||
|                 Py_DECREF(match_type); | ||||
|                 goto error; | ||||
|                 DECREF_INPUTS(); | ||||
|                 ERROR_IF(true, error); | ||||
|             } | ||||
| 
 | ||||
|             PyObject *exc_value = TOP(); | ||||
|             PyObject *match = NULL, *rest = NULL; | ||||
|             match = NULL; | ||||
|             rest = NULL; | ||||
|             int res = exception_group_match(exc_value, match_type, | ||||
|                                             &match, &rest); | ||||
|             Py_DECREF(match_type); | ||||
|             if (res < 0) { | ||||
|                 goto error; | ||||
|             } | ||||
|             DECREF_INPUTS(); | ||||
|             ERROR_IF(res < 0, error); | ||||
| 
 | ||||
|             if (match == NULL || rest == NULL) { | ||||
|                 assert(match == NULL); | ||||
|                 assert(rest == NULL); | ||||
|                 goto error; | ||||
|             } | ||||
|             if (Py_IsNone(match)) { | ||||
|                 PUSH(match); | ||||
|                 Py_XDECREF(rest); | ||||
|             } | ||||
|             else { | ||||
|                 /* Total or partial match - update the stack from
 | ||||
|                  * [val] | ||||
|                  * to | ||||
|                  * [rest, match] | ||||
|                  * (rest can be Py_None) | ||||
|                  */ | ||||
|             assert((match == NULL) == (rest == NULL)); | ||||
|             ERROR_IF(match == NULL, error); | ||||
| 
 | ||||
|                 SET_TOP(rest); | ||||
|                 PUSH(match); | ||||
|             if (!Py_IsNone(match)) { | ||||
|                 PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL); | ||||
|                 Py_DECREF(exc_value); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1946,7 +1946,7 @@ exception_group_match(PyObject* exc_value, PyObject *match_type, | |||
|     } | ||||
|     /* no match */ | ||||
|     *match = Py_NewRef(Py_None); | ||||
|     *rest = Py_NewRef(Py_None); | ||||
|     *rest = Py_NewRef(exc_value); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										41
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										41
									
								
								Python/generated_cases.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -2251,43 +2251,32 @@ | |||
|         } | ||||
| 
 | ||||
|         TARGET(CHECK_EG_MATCH) { | ||||
|             PyObject *match_type = POP(); | ||||
|             PyObject *match_type = PEEK(1); | ||||
|             PyObject *exc_value = PEEK(2); | ||||
|             PyObject *rest; | ||||
|             PyObject *match; | ||||
|             if (check_except_star_type_valid(tstate, match_type) < 0) { | ||||
|                 Py_DECREF(exc_value); | ||||
|                 Py_DECREF(match_type); | ||||
|                 goto error; | ||||
|                 if (true) goto pop_2_error; | ||||
|             } | ||||
| 
 | ||||
|             PyObject *exc_value = TOP(); | ||||
|             PyObject *match = NULL, *rest = NULL; | ||||
|             match = NULL; | ||||
|             rest = NULL; | ||||
|             int res = exception_group_match(exc_value, match_type, | ||||
|                                             &match, &rest); | ||||
|             Py_DECREF(exc_value); | ||||
|             Py_DECREF(match_type); | ||||
|             if (res < 0) { | ||||
|                 goto error; | ||||
|             } | ||||
|             if (res < 0) goto pop_2_error; | ||||
| 
 | ||||
|             if (match == NULL || rest == NULL) { | ||||
|                 assert(match == NULL); | ||||
|                 assert(rest == NULL); | ||||
|                 goto error; | ||||
|             } | ||||
|             if (Py_IsNone(match)) { | ||||
|                 PUSH(match); | ||||
|                 Py_XDECREF(rest); | ||||
|             } | ||||
|             else { | ||||
|                 /* Total or partial match - update the stack from
 | ||||
|                  * [val] | ||||
|                  * to | ||||
|                  * [rest, match] | ||||
|                  * (rest can be Py_None) | ||||
|                  */ | ||||
|             assert((match == NULL) == (rest == NULL)); | ||||
|             if (match == NULL) goto pop_2_error; | ||||
| 
 | ||||
|                 SET_TOP(rest); | ||||
|                 PUSH(match); | ||||
|             if (!Py_IsNone(match)) { | ||||
|                 PyErr_SetExcInfo(NULL, Py_NewRef(match), NULL); | ||||
|                 Py_DECREF(exc_value); | ||||
|             } | ||||
|             POKE(1, match); | ||||
|             POKE(2, rest); | ||||
|             DISPATCH(); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -119,7 +119,7 @@ static const struct { | |||
|     [COMPARE_AND_BRANCH_STR] = { 2, 0, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC0 }, | ||||
|     [IS_OP] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | ||||
|     [CONTAINS_OP] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | ||||
|     [CHECK_EG_MATCH] = { -1, -1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX }, | ||||
|     [CHECK_EG_MATCH] = { 2, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX }, | ||||
|     [CHECK_EXC_MATCH] = { 2, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX }, | ||||
|     [IMPORT_NAME] = { 2, 1, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | ||||
|     [IMPORT_FROM] = { 1, 2, DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB }, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Irit Katriel
						Irit Katriel