diff --git a/src/optimizer.rs b/src/optimizer.rs index 5e19726e..2fcd06bb 100644 --- a/src/optimizer.rs +++ b/src/optimizer.rs @@ -1236,6 +1236,16 @@ fn optimize_top_level( optimization_level, ); + // Add constants from global modules + for (name, value) in engine + .global_modules + .iter() + .rev() + .flat_map(|m| m.iter_var()) + { + state.push_var(name, AccessMode::ReadOnly, Some(value.clone())); + } + // Add constants and variables from the scope for (name, constant, value) in scope.iter() { if !constant { diff --git a/tests/optimizer.rs b/tests/optimizer.rs index 351d91e5..3a203ac2 100644 --- a/tests/optimizer.rs +++ b/tests/optimizer.rs @@ -1,6 +1,6 @@ #![cfg(not(feature = "no_optimize"))] -use rhai::{Engine, EvalAltResult, OptimizationLevel, Scope, INT}; +use rhai::{Engine, EvalAltResult, Module, OptimizationLevel, Scope, INT}; #[test] fn test_optimizer() -> Result<(), Box> { @@ -74,6 +74,7 @@ fn test_optimizer_run() -> Result<(), Box> { #[test] fn test_optimizer_parse() -> Result<(), Box> { let mut engine = Engine::new(); + engine.set_optimization_level(OptimizationLevel::Simple); let ast = engine.compile("{ const DECISION = false; if DECISION { 42 } else { 123 } }")?; @@ -97,6 +98,22 @@ fn test_optimizer_parse() -> Result<(), Box> { assert_eq!(format!("{:?}", ast), "AST { body: [Expr(42 @ 1:1)] }"); + let ast = engine.compile("NUMBER")?; + + assert_eq!( + format!("{:?}", ast), + "AST { body: [Expr(Variable(NUMBER) @ 1:1)] }" + ); + + let mut module = Module::new(); + module.set_var("NUMBER", 42 as INT); + + engine.register_global_module(module.into()); + + let ast = engine.compile("NUMBER")?; + + assert_eq!(format!("{:?}", ast), "AST { body: [Expr(42 @ 1:1)] }"); + Ok(()) }