Skip to content

v1.17.0

Compare
Choose a tag to compare
@schungx schungx released this 31 Jan 03:30
· 149 commits to main since this release
f97fbcb

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 and ConditionalExpr are now gated under internals.
  • 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 in rhai_codegen.
  • A new FuncRegistration API is added to assist in registering native Rust functions into modules with various settings. Some of the original Module::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 under OptimizationLevel::Full.
  • Added Engine::max_functions and Engine::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. When max_function is exceeded during script compilation, a new parse error, ParseErrorType::TooManyFunctions, is returned.
  • Engine::get_interned_string is made public instead of gated under internals.

Deprecated API's

  • rhai::config::hashing::set_ahash_seed, rhai::config::hashing::get_ahash_seed and the RHAI_AHASH_SEED environment variable are deprecated in favor of rhai::config::hashing::set_hashing_seed, rhai::config::hashing::get_hashing_seed and RHAI_HASHING_SEED.
  • AST::clear_doc is deprecated.
  • Much of the Module::update_XXX API is deprecated in favor of using the FuncRegistration API.
  • Module::gen_fn_signatures is deprecated in favor of Module::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 on NaN.
  • switch on ranges now work properly.

Other bug fixes

  • Arrays in object maps now serialize to JSON correctly via to_json() when the serde 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 and Token::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 and Scope::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.