`i' in the break buffer sent a local's *name* to be evaluated, and an expression is evaluated where the evaluator stands. On the innermost frame that is the right frame; on any other it may resolve to a global, to another binding of the same name, or to nothing, with the listing above it showing the frame's own storage and nothing saying the two disagree. The shadow stack is what makes the second rooting mode cheap: a frame's address and every slot's type are both here, so a step into a field is an address plus an offset with that field's type — the arithmetic `Render.render' already does for the listing. `Session.render_slot' is `render_locals' with a path applied to the root and one line out. The slot travels by *index*, because a name is not unique: two `v's is two slots and both are in the listing, and a refused slot is not, so the position in the list is not an identifier either. So `locals' now puts the index on each line. The frame checks are `locals'' by construction — `stopped_frame' is one function now, and an inspector with its own copy would be free to read a frame whose body was redefined since it was entered. The build-and-read tail is one function too, for the reason this file already records about the fingerprint. And `layout' said union values were milestone 6, which they have not been since today.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%