Skip to content

Commit

Permalink
Merge pull request #479 from schungx/v1.1-fixes
Browse files Browse the repository at this point in the history
V1.1 fixes
  • Loading branch information
schungx committed Nov 5, 2021
2 parents bbb9038 + eeca8c9 commit c21fb23
Show file tree
Hide file tree
Showing 23 changed files with 146 additions and 44 deletions.
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@
Rhai Release Notes
==================

Version 1.1.3
=============

Bug fixes
---------

* Reverses a regression on string `+` operations.
* The global namespace is now searched before packages, which is the correct behavior.


Version 1.1.2
=============

Bug fixes
---------

* `0.0` now prints correctly (used to print `0e0`).
* Unary operators are now properly recognized as an expression statement.


Version 1.1.1
=============

Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ members = [".", "codegen"]

[package]
name = "rhai"
version = "1.1.1"
version = "1.1.2"
edition = "2018"
authors = ["Jonathan Turner", "Lukáš Hozda", "Stephen Chung", "jhwgh1968"]
description = "Embedded scripting for Rust"
Expand Down
4 changes: 3 additions & 1 deletion src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1825,7 +1825,9 @@ impl<F: Float + fmt::Debug> fmt::Debug for FloatWrapper<F> {
impl<F: Float + fmt::Display + fmt::LowerExp + From<f32>> fmt::Display for FloatWrapper<F> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let abs = self.0.abs();
if abs > Self::MAX_NATURAL_FLOAT_FOR_DISPLAY.into()
if abs.fract().is_zero() {
f.write_str("0.0")
} else if abs > Self::MAX_NATURAL_FLOAT_FOR_DISPLAY.into()
|| abs < Self::MIN_NATURAL_FLOAT_FOR_DISPLAY.into()
{
write!(f, "{:e}", self.0)
Expand Down
1 change: 1 addition & 0 deletions src/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2970,6 +2970,7 @@ impl Engine {
// Create automatic global module
let mut global = Module::new();
global.internal = true;
global.standard = false;
mods.push(KEYWORD_GLOBAL, global);
Some(mods.get_mut(mods.len() - 1).expect("global module exists"))
};
Expand Down
11 changes: 6 additions & 5 deletions src/engine_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,16 @@ impl Engine {
#[allow(dead_code)]
pub(crate) fn global_namespace(&self) -> &Module {
self.global_modules
.last()
.first()
.expect("global_modules contains at least one module")
}
/// Get a mutable reference to the global namespace module
/// (which is the last module in `global_modules`).
/// (which is the first module in `global_modules`).
#[inline(always)]
pub(crate) fn global_namespace_mut(&mut self) -> &mut Module {
Shared::get_mut(
self.global_modules
.last_mut()
.first_mut()
.expect("global_modules contains at least one module"),
)
.expect("global namespace module is never shared")
Expand Down Expand Up @@ -895,8 +895,9 @@ impl Engine {
/// modules are searched in reverse order.
#[inline(always)]
pub fn register_global_module(&mut self, module: Shared<Module>) -> &mut Self {
// Insert the module into the front
self.global_modules.insert(0, module);
// Insert the module into the front.
// The first module is always the global namespace.
self.global_modules.insert(1, module);
self
}
/// Register a shared [`Module`] as a static module namespace with the [`Engine`].
Expand Down
2 changes: 1 addition & 1 deletion src/fn_call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,7 @@ impl Engine {

// First check script-defined functions
let result = lib.iter().any(|&m| m.contains_fn(hash_script))
// Then check packages
// Then check the global namespace and packages
|| self.global_modules.iter().any(|m| m.contains_fn(hash_script))
// Then check imported modules
|| mods.map_or(false, |m| m.contains_fn(hash_script))
Expand Down
3 changes: 3 additions & 0 deletions src/module/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,8 @@ pub struct Module {
id: Option<Identifier>,
/// Is this module internal?
pub(crate) internal: bool,
/// Is this module part of a standard library?
pub(crate) standard: bool,
/// Sub-modules.
modules: BTreeMap<Identifier, Shared<Module>>,
/// [`Module`] variables.
Expand Down Expand Up @@ -246,6 +248,7 @@ impl Module {
Self {
id: None,
internal: false,
standard: false,
modules: Default::default(),
variables: Default::default(),
all_variables: Default::default(),
Expand Down
9 changes: 5 additions & 4 deletions src/optimize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,13 @@ impl<'a> OptimizerState<'a> {
.map(|(v, _)| v)
}
// Has a system function a Rust-native override?
pub fn has_native_fn(&self, hash_script: u64, arg_types: &[TypeId]) -> bool {
pub fn has_native_fn_override(&self, hash_script: u64, arg_types: &[TypeId]) -> bool {
let hash_params = calc_fn_params_hash(arg_types.iter().cloned());
let hash = combine_hashes(hash_script, hash_params);

// First check packages
self.engine.global_modules.iter().any(|m| m.contains_fn(hash))
// First check the global namespace and packages, but skip modules that are standard because
// they should never conflict with system functions.
self.engine.global_modules.iter().filter(|m| !m.standard).any(|m| m.contains_fn(hash))
// Then check sub-modules
|| self.engine.global_sub_modules.values().any(|m| m.contains_qualified_fn(hash))
}
Expand Down Expand Up @@ -997,7 +998,7 @@ fn optimize_expr(expr: &mut Expr, state: &mut OptimizerState, chaining: bool) {
return;
}
// Overloaded operators can override built-in.
_ if x.args.len() == 2 && !state.has_native_fn(x.hashes.native, arg_types.as_ref()) => {
_ if x.args.len() == 2 && !state.has_native_fn_override(x.hashes.native, arg_types.as_ref()) => {
if let Some(result) = get_builtin_binary_op_fn(x.name.as_ref(), &arg_values[0], &arg_values[1])
.and_then(|f| {
let ctx = (state.engine, x.name.as_ref(), state.lib).into();
Expand Down
2 changes: 2 additions & 0 deletions src/packages/arithmetic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ macro_rules! reg_functions {
}

def_package!(crate:ArithmeticPackage:"Basic arithmetic", lib, {
lib.standard = true;

combine_with_exported_module!(lib, "int", int_functions);
reg_functions!(lib += signed_basic; INT);

Expand Down
2 changes: 2 additions & 0 deletions src/packages/array_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ use std::prelude::v1::*;
use std::{any::TypeId, cmp::Ordering, mem};

def_package!(crate:BasicArrayPackage:"Basic array utilities.", lib, {
lib.standard = true;

combine_with_exported_module!(lib, "array", array_functions);

// Register array iterator
Expand Down
2 changes: 2 additions & 0 deletions src/packages/fn_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ use crate::{def_package, FnPtr, ImmutableString, NativeCallContext};
use std::prelude::v1::*;

def_package!(crate:BasicFnPackage:"Basic Fn functions.", lib, {
lib.standard = true;

combine_with_exported_module!(lib, "FnPtr", fn_ptr_functions);
});

Expand Down
2 changes: 2 additions & 0 deletions src/packages/iter_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,8 @@ macro_rules! reg_range {
}

def_package!(crate:BasicIteratorPackage:"Basic range iterators.", lib, {
lib.standard = true;

reg_range!(lib | "range" => INT);

#[cfg(not(feature = "only_i32"))]
Expand Down
2 changes: 2 additions & 0 deletions src/packages/lang_core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,7 @@ mod core_functions {
}

def_package!(crate:LanguageCorePackage:"Language core functions.", lib, {
lib.standard = true;

combine_with_exported_module!(lib, "language_core", core_functions);
});
2 changes: 2 additions & 0 deletions src/packages/logic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ macro_rules! reg_functions {
}

def_package!(crate:LogicPackage:"Logical operators.", lib, {
lib.standard = true;

#[cfg(not(feature = "only_i32"))]
#[cfg(not(feature = "only_i64"))]
{
Expand Down
2 changes: 2 additions & 0 deletions src/packages/map_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ use std::prelude::v1::*;
use crate::Array;

def_package!(crate:BasicMapPackage:"Basic object map utilities.", lib, {
lib.standard = true;

combine_with_exported_module!(lib, "map", map_functions);
});

Expand Down
2 changes: 2 additions & 0 deletions src/packages/math_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ macro_rules! reg_functions {
}

def_package!(crate:BasicMathPackage:"Basic mathematic functions.", lib, {
lib.standard = true;

// Integer functions
combine_with_exported_module!(lib, "int", int_functions);

Expand Down
2 changes: 2 additions & 0 deletions src/packages/pkg_core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ use std::prelude::v1::*;
use crate::def_package;

def_package!(crate:CorePackage:"_Core_ package containing basic facilities.", lib, {
lib.standard = true;

LanguageCorePackage::init(lib);
ArithmeticPackage::init(lib);
LogicPackage::init(lib);
Expand Down
2 changes: 2 additions & 0 deletions src/packages/pkg_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ use std::prelude::v1::*;
use crate::def_package;

def_package!(crate:StandardPackage:"_Standard_ package containing all built-in features.", lib, {
lib.standard = true;

CorePackage::init(lib);
BasicMathPackage::init(lib);
#[cfg(not(feature = "no_index"))]
Expand Down
2 changes: 2 additions & 0 deletions src/packages/string_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ pub const FUNC_TO_STRING: &str = "to_string";
pub const FUNC_TO_DEBUG: &str = "to_debug";

def_package!(crate:BasicStringPackage:"Basic string utilities, including printing.", lib, {
lib.standard = true;

combine_with_exported_module!(lib, "print_debug", print_debug_functions);
combine_with_exported_module!(lib, "number_formatting", number_formatting);
});
Expand Down
17 changes: 14 additions & 3 deletions src/packages/string_more.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ use std::{any::TypeId, mem};
use super::string_basic::{print_with_func, FUNC_TO_STRING};

def_package!(crate:MoreStringPackage:"Additional string utilities, including string building.", lib, {
lib.standard = true;

combine_with_exported_module!(lib, "string", string_functions);
});

Expand Down Expand Up @@ -45,19 +47,28 @@ mod string_functions {
s
}

#[rhai_fn(name = "append")]
#[rhai_fn(name = "+", name = "append")]
pub fn add_append_str(string1: ImmutableString, string2: ImmutableString) -> ImmutableString {
string1 + string2
}
#[rhai_fn(name = "append")]
#[rhai_fn(name = "+", name = "append")]
pub fn add_append_char(string: ImmutableString, character: char) -> ImmutableString {
string + character
}
#[rhai_fn(name = "append")]
#[rhai_fn(name = "+")]
pub fn add_prepend_char(character: char, string: ImmutableString) -> ImmutableString {
format!("{}{}", character, string).into()
}

#[rhai_fn(name = "+", name = "append")]
pub fn add_append_unit(string: ImmutableString, item: ()) -> ImmutableString {
let _item = item;
string
}
#[rhai_fn(name = "+")]
pub fn add_prepend_unit(_item: (), string: ImmutableString) -> ImmutableString {
string
}

#[rhai_fn(name = "len", get = "len")]
pub fn len(string: &str) -> INT {
Expand Down
2 changes: 2 additions & 0 deletions src/packages/time_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ use std::time::{Duration, Instant};
use instant::{Duration, Instant};

def_package!(crate:BasicTimePackage:"Basic timing utilities.", lib, {
lib.standard = true;

// Register date/time functions
combine_with_exported_module!(lib, "time", time_functions);
});
Expand Down
57 changes: 29 additions & 28 deletions src/token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -805,55 +805,56 @@ impl Token {

match self {
LexError(_) |
LeftBrace | // {+expr} - is unary
// RightBrace | {expr} - expr not unary & is closing
LeftParen | // (-expr) - is unary
// RightParen | (expr) - expr not unary & is closing
LeftBracket | // [-expr] - is unary
// RightBracket | [expr] - expr not unary & is closing
SemiColon | // ; - is unary
Comma | // ( ... , -expr ) - is unary
//Period |
LeftBrace | // { -expr } - is unary
// RightBrace | { expr } - expr not unary & is closing
LeftParen | // ( -expr ) - is unary
// RightParen | // ( expr ) - expr not unary & is closing
LeftBracket | // [ -expr ] - is unary
// RightBracket | // [ expr ] - expr not unary & is closing
Plus |
PlusAssign |
UnaryPlus |
Minus |
MinusAssign |
UnaryMinus |
Multiply |
MultiplyAssign |
Divide |
Comma |
Period |
DivideAssign |
Modulo |
ModuloAssign |
PowerOf |
PowerOfAssign |
LeftShift |
LeftShiftAssign |
RightShift |
RightShiftAssign |
Equals |
EqualsTo |
NotEqualsTo |
LessThan |
GreaterThan |
Bang |
LessThanEqualsTo |
GreaterThanEqualsTo |
EqualsTo |
NotEqualsTo |
Pipe |
Or |
Ampersand |
And |
If |
Do |
//Do |
While |
Until |
PlusAssign |
MinusAssign |
MultiplyAssign |
DivideAssign |
LeftShiftAssign |
RightShiftAssign |
PowerOf |
PowerOfAssign |
In |
And |
AndAssign |
Or |
OrAssign |
XOrAssign |
LeftShift |
RightShift |
XOr |
Modulo |
ModuloAssign |
XOrAssign |
Return |
Throw |
In => true,
Throw => true,

_ => false,
}
Expand Down

0 comments on commit c21fb23

Please sign in to comment.