]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-131729: Consider in-memory state when merging storage and stack (GH-131773)
authorMark Shannon <mark@hotpy.org>
Thu, 27 Mar 2025 08:32:45 +0000 (08:32 +0000)
committerGitHub <noreply@github.com>
Thu, 27 Mar 2025 08:32:45 +0000 (08:32 +0000)
Python/executor_cases.c.h
Python/generated_cases.c.h
Tools/cases_generator/stack.py

index 6d5f3dd1f6b93502ca75d03c40f099e1bdae8bd8..b3c32c5c5d029fbc64834c2b89fb7b12ec1ec6d6 100644 (file)
                 PyStackRef_CLOSE(tmp);
                 stack_pointer = _PyFrame_GetStackPointer(frame);
             }
+            stack_pointer[-1] = b;
             break;
         }
 
                     stack_pointer = _PyFrame_GetStackPointer(frame);
                 }
             }
+            stack_pointer[-1] = iter;
             break;
         }
 
index f6a538e98fe1291943b1b9cd273f9fe345e158e8..0314f983506b0d1f5e09fc76721e1dedf388ab3d 100644 (file)
                     stack_pointer = _PyFrame_GetStackPointer(frame);
                 }
             }
+            stack_pointer[-1] = iter;
             DISPATCH();
         }
 
index 62253ccb5e2c0d71cdfd8296c2ce8db00a92017f..94a5d3950641916d4968ebd83de2ff460e53b31c 100644 (file)
@@ -378,6 +378,8 @@ class Stack:
             if self_var.memory_offset is not None:
                 if self_var.memory_offset != other_var.memory_offset:
                     raise StackError(f"Mismatched stack depths for {self_var.name}: {self_var.memory_offset} and {other_var.memory_offset}")
+            elif other_var.memory_offset is None:
+                self_var.memory_offset = None
 
 
 def stacks(inst: Instruction | PseudoInstruction) -> Iterator[StackEffect]:
@@ -601,6 +603,11 @@ class Storage:
         if len(self.outputs) != len(other.outputs):
             var = self.outputs[0] if len(self.outputs) > len(other.outputs) else other.outputs[0]
             raise StackError(f"'{var.name}' is set on some paths, but not all")
+        for var, other_var in zip(self.outputs, other.outputs):
+            if var.memory_offset is None:
+                other_var.memory_offset = None
+            elif other_var.memory_offset is None:
+                var.memory_offset = None
         self.stack.merge(other.stack, out)
         self.sanity_check()