From d8b1c699b15aae2d7c5b960735741bab2044bade Mon Sep 17 00:00:00 2001 From: Gabor Greif Date: Tue, 1 Oct 2024 14:26:56 +0200 Subject: [PATCH] fix the IR-interpreter --- src/ir_interpreter/interpret_ir.ml | 22 +++++++++++++++++----- test/run-drun/ok/pass-self.diff-ir.ok | 8 -------- test/run-drun/ok/pass-self.diff-low.ok | 8 -------- test/run-drun/ok/pass-self.run-ir.ok | 4 +++- test/run-drun/ok/pass-self.run-low.ok | 4 +++- test/run-drun/pass-self.mo | 2 +- 6 files changed, 24 insertions(+), 24 deletions(-) delete mode 100644 test/run-drun/ok/pass-self.diff-ir.ok delete mode 100644 test/run-drun/ok/pass-self.diff-low.ok diff --git a/src/ir_interpreter/interpret_ir.ml b/src/ir_interpreter/interpret_ir.ml index 0c7a6465c8c..ff3d9f69897 100644 --- a/src/ir_interpreter/interpret_ir.ml +++ b/src/ir_interpreter/interpret_ir.ml @@ -572,14 +572,15 @@ and interpret_exp_mut env exp (k : V.value V.cont) = and interpret_actor env ds fs k = let self = V.fresh_id () in - let self' = V.Blob self in let env0 = {env with self} in let ve = declare_decs ds V.Env.empty in let env' = adjoin_vals env0 ve in - interpret_decs env' ds (fun _ -> + let increments env = + env.actor_env := V.Env.add self (defined_fields env fs) !(env.actor_env) in + interpret_decs env' ~increments ds (fun _ -> let obj = interpret_fields env' fs in env.actor_env := V.Env.add self obj !(env.actor_env); - k self' + k (V.Blob self) ) and interpret_lexp env lexp (k : (V.value ref) V.cont) = @@ -605,6 +606,17 @@ and interpret_lexp env lexp (k : (V.value ref) V.cont) = ) ) +and defined_fields env fs = + let ve = + List.fold_left + (fun ve (f : field) -> + match V.Env.find_opt f.it.var env.vals with + | Some binding when Lib.Promise.is_fulfilled binding + -> V.Env.disjoint_add f.it.name (Lib.Promise.value binding) ve + | _ -> ve + ) V.Env.empty fs in + V.Obj ve + and interpret_fields env fs = let ve = List.fold_left @@ -801,10 +813,10 @@ and interpret_dec env dec k = k () ) -and interpret_decs env decs (k : unit V.cont) = +and interpret_decs env ?(increments=ignore) decs (k : unit V.cont) = match decs with | [] -> k () - | d::ds -> interpret_dec env d (fun () -> interpret_decs env ds k) + | d::ds -> interpret_dec env d (fun () -> increments env; interpret_decs env ds k) and interpret_func env at sort x args f c v (k : V.value V.cont) = if env.flags.trace then trace "%s%s" x (string_of_arg env v); diff --git a/test/run-drun/ok/pass-self.diff-ir.ok b/test/run-drun/ok/pass-self.diff-ir.ok deleted file mode 100644 index 0d67a8b204f..00000000000 --- a/test/run-drun/ok/pass-self.diff-ir.ok +++ /dev/null @@ -1,8 +0,0 @@ ---- pass-self.run -+++ pass-self.run-ir -@@ -1,4 +1,2 @@ - BEFORE! --ys6dh-5cjiq-5dc --So far so good! --pass-self.mo:14.12-14.19: execution error, accessing identifier before its definition -+pass-self.mo:9.12-9.23: execution error, Unknown actor "ID:1" diff --git a/test/run-drun/ok/pass-self.diff-low.ok b/test/run-drun/ok/pass-self.diff-low.ok deleted file mode 100644 index df0ba19b830..00000000000 --- a/test/run-drun/ok/pass-self.diff-low.ok +++ /dev/null @@ -1,8 +0,0 @@ ---- pass-self.run -+++ pass-self.run-low -@@ -1,4 +1,2 @@ - BEFORE! --ys6dh-5cjiq-5dc --So far so good! --pass-self.mo:14.12-14.19: execution error, accessing identifier before its definition -+pass-self.mo:9.12-9.23: execution error, Unknown actor "ID:1" diff --git a/test/run-drun/ok/pass-self.run-ir.ok b/test/run-drun/ok/pass-self.run-ir.ok index 693ecfbdfb9..5577a10c839 100644 --- a/test/run-drun/ok/pass-self.run-ir.ok +++ b/test/run-drun/ok/pass-self.run-ir.ok @@ -1,2 +1,4 @@ BEFORE! -pass-self.mo:9.12-9.23: execution error, Unknown actor "ID:1" +ys6dh-5cjiq-5dc +So far so good! +pass-self.mo:14.12-14.19: execution error, accessing identifier before its definition diff --git a/test/run-drun/ok/pass-self.run-low.ok b/test/run-drun/ok/pass-self.run-low.ok index 693ecfbdfb9..5577a10c839 100644 --- a/test/run-drun/ok/pass-self.run-low.ok +++ b/test/run-drun/ok/pass-self.run-low.ok @@ -1,2 +1,4 @@ BEFORE! -pass-self.mo:9.12-9.23: execution error, Unknown actor "ID:1" +ys6dh-5cjiq-5dc +So far so good! +pass-self.mo:14.12-14.19: execution error, accessing identifier before its definition diff --git a/test/run-drun/pass-self.mo b/test/run-drun/pass-self.mo index d7655d92f13..a1bb733dfdc 100644 --- a/test/run-drun/pass-self.mo +++ b/test/run-drun/pass-self.mo @@ -6,7 +6,7 @@ actor /*class () =*/ Self { debugPrint "BEFORE!"; ignore principalOfActor Self; - caller(Self.method); + //caller(Self.method); caller(method); debugPrint (debug_show(principalOfActor Self)); debugPrint "So far so good!";