Fix computation of extra_args during CPS conversion of Lstaticraise #126
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This fixes a subtle bug in CPS conversion, which took many hours to find, that can be triggered by the example in the diff. Prior to this PR, the raw Flambda terms were wrong: they would return
init
instead of!m
from the functionf
.The example produces an unusual Lambda code sequence (in the comment in the diff) which involves having a
for
-loop as the argument toLstaticraise
(printed as "exit
") in conjunction with a mutable variable that is required at the correspondingLstaticcatch
handler. It is necessary to get the correct "instance" of the mutable variable, converted during CPS conversion to multiple immutable ones, at the exits of thefor
-loop. This means that the environment in the meta-level continuation passed tocps_non_tail_list
(originally on line 901/902) must be used for computingextra_args
, not the environment e.g. on line 896 as was happening before. Using the environment on line 896 causes theLstaticcatch
handler to receive the snapshot of the mutable variable as it was before thefor
-loop, not after the requisite number of iterations.