diff --git a/src/ir_interpreter/interpret_ir.ml b/src/ir_interpreter/interpret_ir.ml index e62d8949123..8845511b529 100644 --- a/src/ir_interpreter/interpret_ir.ml +++ b/src/ir_interpreter/interpret_ir.ml @@ -315,10 +315,7 @@ and interpret_exp_mut env exp (k : V.value V.cont) = | None -> trap exp.at "accessing identifier before its definition" ) | LitE lit -> - k (interpret_lit env lit) - | PrimE (ActorDotPrim n, [{ it = VarE (_, actor); _ }]) when not(Lib.Promise.is_fulfilled (find actor env.vals)) -> - (* actor not defined yet, just pair them up *) - k V.(Tup [Blob (env.self); Text n]) + k (interpret_lit env lit) | PrimE (p, es) -> interpret_exps env es [] (fun vs -> match p, vs with @@ -582,13 +579,13 @@ 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 env0 = {env with self} in + let self' = V.Blob self in let ve = declare_decs ds V.Env.empty in - let env' = adjoin_vals env0 ve in + let env' = adjoin_vals { env with self } ve in interpret_decs env' ds (fun _ -> let obj = interpret_fields env' fs in env.actor_env := V.Env.add self obj !(env.actor_env); - k (V.Blob self) + k self' ) and interpret_lexp env lexp (k : (V.value ref) V.cont) = @@ -686,7 +683,6 @@ and declare_pats pats ve : val_env = let ve' = declare_pat pat in declare_pats pats' (V.Env.adjoin ve ve') - and define_id env id v = Lib.Promise.fulfill (find id env.vals) v diff --git a/src/lowering/desugar.ml b/src/lowering/desugar.ml index b4e943bde7d..9850f53aedd 100644 --- a/src/lowering/desugar.ml +++ b/src/lowering/desugar.ml @@ -90,8 +90,8 @@ and exp' at note = function (breakE "!" (nullE())) (* case ? v : *) (varP v) (varE v) ty).it - | S.ObjBlockE (s, _t, dfs) -> - obj_block at s None dfs note.Note.typ + | S.ObjBlockE (s, (self_id_opt,_), dfs) -> + obj_block at s self_id_opt dfs note.Note.typ | S.ObjE (bs, efs) -> obj note.Note.typ efs bs | S.TagE (c, e) -> (tagE c.it (exp e)).it @@ -562,7 +562,8 @@ and build_actor at ts self_id es obj_typ = [expD (assignE state (nullE()))] in let ds' = match self_id with - | Some n -> with_self n.it obj_typ ds + | Some n -> + with_self n.it obj_typ ds | None -> ds in let meta = I.{ candid = candid; diff --git a/src/mo_interpreter/interpret.ml b/src/mo_interpreter/interpret.ml index 0164d0b641e..ec3a30736cb 100644 --- a/src/mo_interpreter/interpret.ml +++ b/src/mo_interpreter/interpret.ml @@ -787,6 +787,9 @@ and declare_pat_fields pfs ve : val_env = let ve' = declare_pat pf.it.pat in declare_pat_fields pfs' (V.Env.adjoin ve ve') +and declare_defined_id id v = + V.Env.singleton id.it (Lib.Promise.make_fulfilled v) + and define_id env id v = define_id' env id.it v @@ -898,9 +901,8 @@ and interpret_obj env obj_sort self_id dec_fields (k : V.value V.cont) = let self' = V.Blob self in (* Define self_id eagerly *) let env' = match self_id with - | Some id -> adjoin_vals env (declare_id id) + | Some id -> adjoin_vals env (declare_defined_id id self') | None -> env in - Option.iter (fun id -> define_id env' id self') self_id; let ve_ex, ve_in = declare_dec_fields dec_fields V.Env.empty V.Env.empty in let env'' = adjoin_vals { env' with self } ve_in in interpret_dec_fields env'' dec_fields ve_ex diff --git a/test/run-drun/ok/pass-class-self.diff-ir.ok b/test/run-drun/ok/pass-class-self.diff-ir.ok index 28c1f98e185..7743c8432a6 100644 --- a/test/run-drun/ok/pass-class-self.diff-ir.ok +++ b/test/run-drun/ok/pass-class-self.diff-ir.ok @@ -1,4 +1,5 @@ --- pass-class-self.run +++ pass-class-self.run-ir -@@ -0,0 +1 @@ +@@ -0,0 +1,2 @@ +Before! ++ys6dh-5cjiq-5dc diff --git a/test/run-drun/ok/pass-class-self.diff-low.ok b/test/run-drun/ok/pass-class-self.diff-low.ok index b3d286b58c7..f25dd758737 100644 --- a/test/run-drun/ok/pass-class-self.diff-low.ok +++ b/test/run-drun/ok/pass-class-self.diff-low.ok @@ -1,4 +1,5 @@ --- pass-class-self.run +++ pass-class-self.run-low -@@ -0,0 +1 @@ +@@ -0,0 +1,2 @@ +Before! ++ys6dh-5cjiq-5dc diff --git a/test/run-drun/ok/pass-class-self.drun-run.ok b/test/run-drun/ok/pass-class-self.drun-run.ok index 2995727c5e0..55cb2b31f78 100644 --- a/test/run-drun/ok/pass-class-self.drun-run.ok +++ b/test/run-drun/ok/pass-class-self.drun-run.ok @@ -1,3 +1,4 @@ ingress Completed: Reply: 0x4449444c016c01b3c4b1f204680100010a00000000000000000101 debug.print: Before! +debug.print: rwlgt-iiaaa-aaaaa-aaaaa-cai ingress Completed: Reply: 0x4449444c0000 diff --git a/test/run-drun/ok/pass-class-self.run-ir.ok b/test/run-drun/ok/pass-class-self.run-ir.ok index fda743ffda9..59d2a28d5f8 100644 --- a/test/run-drun/ok/pass-class-self.run-ir.ok +++ b/test/run-drun/ok/pass-class-self.run-ir.ok @@ -1 +1,2 @@ Before! +ys6dh-5cjiq-5dc diff --git a/test/run-drun/ok/pass-class-self.run-low.ok b/test/run-drun/ok/pass-class-self.run-low.ok index fda743ffda9..59d2a28d5f8 100644 --- a/test/run-drun/ok/pass-class-self.run-low.ok +++ b/test/run-drun/ok/pass-class-self.run-low.ok @@ -1 +1,2 @@ Before! +ys6dh-5cjiq-5dc diff --git a/test/run-drun/ok/pass-class-self.tc.ok b/test/run-drun/ok/pass-class-self.tc.ok new file mode 100644 index 00000000000..6e895e23ed2 --- /dev/null +++ b/test/run-drun/ok/pass-class-self.tc.ok @@ -0,0 +1 @@ +pass-class-self.mo:11.5-11.58: warning [M0089], redundant ignore, operand already has type () diff --git a/test/run-drun/pass-class-self.mo b/test/run-drun/pass-class-self.mo index 4777aabb58b..551b47890b5 100644 --- a/test/run-drun/pass-class-self.mo +++ b/test/run-drun/pass-class-self.mo @@ -8,6 +8,5 @@ actor class C() = Self { ignore principalOfActor Self; caller(Self.method); caller(method); - //debugPrint (debug_show(principalOfActor Self)); // See #4733 - //debugPrint "So far so good!"; + ignore debugPrint (debug_show(principalOfActor Self)); }