v1.17.0
Starting from this version, the official preferred method of registering an API for a custom type is via the #[derive(CustomType)]
macro. The old API is still available for types that reside in external crates (and thus cannot implement CustomType
).
Starting from this version, the new FuncRegistration
API is preferred for registering native Rust functions into a Module
. The old API is still available but deprecated.
Starting from this version, fuzzing via Google OSS-Fuzz is used to flush out hidden bugs and edge cases. This should result in higher code quality, better stability and improved security. And indeed, a large number of bugs have been discovered from this and fixed.
Potentially breaking changes
ImmutableString
now derefs to&str
instead of&SmartString
. Normally this should not be a breaking change.- Traits implemented by
ImmutableString
are cleaned up. Normally this should not be a breaking change. EvalContext::new
,FloatWrapper
andConditionalExpr
are now gated underinternals
.- Previously, Rhai follows Unicode's definition for whitespace, which allows many exotic whitespace characters in scripts. Starting from this version, whitespace follows WhatWG's definition of five ASCII characters (TAB, SPACE, CR, LF and FF), which is the same as Rust. All other Unicode whitespace characters (not inside strings) are not considered whitespace by Rhai. If a script used to contain non-ASCII whitespace characters, it now fails to parse with a syntax error.
New features
#[derive(CustomType)]
is now available, driven by procedural macros inrhai_codegen
.- A new
FuncRegistration
API is added to assist in registering native Rust functions into modules with various settings. Some of the originalModule::set_fn...
API is now deprecated. - Functions defined in plugin modules can now be marked as
volatile
which prevents it from being optimized away even underOptimizationLevel::Full
. - Added
Engine::max_functions
andEngine::set_max_functions
to limit the maximum number of functions allowed in a script. This is to guard against DOS attacks -- e.g. a simple closure||
(two characters) is a function. Whenmax_function
is exceeded during script compilation, a new parse error,ParseErrorType::TooManyFunctions
, is returned. Engine::get_interned_string
is made public instead of gated underinternals
.
Deprecated API's
rhai::config::hashing::set_ahash_seed
,rhai::config::hashing::get_ahash_seed
and theRHAI_AHASH_SEED
environment variable are deprecated in favor ofrhai::config::hashing::set_hashing_seed
,rhai::config::hashing::get_hashing_seed
andRHAI_HASHING_SEED
.AST::clear_doc
is deprecated.- Much of the
Module::update_XXX
API is deprecated in favor of using theFuncRegistration
API. Module::gen_fn_signatures
is deprecated in favor ofModule::gen_fn_signatures_with_mapper
.
Fixes to bugs found via fuzzing
- Fixed crash when parsing multi-segment interpolated string longer than maximum.
- Fixed crash when parsing unterminated comment.
- Fixed crash when parsing deeply-nested right-associated operators such as
**
. - Fixed crash when parsing combo-chaining expressions such as
(a.b).c
. - Fixed crash when calling functions that have
Dynamic
parameters with more than 16 parameters. - Fixed crash when indexing into an empty array with negative index.
- Indexing into an array with a negative index that is larger than the length of the array now throws an out-of-bounds error (similar to positive indices) instead of defaulting to the first element.
- Fixed edge-case crash in timestamp functions.
- Fixed crash when indenting a block doc-comment with Unicode multi-byte space characters.
- Fixed improper parsing of numbers with too many decimal points.
- Fixed exponential running time when raising a decimal number to a very large power (> 1 million) -- it now returns an overflow error.
- Shared values that contain reference loops no longer cause a stack overflow when printing.
sleep
no longer panics onNaN
.switch
on ranges now work properly.
Other bug fixes
- Arrays in object maps now serialize to JSON correctly via
to_json()
when theserde
feature is not enabled. Engine::format_map_as_json
now serializes arrays correctly.Engine::gen_fn_signatures(false)
now properly skips functions in the standard library.TypeBuilder::with_name
now properly sets the display-name of the type for use in generating metadata.
Enhancements
- Avoid cloning values unless needed when performing constants propagation in optimization.
- Added
to_int
method for characters. Token::FloatConstant
andToken::DecimalConstant
now carry the original text representation for use in, say, a token mapper.Dynamic::is_fnptr
is made a public API.Scope::get_value_ref
andScope::get_value_mut
are added.TypeBuilder::with_name
now takes any&str
instead of just&'static str
.Engine::gen_fn_signatures
now formats the function signatures using pretty-print names of custom types.