# Side-Effect Considerations for Full Optimization Level

All of Rhai’s built-in functions (and operators which are implemented as functions) are pure (i.e. they do not mutate state nor cause any side-effects, with the exception of print and debug which are handled specially) so using OptimizationLevel::Full is usually quite safe unless custom types and functions are registered.

If custom functions are registered, they may be called (or maybe not, if the calls happen to lie within a pruned code block).

If custom functions are registered to overload built-in operators, they will also be called when the operators are used (in an if statement, for example) causing side-effects.

Therefore, the rule-of-thumb is:

• Always register custom types and functions after compiling scripts if OptimizationLevel::Full is used.

• DO NOT depend on knowledge that the functions have no side-effects, because those functions can change later on and, when that happens, existing scripts may break in subtle ways.