Third on the list to delete, and nothing goes. "The compiler can read the stopped frame's memory directly, so copying it is ceremony" is the right instinct and the wrong diagnosis: the snapshot was never about two address spaces. A stopped program is not holding still. The break loop polls, flan_agent_poll runs whatever was delivered, and a C-x C-e thunk is arbitrary Flan that pushes and pops the one global restart list and the shadow stack while it runs. The compiler is a thread beside it either way. Restart names are copied because serving them off the live list hands the reader a pointer into a frame the loop's own poll may already have popped; a pointer is meaningful to the compiler now, and the frame it points into is no more alive for that. The fingerprints have a sharper reason still, already written down: the module a frame's description lives in can be unloaded before the comparison happens. The generation stamp is about nested breaks. A thunk this loop runs can error, push a break of its own, and reach chosen_ready first, claiming an index someone chose from the outer list. Depth cannot tell those apart because a resumed outer break and a new one reuse the number. One process changes none of that. So of the three things the merge was expected to make deletable, one was. The socket was transport. The result cap and the snapshot are concurrency, and were only mistaken for transport because the socket was in front of them. What the merge does unlock here is item 4, deliberately not touched: flan_agent_frame_slot already hands back an address, and in one process the compiler could read the value there instead of compiling a thunk to print it.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%