GH-131729: Consider in-memory state when merging storage and stack (GH-131773)

This commit is contained in:
Mark Shannon 2025-03-27 08:32:45 +00:00 committed by GitHub
parent 316938bddf
commit d836d287a7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 10 additions and 0 deletions

View file

@ -3933,6 +3933,7 @@
PyStackRef_CLOSE(tmp);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
stack_pointer[-1] = b;
break;
}
@ -4116,6 +4117,7 @@
stack_pointer = _PyFrame_GetStackPointer(frame);
}
}
stack_pointer[-1] = iter;
break;
}

View file

@ -6009,6 +6009,7 @@
stack_pointer = _PyFrame_GetStackPointer(frame);
}
}
stack_pointer[-1] = iter;
DISPATCH();
}

View 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()