]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
restore optimizer code
authorKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Tue, 21 Oct 2025 20:34:48 +0000 (21:34 +0100)
committerKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Tue, 21 Oct 2025 20:34:48 +0000 (21:34 +0100)
Include/internal/pycore_optimizer.h
Python/optimizer_bytecodes.c
Python/optimizer_cases.c.h

index a87cce85e9798b1eee1931f8e84025d22ad2a583..9c3aaf1edaf5506f2de3f1358d37e458afde5f1e 100644 (file)
@@ -372,7 +372,7 @@ _PyJit_translate_single_bytecode_to_trace(
     int jump_taken);
 
 void
-_PyJit_InitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *insert_exec_instr
+_PyJit_InitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *insert_exec_instr,
     _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit);
 
 void _PyJit_FinalizeTracing(PyThreadState *tstate);
index 734a9193af7f897446a39d571cb21c4e3fd31a4f..09c5ae764e5ac393f1c37bc0c7eef70ed0e1c4a0 100644 (file)
@@ -794,10 +794,18 @@ dummy_func(void) {
 
     op(_RETURN_GENERATOR, ( -- res)) {
         SYNC_SP();
+        PyCodeObject *co = get_current_code_object(ctx);
+        ctx->frame->stack_pointer = stack_pointer;
+        frame_pop(ctx);
         stack_pointer = ctx->frame->stack_pointer;
         res = sym_new_unknown(ctx);
-        ctx->done = true;
-        ctx->out_of_space = true;
+        /* Stack space handling */
+        assert(corresponding_check_stack == NULL);
+        assert(co != NULL);
+        int framesize = co->co_framesize;
+        assert(framesize > 0);
+        assert(framesize <= curr_space);
+        curr_space -= framesize;
     }
 
     op(_YIELD_VALUE, (unused -- value)) {
index 99d8d8ae33397d736a6569524f2f84750a47b645..002da75ea38481005192e58f8cc1d743d5e6d9d9 100644 (file)
 
         case _RETURN_GENERATOR: {
             JitOptRef res;
+            PyCodeObject *co = get_current_code_object(ctx);
+            ctx->frame->stack_pointer = stack_pointer;
+            frame_pop(ctx);
             stack_pointer = ctx->frame->stack_pointer;
             res = sym_new_unknown(ctx);
-            ctx->done = true;
-            ctx->out_of_space = true;
+            assert(corresponding_check_stack == NULL);
+            assert(co != NULL);
+            int framesize = co->co_framesize;
+            assert(framesize > 0);
+            assert(framesize <= curr_space);
+            curr_space -= framesize;
             stack_pointer[0] = res;
             stack_pointer += 1;
             assert(WITHIN_STACK_BOUNDS());