diff --git a/CHANGELOG.md b/CHANGELOG.md index e47dc084..dd5f5ab6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ Bug fixes Script-breaking changes ----------------------- -* _Strict Variables Mode_ no longer returns an error when an undeclared variable matches a constant in the provided external `Scope`. +* _Strict Variables Mode_ no longer returns an error when an undeclared variable matches a variable/constant in the provided external `Scope`. Enhancements ------------ diff --git a/src/parser.rs b/src/parser.rs index e33ece2b..72664a54 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1301,10 +1301,7 @@ impl Engine { if settings.options.strict_var && !settings.is_closure_scope && index.is_none() - && !matches!( - state.scope.get_index(name), - Some((_, AccessMode::ReadOnly)) - ) + && !state.scope.contains(name) { // If the parent scope is not inside another capturing closure // then we can conclude that the captured variable doesn't exist. @@ -1450,7 +1447,7 @@ impl Engine { if settings.options.strict_var && index.is_none() - && !matches!(state.scope.get_index(&s), Some((_, AccessMode::ReadOnly))) + && !state.scope.contains(&s) { return Err( PERR::VariableUndefined(s.to_string()).into_err(settings.pos) diff --git a/tests/options.rs b/tests/options.rs index aa9b250d..5725a76f 100644 --- a/tests/options.rs +++ b/tests/options.rs @@ -57,7 +57,7 @@ fn test_options_strict_var() -> Result<(), Box> { let mut engine = Engine::new(); let mut scope = Scope::new(); - scope.push_constant("x", 42 as INT); + scope.push("x", 42 as INT); scope.push_constant("y", 0 as INT); engine.compile("let x = if y { z } else { w };")?; @@ -114,8 +114,8 @@ fn test_options_strict_var() -> Result<(), Box> { } #[cfg(not(feature = "no_optimize"))] assert_eq!( - engine.eval_with_scope::(&mut scope, "fn foo(z) { x * y + z } foo(1)")?, - 1 + engine.eval_with_scope::(&mut scope, "fn foo(z) { y + z } foo(x)")?, + 42 ); }