@@ -957,13 +957,13 @@ dummy_func(
957
957
{
958
958
PyGenObject * gen = (PyGenObject * )receiver ;
959
959
_PyInterpreterFrame * gen_frame = (_PyInterpreterFrame * )gen -> gi_iframe ;
960
- frame -> return_offset = oparg ;
961
960
STACK_SHRINK (1 );
962
961
_PyFrame_StackPush (gen_frame , v );
963
962
gen -> gi_frame_state = FRAME_EXECUTING ;
964
963
gen -> gi_exc_state .previous_item = tstate -> exc_info ;
965
964
tstate -> exc_info = & gen -> gi_exc_state ;
966
965
SKIP_OVER (INLINE_CACHE_ENTRIES_SEND );
966
+ frame -> return_offset = oparg ;
967
967
DISPATCH_INLINED (gen_frame );
968
968
}
969
969
if (Py_IsNone (v ) && PyIter_Check (receiver )) {
@@ -996,13 +996,13 @@ dummy_func(
996
996
DEOPT_IF (gen -> gi_frame_state >= FRAME_EXECUTING , SEND );
997
997
STAT_INC (SEND , hit );
998
998
_PyInterpreterFrame * gen_frame = (_PyInterpreterFrame * )gen -> gi_iframe ;
999
- frame -> return_offset = oparg ;
1000
999
STACK_SHRINK (1 );
1001
1000
_PyFrame_StackPush (gen_frame , v );
1002
1001
gen -> gi_frame_state = FRAME_EXECUTING ;
1003
1002
gen -> gi_exc_state .previous_item = tstate -> exc_info ;
1004
1003
tstate -> exc_info = & gen -> gi_exc_state ;
1005
1004
SKIP_OVER (INLINE_CACHE_ENTRIES_SEND );
1005
+ frame -> return_offset = oparg ;
1006
1006
DISPATCH_INLINED (gen_frame );
1007
1007
}
1008
1008
@@ -2586,14 +2586,14 @@ dummy_func(
2586
2586
DEOPT_IF (gen -> gi_frame_state >= FRAME_EXECUTING , FOR_ITER );
2587
2587
STAT_INC (FOR_ITER , hit );
2588
2588
_PyInterpreterFrame * gen_frame = (_PyInterpreterFrame * )gen -> gi_iframe ;
2589
- frame -> return_offset = oparg ;
2590
2589
_PyFrame_StackPush (gen_frame , Py_None );
2591
2590
gen -> gi_frame_state = FRAME_EXECUTING ;
2592
2591
gen -> gi_exc_state .previous_item = tstate -> exc_info ;
2593
2592
tstate -> exc_info = & gen -> gi_exc_state ;
2594
2593
SKIP_OVER (INLINE_CACHE_ENTRIES_FOR_ITER );
2595
2594
assert (next_instr [oparg ].op .code == END_FOR ||
2596
2595
next_instr [oparg ].op .code == INSTRUMENTED_END_FOR );
2596
+ frame -> return_offset = oparg ;
2597
2597
DISPATCH_INLINED (gen_frame );
2598
2598
}
2599
2599
@@ -2944,7 +2944,7 @@ dummy_func(
2944
2944
GO_TO_INSTRUCTION (CALL_PY_EXACT_ARGS );
2945
2945
}
2946
2946
2947
- inst ( CALL_PY_EXACT_ARGS , (unused / 1 , func_version /2 , callable , self_or_null , args [oparg ] -- unused )) {
2947
+ op ( _CHECK_CALL_PY_EXACT_ARGS , (func_version /2 , callable , self_or_null , unused [oparg ] -- method , callable , unused [ oparg ] )) {
2948
2948
ASSERT_KWNAMES_IS_NULL ();
2949
2949
DEOPT_IF (tstate -> interp -> eval_frame , CALL );
2950
2950
int argcount = oparg ;
@@ -2958,19 +2958,36 @@ dummy_func(
2958
2958
PyCodeObject * code = (PyCodeObject * )func -> func_code ;
2959
2959
DEOPT_IF (code -> co_argcount != argcount , CALL );
2960
2960
DEOPT_IF (!_PyThreadState_HasStackSpace (tstate , code -> co_framesize ), CALL );
2961
+ }
2962
+
2963
+ op (_INIT_CALL_PY_EXACT_ARGS , (method , callable , args [oparg ] -- new_frame : _PyInterpreterFrame * )) {
2964
+ int is_meth = method != NULL ;
2965
+ int argcount = oparg ;
2966
+ if (is_meth ) {
2967
+ callable = method ;
2968
+ args -- ;
2969
+ argcount ++ ;
2970
+ }
2961
2971
STAT_INC (CALL , hit );
2962
- _PyInterpreterFrame * new_frame = _PyFrame_PushUnchecked (tstate , func , argcount );
2972
+ PyFunctionObject * func = (PyFunctionObject * )callable ;
2973
+ new_frame = _PyFrame_PushUnchecked (tstate , func , argcount );
2963
2974
for (int i = 0 ; i < argcount ; i ++ ) {
2964
2975
new_frame -> localsplus [i ] = args [i ];
2965
2976
}
2966
- // Manipulate stack directly since we leave using DISPATCH_INLINED().
2967
- STACK_SHRINK ( oparg + 2 );
2968
- SKIP_OVER ( INLINE_CACHE_ENTRIES_CALL );
2977
+ }
2978
+
2979
+ op ( _PUSH_FRAME , ( new_frame : _PyInterpreterFrame * -- unused )) {
2969
2980
frame -> return_offset = 0 ;
2970
2981
DISPATCH_INLINED (new_frame );
2971
2982
}
2972
2983
2973
- inst (CALL_PY_WITH_DEFAULTS , (unused /1 , func_version /2 , callable , self_or_null , args [oparg ] -- unused )) {
2984
+ macro (CALL_PY_EXACT_ARGS ) =
2985
+ unused /1 + // Skip over the counter
2986
+ _CHECK_CALL_PY_EXACT_ARGS +
2987
+ _INIT_CALL_PY_EXACT_ARGS +
2988
+ _PUSH_FRAME ;
2989
+
2990
+ inst (CALL_PY_WITH_DEFAULTS , (unused /1 , func_version /2 , method , callable , args [oparg ] -- unused )) {
2974
2991
ASSERT_KWNAMES_IS_NULL ();
2975
2992
DEOPT_IF (tstate -> interp -> eval_frame , CALL );
2976
2993
int argcount = oparg ;
0 commit comments