summaryrefslogtreecommitdiff
path: root/src/InterpreterStatements.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/InterpreterStatements.ml')
-rw-r--r--src/InterpreterStatements.ml11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/InterpreterStatements.ml b/src/InterpreterStatements.ml
index 0100a9c6..23fe8d3b 100644
--- a/src/InterpreterStatements.ml
+++ b/src/InterpreterStatements.ml
@@ -32,7 +32,13 @@ let drop_value (config : C.config) (ctx : C.eval_ctx) (p : E.place) : C.eval_ctx
let ctx = write_place_unwrap config Write p nv ctx in
ctx
-(** Assign a value to a given place *)
+(** Assign a value to a given place.
+
+ Note that this function first pushes the value to assign in a dummy variable,
+ then prepares the destination (by ending borrows, etc.) before popping the
+ dummy variable and putting in its destination (after having checked that
+ preparing the destination didn't introduce ⊥).
+ *)
let assign_to_place (config : C.config) (ctx : C.eval_ctx) (v : V.typed_value)
(p : E.place) : C.eval_ctx =
(* Push the rvalue to a dummy variable, for bookkeeping *)
@@ -827,9 +833,6 @@ and eval_local_function_call_concrete (config : C.config) (ctx : C.eval_ctx)
(* Pop the stack frame and retrieve the return value *)
let ctx, ret_value = ctx_pop_frame config ctx in
- (* TODO: there might be a problem because the return value
- * if hanging in the air while we assign to place! *)
-
(* Move the return value to its destination *)
let ctx = assign_to_place config ctx ret_value dest in