diff --git a/src/mo_interpreter/interpret.ml b/src/mo_interpreter/interpret.ml index 898ad4f8993..f5f0ff4293a 100644 --- a/src/mo_interpreter/interpret.ml +++ b/src/mo_interpreter/interpret.ml @@ -893,15 +893,20 @@ and interpret_obj env obj_sort self_id dec_fields (k : V.value V.cont) = let self' = V.Blob self in 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 - (* Define self_id when there is non-shadowing way to do it *) - (* FIXME: when non-shadow *) - let env' = match self_id with - | Some self -> adjoin_vals env' (declare_id self) - | _ -> env' in - Option.iter (fun id -> define_id env' id self') self_id; - let increments () = (* FIXME: shadowing? *) - let fulfilled = V.Env.filter (fun _ -> Lib.Promise.is_fulfilled) ve_ex in - env.actor_env := V.Env.add self V.(Obj (Env.map Lib.Promise.value fulfilled)) !(env.actor_env) + (* Define self_id in inner scope if there is a non-shadowing way to do it *) + let env', increments = + if match self_id with | None -> false | Some self -> V.Env.mem self.it ve_in + then env', ignore (* would shadow *) + else begin + let env' = match self_id with + | Some self -> adjoin_vals env' (declare_id self) + | _ -> env' in + Option.iter (fun id -> define_id env' id self') self_id; + let increments () = + let fulfilled = V.Env.filter (fun _ -> Lib.Promise.is_fulfilled) ve_ex in + env.actor_env := V.Env.add self V.(Obj (Env.map Lib.Promise.value fulfilled)) !(env.actor_env) in + env', increments + end in interpret_dec_fields env' ~increments dec_fields ve_ex (fun obj ->