Run the following program with Source 3 in the CSE machine.
let x = 1;
const g = () => 1;
function f() {
function g() {
return 2;
}
return(g());
}
f() + (a => a + 1)(3) + g();
Note that a => a+1 is parented to the f() block env instead of the program env.
Minimal example
function f() {
const a = 1;
return 2;
}
f() + (a => a + 1)(3);
Possible culprit
At step 31, we return from f. (contrary to the current-line pointer - eep!) As part of returning from the function, the current env should be changed to the program env.
However, as return swallows the env instruction on its way to mark, at step 33 we are already back on line 12... but with the current environment still in the f block frame.
As noted by the reporter, this issue does not manifest if f takes any arguments. This is because the env instruction corresponding to the f argument frame would not be swallowed, allowing the machine to return to the program env.
Initially reported at https://edstem.org/us/courses/42391/discussion/3688626
Reproduction instructions
Run the following program with Source 3 in the CSE machine.
Note that
a => a+1
is parented to thef()
block env instead of the program env.Minimal example
Possible culprit
At step 31, we return from
f
. (contrary to the current-line pointer - eep!) As part of returning from the function, the current env should be changed to the program env.However, as
return
swallows theenv
instruction on its way tomark
, at step 33 we are already back on line 12... but with the current environment still in thef
block frame.As noted by the reporter, this issue does not manifest if
f
takes any arguments. This is because theenv
instruction corresponding to thef
argument frame would not be swallowed, allowing the machine to return to the program env.