@@ -1170,11 +1170,14 @@ impl<T: ModuleResolver, IO: Io> Evaluator<T, IO> {
11701170 acc. push_str ( & value. to_string ( ) ) ;
11711171 }
11721172 ast:: StringSegment :: Env ( env_var) => {
1173- acc. push_str ( & io_context:: current ( ) . env_var ( env_var) . map_err ( |_| {
1174- RuntimeError :: EnvNotFound (
1175- ( * get_token ( Shared :: clone ( & self . token_arena ) , token_id) ) . clone ( ) ,
1176- env_var. clone ( ) ,
1177- )
1173+ acc. push_str ( & io_context:: current ( ) . env_var ( env_var) . map_err ( |e| {
1174+ let token = ( * get_token ( Shared :: clone ( & self . token_arena ) , token_id) ) . clone ( ) ;
1175+ match e {
1176+ crate :: io:: IoError :: PermissionDenied ( msg) => {
1177+ RuntimeError :: Runtime ( token, msg. into_owned ( ) )
1178+ }
1179+ _ => RuntimeError :: EnvNotFound ( token, env_var. clone ( ) ) ,
1180+ }
11781181 } ) ?) ;
11791182 }
11801183 ast:: StringSegment :: Self_ => {
@@ -1314,11 +1317,12 @@ impl<T: ModuleResolver, IO: Io> Evaluator<T, IO> {
13141317 if expr_str == constants:: identifiers:: SELF {
13151318 acc. push_str ( & runtime_value. to_string ( ) ) ;
13161319 } else if let Some ( var) = expr_str. strip_prefix ( '$' ) {
1317- acc. push_str (
1318- & io_context:: current ( )
1319- . env_var ( var)
1320- . map_err ( |_| RuntimeError :: EnvNotFound ( ( * * token) . clone ( ) , var. into ( ) ) ) ?,
1321- ) ;
1320+ acc. push_str ( & io_context:: current ( ) . env_var ( var) . map_err ( |e| match e {
1321+ crate :: io:: IoError :: PermissionDenied ( msg) => {
1322+ RuntimeError :: Runtime ( ( * * token) . clone ( ) , msg. into_owned ( ) )
1323+ }
1324+ _ => RuntimeError :: EnvNotFound ( ( * * token) . clone ( ) , var. into ( ) ) ,
1325+ } ) ?) ;
13221326 } else {
13231327 let value = self . eval_debug_expr ( expr_str, token, env) ?;
13241328 acc. push_str ( & value. to_string ( ) ) ;
@@ -7930,10 +7934,9 @@ mod tests {
79307934 #[ case] program : Program ,
79317935 #[ case] expected : Result < Vec < RuntimeValue > , InnerError > ,
79327936 ) {
7933- assert_eq ! (
7934- Evaluator :: new( DefaultModuleLoader :: default ( ) , token_arena) . eval( & program, runtime_values. into_iter( ) ) ,
7935- expected
7936- ) ;
7937+ let mut evaluator = Evaluator :: new ( DefaultModuleLoader :: default ( ) , token_arena) ;
7938+ evaluator. set_io ( Shared :: new ( SandboxedIo :: new ( NativeIo :: default ( ) ) . allow_env ( true ) ) ) ;
7939+ assert_eq ! ( evaluator. eval( & program, runtime_values. into_iter( ) ) , expected) ;
79377940 }
79387941
79397942 #[ test]
@@ -8550,6 +8553,7 @@ mod debugger_tests {
85508553 #[ test]
85518554 fn test_logpoint_message_supports_literal_braces_and_env_vars ( ) {
85528555 let mut engine = crate :: DefaultEngine :: default ( ) ;
8556+ engine. set_io ( Shared :: new ( SandboxedIo :: new ( NativeIo :: default ( ) ) . allow_env ( true ) ) ) ;
85538557 let log_points = Shared :: new ( SharedCell :: new ( Vec :: new ( ) ) ) ;
85548558 engine. set_debugger_handler ( Box :: new ( RecordingDebuggerHandler {
85558559 breakpoint_hits : Shared :: default ( ) ,
0 commit comments