Even if a custom function does not mutate state nor cause side-effects, it may still be volatile, i.e. it depends on the external environment and is not pure.
A perfect example is a function that gets the current time – obviously each run will return a different value!
print(get_current_time(true)); // prints the current time // notice the call to 'get_current_time' // has constant arguments // The above, under full optimization level, is rewritten to: print("10:25AM"); // the function call is replaced by // its result at the time of optimization!
The optimizer, when using
OptimizationLevel::Full, merrily assumes that all functions are
non-volatile, so when it finds constant arguments (or none) it eagerly executes the function
call and replaces it with the result.
This causes the script to behave differently from the intended semantics.
OptimizationLevel::Full if volatile custom functions are involved.