diff --git a/CHANGELOG.md b/CHANGELOG.md index 90425e73..6586b38f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,20 @@ Enhancements * `StaticVec` is changed to keep three items inline instead of four. +Version 1.0.6 +============= + + +Version 1.0.5 +============= + +Bug fixes +--------- + +* `FloatWrapper` is no longer erroneously exported under `no_float+internals`. +* The `sign` function now works properly for float values that are `NaN`. + + Version 1.0.4 ============= diff --git a/codegen/ui_tests/rhai_fn_non_clonable_return.stderr b/codegen/ui_tests/rhai_fn_non_clonable_return.stderr index f2733fce..21e23630 100644 --- a/codegen/ui_tests/rhai_fn_non_clonable_return.stderr +++ b/codegen/ui_tests/rhai_fn_non_clonable_return.stderr @@ -2,7 +2,10 @@ error[E0277]: the trait bound `NonClonable: Clone` is not satisfied --> $DIR/rhai_fn_non_clonable_return.rs:11:8 | 11 | pub fn test_fn(input: f32) -> NonClonable { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `NonClonable` + | ^^^^^^^^^^^^^^^^^^^^^^^----------- + | | | + | | required by a bound introduced by this call + | the trait `Clone` is not implemented for `NonClonable` | note: required by a bound in `rhai::Dynamic::from` --> $DIR/dynamic.rs:1121:30 diff --git a/codegen/ui_tests/rhai_mod_non_clonable_return.stderr b/codegen/ui_tests/rhai_mod_non_clonable_return.stderr index 122d2b26..772a5112 100644 --- a/codegen/ui_tests/rhai_mod_non_clonable_return.stderr +++ b/codegen/ui_tests/rhai_mod_non_clonable_return.stderr @@ -2,7 +2,10 @@ error[E0277]: the trait bound `NonClonable: Clone` is not satisfied --> $DIR/rhai_mod_non_clonable_return.rs:12:12 | 12 | pub fn test_fn(input: f32) -> NonClonable { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `NonClonable` + | ^^^^^^^^^^^^^^^^^^^^^^^----------- + | | | + | | required by a bound introduced by this call + | the trait `Clone` is not implemented for `NonClonable` | note: required by a bound in `rhai::Dynamic::from` --> $DIR/dynamic.rs:1121:30 diff --git a/src/lib.rs b/src/lib.rs index f3a0af66..9d4c25c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -229,10 +229,15 @@ pub use token::{InputStream, Token, TokenizeState, TokenizerControl, TokenizerCo #[cfg(feature = "internals")] #[deprecated = "this type is volatile and may change"] pub use ast::{ - ASTNode, BinaryExpr, CustomExpr, Expr, FloatWrapper, FnCallExpr, FnCallHashes, Ident, - OpAssignment, OptionFlags, ScriptFnDef, Stmt, StmtBlock, AST_OPTION_FLAGS::*, + ASTNode, BinaryExpr, CustomExpr, Expr, FnCallExpr, FnCallHashes, Ident, OpAssignment, + OptionFlags, ReturnType, ScriptFnDef, Stmt, StmtBlock, AST_OPTION_FLAGS::*, }; +#[cfg(feature = "internals")] +#[cfg(not(feature = "no_float"))] +#[deprecated = "this type is volatile and may change"] +pub use ast::FloatWrapper; + #[cfg(feature = "internals")] #[deprecated = "this type is volatile and may change"] pub use engine::{EvalState, FnResolutionCache, FnResolutionCacheEntry, Imports}; diff --git a/src/packages/arithmetic.rs b/src/packages/arithmetic.rs index 074b19cf..66c05978 100644 --- a/src/packages/arithmetic.rs +++ b/src/packages/arithmetic.rs @@ -163,13 +163,7 @@ macro_rules! gen_signed_functions { } } pub fn sign(x: $arg_type) -> INT { - if x == 0 { - 0 - } else if x < 0 { - -1 - } else { - 1 - } + x.signum() as INT } } })* } @@ -249,6 +243,8 @@ gen_signed_functions!(signed_num_128 => i128); #[cfg(not(feature = "no_float"))] #[export_module] mod f32_functions { + use crate::EvalAltResult; + #[cfg(not(feature = "f32_float"))] pub mod basic_arithmetic { #[rhai_fn(name = "+")] @@ -329,13 +325,15 @@ mod f32_functions { pub fn abs(x: f32) -> f32 { x.abs() } - pub fn sign(x: f32) -> INT { + #[rhai_fn(return_raw)] + pub fn sign(x: f32) -> Result> { if x == 0.0 { - 0 - } else if x < 0.0 { - -1 + Ok(0) } else { - 1 + match x.signum() { + x if x.is_nan() => Err(make_err("Sign of NaN is undefined")), + x => Ok(x as INT), + } } } pub fn is_zero(x: f32) -> bool { @@ -437,13 +435,15 @@ mod f64_functions { pub fn abs(x: f64) -> f64 { x.abs() } - pub fn sign(x: f64) -> INT { + #[rhai_fn(return_raw)] + pub fn sign(x: f64) -> Result> { if x == 0.0 { - 0 - } else if x < 0.0 { - -1 + Ok(0) } else { - 1 + match x.signum() { + x if x.is_nan() => Err(make_err("Sign of NaN is undefined")), + x => Ok(x as INT), + } } } pub fn is_zero(x: f64) -> bool { diff --git a/src/scope.rs b/src/scope.rs index 323d78fd..028287a5 100644 --- a/src/scope.rs +++ b/src/scope.rs @@ -464,6 +464,9 @@ impl<'a> Scope<'a> { /// *ptr = 123_i64.into(); /// /// assert_eq!(my_scope.get_value::("x").expect("x should exist"), 123); + /// + /// my_scope.push_constant("Z", 1_i64); + /// assert!(my_scope.get_mut("Z").is_none()); /// ``` #[inline] #[must_use]