@@ -27,6 +27,8 @@ r_obj* ffi_env_get(r_obj* env,
2727 return env_get_sym (env , sym , c_inherit , last , closure_env );
2828}
2929
30+ // This util is a little more complex than it would be by calling `getVar()`
31+ // directly because it evaluates `default` lazily
3032static
3133r_obj * env_get_sym (r_obj * env ,
3234 r_obj * sym ,
@@ -37,25 +39,19 @@ r_obj* env_get_sym(r_obj* env,
3739 r_abort ("`last` must be an environment." );
3840 }
3941
40- r_obj * out ;
42+ bool unbound ;
4143 if (inherit ) {
4244 if (last == r_null ) {
43- out = r_env_find_anywhere (env , sym );
45+ unbound = ! r_env_has_anywhere (env , sym );
4446 } else {
45- out = r_env_find_until (env , sym , last );
47+ unbound = ! r_env_has_until (env , sym , last );
4648 }
4749 } else {
48- out = r_env_find (env , sym );
50+ unbound = ! r_env_has (env , sym );
4951 }
5052
51- if (r_typeof (out ) == R_TYPE_promise ) {
52- KEEP (out );
53- out = r_eval (out , r_envs .empty );
54- FREE (1 );
55- }
56-
57- if (out == r_syms .unbound ) {
58- if (r_env_find (closure_env , r_sym ("default" )) == r_missing_arg ) {
53+ if (unbound ) {
54+ if (r_env_has_missing (closure_env , r_sym ("default" ))) {
5955 struct r_pair args [] = {
6056 { r_sym ("nm" ), KEEP (r_str_as_character (r_sym_string (sym ))) }
6157 };
@@ -67,10 +63,18 @@ r_obj* env_get_sym(r_obj* env,
6763 r_stop_unreachable ();
6864 }
6965
70- out = r_eval (r_sym ("default" ), closure_env );
66+ return r_eval (r_sym ("default" ), closure_env );
7167 }
7268
73- return out ;
69+ if (inherit ) {
70+ if (last == r_null ) {
71+ return r_env_get_anywhere (env , sym );
72+ } else {
73+ return r_env_get_until (env , sym , last );
74+ }
75+ } else {
76+ return r_env_get (env , sym );
77+ }
7478}
7579
7680r_obj * ffi_env_get_list (r_obj * env ,
@@ -145,42 +149,46 @@ static void env_poke_lazy(r_obj* env, r_obj* sym, r_obj* value, r_obj* eval_env)
145149static void env_poke_active (r_obj * env , r_obj * sym , r_obj * fn , r_obj * eval_env );
146150static r_obj * env_get (r_obj * env , r_obj * sym );
147151
148- r_obj * ffi_env_poke (r_obj * env , r_obj * nm , r_obj * value , r_obj * inherit , r_obj * create ) {
152+ r_obj * ffi_env_poke (r_obj * env , r_obj * nm , r_obj * value , r_obj * ffi_inherit , r_obj * ffi_create ) {
149153 if (r_typeof (env ) != R_TYPE_environment ) {
150154 r_abort ("`env` must be an environment." );
151155 }
152156 if (!r_is_string (nm )) {
153157 r_abort ("`nm` must be a string." );
154158 }
155- if (!r_is_bool (inherit )) {
159+ if (!r_is_bool (ffi_inherit )) {
156160 r_abort ("`inherit` must be a logical value." );
157161 }
158- if (!r_is_bool (create )) {
162+ if (!r_is_bool (ffi_create )) {
159163 r_abort ("`create` must be a logical value." );
160164 }
161165
162- bool c_inherit = r_lgl_get (inherit , 0 );
163- bool c_create = r_lgl_get (create , 0 );
166+ bool inherit = r_lgl_get (ffi_inherit , 0 );
167+ bool create = r_lgl_get (ffi_create , 0 );
164168 r_obj * sym = r_str_as_symbol (r_chr_get (nm , 0 ));
165169
166- r_obj * old ;
167- if (c_inherit ) {
168- old = r_env_find_anywhere (env , sym );
170+ bool unbound ;
171+ if (inherit ) {
172+ unbound = ! r_env_has_anywhere (env , sym );
169173 } else {
170- old = r_env_find (env , sym );
174+ unbound = ! r_env_has (env , sym );
171175 }
172176
173- bool absent = ( old == r_syms . unbound ) ;
174- if (absent ) {
175- if (!c_create ) {
177+ r_obj * old ;
178+ if (unbound ) {
179+ if (!create ) {
176180 r_abort ("Can't find existing binding in `env` for \"%s\"." ,
177181 r_sym_c_string (sym ));
178182 }
179183 old = rlang_zap ;
184+ } else if (inherit ) {
185+ old = r_env_get_anywhere (env , sym );
186+ } else {
187+ old = r_env_get (env , sym );
180188 }
181189 KEEP (old );
182190
183- if (c_inherit && !absent ) {
191+ if (inherit && !unbound ) {
184192 while (env != r_envs .empty ) {
185193 if (r_env_has (env , sym )) {
186194 break ;
@@ -322,17 +330,13 @@ void env_poke_active(r_obj* env, r_obj* sym, r_obj* fn, r_obj* eval_env) {
322330
323331static
324332r_obj * env_get (r_obj * env , r_obj * sym ) {
325- r_obj * out = r_env_find (env , sym );
326-
327- if (out == r_syms .unbound ) {
333+ if (!r_env_has (env , sym )) {
328334 return rlang_zap ;
329335 }
330336
331- if (r_typeof (out ) == R_TYPE_promise ) {
332- KEEP (out );
333- out = r_eval (out , r_envs .base );
334- FREE (1 );
337+ if (r_env_has_missing (env , sym )) {
338+ return r_missing_arg ;
335339 }
336340
337- return out ;
341+ return r_env_get ( env , sym ) ;
338342}
0 commit comments