Hide is_shared and is_locked under feature gates.
This commit is contained in:
parent
6eaee57578
commit
6c92011ea1
@ -4,6 +4,11 @@ Rhai Release Notes
|
||||
Version 0.20.1
|
||||
==============
|
||||
|
||||
Breaking changes
|
||||
----------------
|
||||
|
||||
* `Dynamic::is_shared` and `Dynamic::is_locked` are removed under the `no_closure` feature. They used to always return `false`.
|
||||
|
||||
|
||||
Version 0.20.0
|
||||
==============
|
||||
|
@ -90,6 +90,7 @@ impl fmt::Display for ScriptFnDef {
|
||||
}
|
||||
|
||||
/// A type containing the metadata of a script-defined function.
|
||||
///
|
||||
/// Not available under `no_function`.
|
||||
///
|
||||
/// Created by [`AST::iter_functions`].
|
||||
@ -265,6 +266,7 @@ impl AST {
|
||||
}
|
||||
/// _(INTERNALS)_ Get the internal shared [`Module`] containing all script-defined functions.
|
||||
/// Exported under the `internals` feature only.
|
||||
///
|
||||
/// Not available under `no_function`.
|
||||
#[cfg(feature = "internals")]
|
||||
#[deprecated = "this method is volatile and may change"]
|
||||
@ -282,6 +284,7 @@ impl AST {
|
||||
}
|
||||
/// _(INTERNALS)_ Get the internal [`Module`] containing all script-defined functions.
|
||||
/// Exported under the `internals` feature only.
|
||||
///
|
||||
/// Not available under `no_function`.
|
||||
#[cfg(feature = "internals")]
|
||||
#[deprecated = "this method is volatile and may change"]
|
||||
@ -318,6 +321,7 @@ impl AST {
|
||||
}
|
||||
/// Clone the [`AST`]'s functions into a new [`AST`].
|
||||
/// No statements are cloned.
|
||||
///
|
||||
/// Not available under `no_function`.
|
||||
///
|
||||
/// This operation is cheap because functions are shared.
|
||||
@ -328,6 +332,7 @@ impl AST {
|
||||
}
|
||||
/// Clone the [`AST`]'s functions into a new [`AST`] based on a filter predicate.
|
||||
/// No statements are cloned.
|
||||
///
|
||||
/// Not available under `no_function`.
|
||||
///
|
||||
/// This operation is cheap because functions are shared.
|
||||
@ -650,7 +655,7 @@ impl AST {
|
||||
}
|
||||
/// Iterate through all function definitions.
|
||||
///
|
||||
/// Not available under [`no_function`].
|
||||
/// Not available under `no_function`.
|
||||
#[cfg(not(feature = "no_function"))]
|
||||
#[cfg(not(feature = "no_module"))]
|
||||
#[inline(always)]
|
||||
|
@ -205,12 +205,17 @@ fn main() {
|
||||
.iter_raw()
|
||||
.enumerate()
|
||||
.for_each(|(i, (name, constant, value))| {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
let value_is_shared = if value.is_shared() { " (shared" } else { "" };
|
||||
#[cfg(feature = "no_closure")]
|
||||
let value_is_shared = "";
|
||||
|
||||
println!(
|
||||
"[{}] {}{}{} = {:?}",
|
||||
i + 1,
|
||||
if constant { "const " } else { "" },
|
||||
name,
|
||||
if value.is_shared() { " (shared)" } else { "" },
|
||||
value_is_shared,
|
||||
*value.read_lock::<Dynamic>().unwrap(),
|
||||
)
|
||||
});
|
||||
|
@ -281,7 +281,8 @@ impl Dynamic {
|
||||
}
|
||||
/// Is the value held by this [`Dynamic`] shared?
|
||||
///
|
||||
/// Always [`false`] under the `no_closure` feature.
|
||||
/// Not available under `no_closure`.
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
#[inline(always)]
|
||||
pub fn is_shared(&self) -> bool {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
@ -948,10 +949,6 @@ impl Dynamic {
|
||||
/// values.
|
||||
///
|
||||
/// If the [`Dynamic`] value is already shared, this method returns itself.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics under the `no_closure` feature.
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
#[inline(always)]
|
||||
pub fn into_shared(self) -> Self {
|
||||
@ -1122,12 +1119,15 @@ impl Dynamic {
|
||||
/// ```
|
||||
#[inline(always)]
|
||||
pub fn cast<T: Variant + Clone>(self) -> T {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
let self_type_name = if self.is_shared() {
|
||||
// Avoid panics/deadlocks with shared values
|
||||
"<shared>"
|
||||
} else {
|
||||
self.type_name()
|
||||
};
|
||||
#[cfg(feature = "no_closure")]
|
||||
let self_type_name = self.type_name();
|
||||
|
||||
self.try_cast::<T>().unwrap_or_else(|| {
|
||||
panic!(
|
||||
@ -1259,11 +1259,14 @@ impl Dynamic {
|
||||
}
|
||||
/// Is the [`Dynamic`] a shared value that is locked?
|
||||
///
|
||||
/// Not available under `no_closure`.
|
||||
///
|
||||
/// ## Note
|
||||
///
|
||||
/// Under the `sync` feature, shared values use [`RwLock`][std::sync::RwLock] and they are never locked.
|
||||
/// Access just waits until the [`RwLock`][std::sync::RwLock] is released.
|
||||
/// So this method always returns [`false`] under [`Sync`].
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
#[inline(always)]
|
||||
pub fn is_locked(&self) -> bool {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
|
@ -344,7 +344,7 @@ impl<'a> Target<'a> {
|
||||
}
|
||||
}
|
||||
/// Is the `Target` a shared value?
|
||||
#[allow(dead_code)]
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
#[inline(always)]
|
||||
pub fn is_shared(&self) -> bool {
|
||||
match self {
|
||||
@ -1990,7 +1990,12 @@ impl Engine {
|
||||
let mut lock_guard;
|
||||
let lhs_ptr_inner;
|
||||
|
||||
if cfg!(not(feature = "no_closure")) && target.is_shared() {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
let target_is_shared = target.is_shared();
|
||||
#[cfg(feature = "no_closure")]
|
||||
let target_is_shared = false;
|
||||
|
||||
if target_is_shared {
|
||||
lock_guard = target.as_mut().write_lock::<Dynamic>().unwrap();
|
||||
lhs_ptr_inner = lock_guard.deref_mut();
|
||||
} else {
|
||||
@ -2314,7 +2319,12 @@ impl Engine {
|
||||
let loop_var = scope.get_mut_by_index(index);
|
||||
let value = iter_value.flatten();
|
||||
|
||||
if cfg!(not(feature = "no_closure")) && loop_var.is_shared() {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
let loop_var_is_shared = loop_var.is_shared();
|
||||
#[cfg(feature = "no_closure")]
|
||||
let loop_var_is_shared = false;
|
||||
|
||||
if loop_var_is_shared {
|
||||
*loop_var.write_lock().unwrap() = value;
|
||||
} else {
|
||||
*loop_var = value;
|
||||
|
@ -1314,7 +1314,12 @@ impl Engine {
|
||||
|
||||
self.inc_operations(state, pos)?;
|
||||
|
||||
args = if target.is_shared() || target.is_value() {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
let target_is_shared = target.is_shared();
|
||||
#[cfg(feature = "no_closure")]
|
||||
let target_is_shared = false;
|
||||
|
||||
args = if target_is_shared || target.is_value() {
|
||||
arg_values.insert(0, target.take_or_clone().flatten());
|
||||
arg_values.iter_mut().collect()
|
||||
} else {
|
||||
@ -1398,7 +1403,12 @@ impl Engine {
|
||||
|
||||
self.inc_operations(state, pos)?;
|
||||
|
||||
if target.is_shared() || target.is_value() {
|
||||
#[cfg(not(feature = "no_closure"))]
|
||||
let target_is_shared = target.is_shared();
|
||||
#[cfg(feature = "no_closure")]
|
||||
let target_is_shared = false;
|
||||
|
||||
if target_is_shared || target.is_value() {
|
||||
arg_values[0] = target.take_or_clone().flatten();
|
||||
args = arg_values.iter_mut().collect();
|
||||
} else {
|
||||
|
@ -104,20 +104,18 @@ pub type INT = i64;
|
||||
pub type INT = i32;
|
||||
|
||||
/// The system floating-point type. It is defined as [`f64`].
|
||||
/// Not available under `no_float`.
|
||||
///
|
||||
/// If the `f32_float` feature is enabled, this will be [`i32`] instead.
|
||||
///
|
||||
/// Not available under `no_float`.
|
||||
#[cfg(not(feature = "no_float"))]
|
||||
#[cfg(not(feature = "f32_float"))]
|
||||
pub type FLOAT = f64;
|
||||
|
||||
/// The system floating-point type.
|
||||
/// It is defined as [`f32`] since the `f32_float` feature is used.
|
||||
/// Not available under `no_float`.
|
||||
///
|
||||
/// If the `f32_float` feature is not used, this will be `f64` instead.
|
||||
///
|
||||
/// Not available under `no_float`.
|
||||
#[cfg(not(feature = "no_float"))]
|
||||
#[cfg(feature = "f32_float")]
|
||||
pub type FLOAT = f32;
|
||||
@ -180,13 +178,11 @@ pub use fn_args::FuncArgs;
|
||||
pub use ast::ScriptFnMetadata;
|
||||
|
||||
/// Variable-sized array of [`Dynamic`] values.
|
||||
///
|
||||
/// Not available under `no_index`.
|
||||
#[cfg(not(feature = "no_index"))]
|
||||
pub type Array = stdlib::vec::Vec<Dynamic>;
|
||||
|
||||
/// Hash map of [`Dynamic`] values with [`ImmutableString`] keys.
|
||||
///
|
||||
/// Not available under `no_object`.
|
||||
#[cfg(not(feature = "no_object"))]
|
||||
pub type Map = stdlib::collections::BTreeMap<Identifier, Dynamic>;
|
||||
|
Loading…
Reference in New Issue
Block a user