Skip to content

Releases: rhaiscript/rhai

v1.21.0

25 Jan 05:22
a85b9c1
Compare
Choose a tag to compare

Bug fixes

  • Fixed bug in raw strings (thanks @benatkin 944).
  • get_fn_metadata_list function is marked volatile.
  • no-std plus sync should now build correctly (thanks stargazing-dino 947).

New Features

  • It is possible to create a function pointer (FnPtr) which binds to a native Rust function or closure via FnPtr::from_dn and FnPtr::from_dyn_fn. When called in script, the embedded function will be called (thanks @makspll 952).

Enhancements

  • The methods call_fn, call_native_fn, call_fn_raw and call_native_fn_raw are added to EvalContext (thanks @rawhuul 954).
  • A new internals function, Engine::collect_fn_metadata, is added to collect all functions metadata. This is to facilitate better error reporting for missing functions (thanks therealprof 945).

v1.20.1

13 Dec 02:06
42d35a3
Compare
Choose a tag to compare

Version 1.20.1

This is a bug fix release.

Bug fixes

  • Fixed bug in raw strings with newlines (thanks @benatkin 940).

Enhancements

  • If a string slice refers to the entire string, the slice is not cloned but returned as-is.

v1.20.0

02 Nov 02:42
801c2ad
Compare
Choose a tag to compare

Bug fixes

  • (Fuzzing) An integer-overflow bug from an inclusive range in the bits iterator is fixed.
  • (Fuzzing) An integer-underflow bug from an inclusive range is fixed.
  • Copy strings if the strings interner is busy instead of panicing (thanks @irevoire 917).
  • Deserialization of Scope now works correctly (thanks @AngelicosPhosphoros 918).
  • Support for thumbv6m target is fixed (thanks chxry 919)

New features

  • Added support for raw strings with the syntax ##..#" ... "#..## (thanks @cellomath 908 910).

Enhancements

  • New as_immutable_string_ref, as_array_ref, as_blob_ref, as_map_ref plus their _mut variants for Dynamic (thanks @madonuko 904).
  • The break, return and throw statements can now be simply used as switch case statement expressions. Previously it is required that the statement be wrapped in a block.

v1.19.0

30 Jun 13:08
68e409f
Compare
Choose a tag to compare

Bug fixes

  • Variable resolver now correctly resolves variables that are captured in a closure.
  • NativeCallContext<'_> (with a lifetime parameter) now parses correctly in the #[export_module] macro. This is to allow for rust_2018_idioms lints (thanks @ltabis 864).
  • The sync feature now works properly in no-std builds (thanks @misssonder 874).
  • More data-race conditions are caught and returned as errors instead of panicking.
  • Missing min and max functions where both operands are floats or Decimal are added.
  • Fixed stack overflow when calling closures recursively (thanks @MageWeiG 880).
  • Engine::call_fn and Engine::call_fn_with_options now correctly use the AST's source field.
  • (Fuzzing) Fixed crash when using ..= in strings.
  • (Fuzzing) A recursive stack-overflow bug in Dynamic::is_hashable is fixed.

New features

  • The break, continue, return and throw statements can now follow the ?? operator to short-circuit operations where the value is ().
  • A new symbol, $func$, is added to custom syntax to allow parsing of anonymous functions.
  • The filter, drain and retain methods are added to object maps.

v1.18.0

12 Apr 05:15
5f2f243
Compare
Choose a tag to compare

Starting from this version, we try to put contributors' names on features/enhancements/fixes that they contributed.

We apologize for neglecting to adopt this practice earlier, but late is better than never!

Bug fixes

  • The position of an undefined operation call now points to the operator instead of the first operand.
  • The optimize command in rhai-repl now works properly and cycles through None->Simple->Full.
  • Engine::call_fn_XXX no longer return errors unnecessarily wrapped in EvalAltResult::ErrorInFunctionCall.
  • Some tests that panic on 32-bit architecture are fixed (thanks @alexanderkjall #851).
  • The optimizer no longer goes into an infinite loop when optimizing a try statement with an empty body.

Deprecated API's

  • The plugin macros export_fn, register_exported_fn!, set_exported_fn! and set_exported_global_fn! are deprecated because they do not add value over existing direct API's.

New features

  • Sub-strings can now be selected from full strings by indexing via ranges, e.g. s[1..4] (thanks @zitsen #845).
  • Doc-comments are now automatically added to function registrations and custom types via the CustomType derive macro (thanks @Itabis #847).
  • New options Engine::set_max_strings_interned and Engine::max_strings_interned are added to limit the maximum number of strings interned in the Engine's string interner.
  • A new advanced callback, Engine::on_invalid_array_index, is added (gated under the internals feature) to handle access to missing properties in object maps.
  • A new advanced callback, Engine::on_missing_map_property, is added (gated under the internals feature) to handle out-of-bound index into arrays.

Enhancements

  • parse_json is also available without the metadata or serde feature -- it uses Engine::parse_json to parse the JSON text (thanks @Mathieu-Lala #840).
  • FuncRegistration::in_global_namespace and FuncRegistration::in_internal_namespace are added to avoid pulling in FnNamespace.
  • Array/BLOB/string iterators are defined also within the BasicIteratorPackage in addition to the regular array/BLOB/string packages.
  • LexError::Runtime is added for use with Engine::on_parse_token.
  • Shared values under sync are now handled more elegantly -- instead of deadlocking and hanging indefinitely, it spins for a number of tries (waiting one second between each), then errors out.

v1.17.1

02 Feb 01:21
28c0f96
Compare
Choose a tag to compare

This is a bug-fix release that bumps rhai_codegen version to 2.0.0 to satisfy semver rules.

v1.17.0

31 Jan 03:30
f97fbcb
Compare
Choose a tag to compare

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.

v1.16.3

31 Oct 02:09
Compare
Choose a tag to compare

Public fields of VarDefInfo are marked deprecated but still accessible.

v1.16.2

24 Sep 07:23
Compare
Choose a tag to compare

Fixes compilation error when importing multiple modules.

v1.16.1

11 Sep 05:26
98a1f85
Compare
Choose a tag to compare

Fixes compilation error when using the serde feature with metadata.