diff --git a/Cargo.toml b/Cargo.toml index 54331e51..80ab0cf2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ rhai_codegen = { version = "1.4.1", path = "codegen", default-features = false } no-std-compat = { version = "0.4", default-features = false, features = ["alloc"], optional = true } libm = { version = "0.2", default-features = false, optional = true } +hashbrown = { version = "0.12", optional = true } core-error = { version = "0.0", default-features = false, features = ["alloc"], optional = true } serde = { version = "1.0", default-features = false, features = ["derive", "alloc"], optional = true } serde_json = { version = "1.0", default-features = false, features = ["alloc"], optional = true } @@ -63,7 +64,7 @@ debugging = ["internals"] # enable debugging serde = ["dep:serde", "smartstring/serde", "smallvec/serde"] # implement serde for rhai types # compiling for no-std -no_std = ["no-std-compat", "num-traits/libm", "core-error", "libm", "ahash/compile-time-rng"] +no_std = ["no-std-compat", "num-traits/libm", "core-error", "libm", "ahash/compile-time-rng", "hashbrown"] # compiling for WASM wasm-bindgen = ["instant/wasm-bindgen"] diff --git a/src/eval/expr.rs b/src/eval/expr.rs index 22f22567..a0411410 100644 --- a/src/eval/expr.rs +++ b/src/eval/expr.rs @@ -10,6 +10,9 @@ use crate::func::{ }; use crate::types::dynamic::AccessMode; use crate::{Dynamic, Engine, Module, Position, RhaiResult, RhaiResultOf, Scope, ERR}; +#[cfg(feature = "no_std")] +use hashbrown::hash_map::Entry; +#[cfg(not(feature = "no_std"))] use std::collections::hash_map::Entry; use std::num::NonZeroUsize; #[cfg(feature = "no_std")] diff --git a/src/func/hashing.rs b/src/func/hashing.rs index ebcc96a6..75331f66 100644 --- a/src/func/hashing.rs +++ b/src/func/hashing.rs @@ -4,12 +4,18 @@ use std::prelude::v1::*; use std::{ any::TypeId, - collections::{HashMap, HashSet}, hash::{BuildHasher, Hash, Hasher}, }; -pub type StraightHashMap = HashMap; -pub type StraightHashSet = HashSet; +#[cfg(feature = "no_std")] +pub type StraightHashMap = hashbrown::HashMap; +#[cfg(feature = "no_std")] +pub type StraightHashSet = hashbrown::HashSet; + +#[cfg(not(feature = "no_std"))] +pub type StraightHashMap = std::collections::HashMap; +#[cfg(not(feature = "no_std"))] +pub type StraightHashSet = std::collections::HashSet; /// Dummy hash value to map zeros to. This value can be anything. /// @@ -47,7 +53,11 @@ impl Hasher for StraightHasher { } fn write_u64(&mut self, i: u64) { - self.0 = i; + if i == 0 { + self.0 = ALT_ZERO_HASH; + } else { + self.0 = i; + } } }