Move lib into global.

This commit is contained in:
Stephen Chung
2022-11-10 11:49:10 +08:00
parent 3800a6d9f5
commit 3a028f2642
19 changed files with 353 additions and 500 deletions

View File

@@ -3,9 +3,10 @@
use crate::eval::{Caches, GlobalRuntimeState};
use crate::types::dynamic::Variant;
use crate::types::RestoreOnDrop;
use crate::{
reify, Dynamic, Engine, FuncArgs, Position, RhaiResult, RhaiResultOf, Scope, SharedModule,
StaticVec, AST, ERR,
reify, Dynamic, Engine, FuncArgs, Position, RhaiResult, RhaiResultOf, Scope, StaticVec, AST,
ERR,
};
use std::any::{type_name, TypeId};
#[cfg(feature = "no_std")]
@@ -248,31 +249,30 @@ impl Engine {
arg_values: &mut [Dynamic],
) -> RhaiResult {
let statements = ast.statements();
let lib = &[AsRef::<SharedModule>::as_ref(ast).clone()];
let orig_lib_len = global.lib.len();
#[cfg(not(feature = "no_function"))]
if !ast.functions().is_empty() {
global.lib.push(ast.functions().clone());
}
let mut no_this_ptr = Dynamic::NULL;
let this_ptr = this_ptr.unwrap_or(&mut no_this_ptr);
let orig_scope_len = scope.len();
#[cfg(not(feature = "no_module"))]
let orig_embedded_module_resolver = std::mem::replace(
&mut global.embedded_module_resolver,
ast.resolver().cloned(),
);
#[cfg(not(feature = "no_module"))]
let global = &mut *crate::types::RestoreOnDrop::lock(global, move |g| {
g.embedded_module_resolver = orig_embedded_module_resolver
});
let result = if eval_ast && !statements.is_empty() {
let r = self.eval_global_statements(global, caches, lib, scope, statements);
let orig_scope_len = scope.len();
let scope = &mut *RestoreOnDrop::lock_if(rewind_scope, scope, move |s| {
s.rewind(orig_scope_len);
});
if rewind_scope {
scope.rewind(orig_scope_len);
}
r
self.eval_global_statements(global, caches, scope, statements)
} else {
Ok(Dynamic::UNIT)
}
@@ -287,7 +287,6 @@ impl Engine {
self.call_script_fn(
global,
caches,
lib,
scope,
this_ptr,
fn_def,
@@ -298,15 +297,21 @@ impl Engine {
} else {
Err(ERR::ErrorFunctionNotFound(name.into(), Position::NONE).into())
}
})?;
});
#[cfg(feature = "debugging")]
if self.debugger.is_some() {
global.debugger.status = crate::eval::DebuggerStatus::Terminate;
let node = &crate::ast::Stmt::Noop(Position::NONE);
self.run_debugger(global, caches, lib, scope, this_ptr, node)?;
self.run_debugger(global, caches, scope, this_ptr, node)?;
}
Ok(result)
#[cfg(not(feature = "no_module"))]
{
global.embedded_module_resolver = orig_embedded_module_resolver;
}
global.lib.truncate(orig_lib_len);
result
}
}

View File

@@ -6,9 +6,9 @@ use crate::types::dynamic::Variant;
use crate::{
Dynamic, Engine, OptimizationLevel, Position, RhaiResult, RhaiResultOf, Scope, AST, ERR,
};
use std::any::type_name;
#[cfg(feature = "no_std")]
use std::prelude::v1::*;
use std::{any::type_name, mem};
impl Engine {
/// Evaluate a string as a script, returning the result value or an error.
@@ -190,19 +190,6 @@ impl Engine {
let result = self.eval_ast_with_scope_raw(global, caches, scope, ast)?;
#[cfg(feature = "debugging")]
if self.debugger.is_some() {
global.debugger.status = crate::eval::DebuggerStatus::Terminate;
let lib = &[
#[cfg(not(feature = "no_function"))]
AsRef::<crate::SharedModule>::as_ref(ast).clone(),
];
let mut this = Dynamic::NULL;
let node = &crate::ast::Stmt::Noop(Position::NONE);
self.run_debugger(global, caches, lib, scope, &mut this, node)?;
}
let typ = self.map_type_name(result.type_name());
result.try_cast::<T>().ok_or_else(|| {
@@ -216,21 +203,22 @@ impl Engine {
&self,
global: &mut GlobalRuntimeState,
caches: &mut Caches,
scope: &mut Scope,
ast: &'a AST,
) -> RhaiResult {
global.source = ast.source_raw().cloned();
let orig_source = mem::replace(&mut global.source, ast.source_raw().cloned());
let orig_lib_len = global.lib.len();
#[cfg(not(feature = "no_function"))]
if !ast.functions().is_empty() {
global.lib.push(ast.functions().clone());
}
#[cfg(not(feature = "no_module"))]
let orig_embedded_module_resolver = std::mem::replace(
let orig_embedded_module_resolver = mem::replace(
&mut global.embedded_module_resolver,
ast.resolver().cloned(),
);
#[cfg(not(feature = "no_module"))]
let global = &mut *crate::types::RestoreOnDrop::lock(global, move |g| {
g.embedded_module_resolver = orig_embedded_module_resolver
});
let statements = ast.statements();
@@ -238,12 +226,26 @@ impl Engine {
return Ok(Dynamic::UNIT);
}
let lib = &[
#[cfg(not(feature = "no_function"))]
AsRef::<crate::SharedModule>::as_ref(ast).clone(),
];
let result = self.eval_global_statements(global, caches, scope, statements);
self.eval_global_statements(global, caches, lib, scope, statements)
#[cfg(feature = "debugging")]
if self.debugger.is_some() {
global.debugger.status = crate::eval::DebuggerStatus::Terminate;
let mut this = Dynamic::NULL;
let node = &crate::ast::Stmt::Noop(Position::NONE);
self.run_debugger(global, caches, scope, &mut this, node)?;
}
#[cfg(not(feature = "no_module"))]
{
global.embedded_module_resolver = orig_embedded_module_resolver;
}
global.lib.truncate(orig_lib_len);
global.source = orig_source;
result
}
/// _(internals)_ Evaluate a list of statements with no `this` pointer.
/// Exported under the `internals` feature only.
@@ -259,12 +261,10 @@ impl Engine {
&self,
global: &mut GlobalRuntimeState,
caches: &mut Caches,
lib: &[crate::SharedModule],
scope: &mut Scope,
statements: &[crate::ast::Stmt],
) -> RhaiResult {
self.eval_global_statements(global, caches, lib, scope, statements)
self.eval_global_statements(global, caches, scope, statements)
}
}

View File

@@ -52,7 +52,7 @@ impl Engine {
let mut ast = ast;
#[cfg(not(feature = "no_function"))]
let lib = ast
let functions = ast
.shared_lib()
.iter_fn()
.filter(|f| f.func.is_script())
@@ -64,7 +64,7 @@ impl Engine {
scope,
ast.take_statements(),
#[cfg(not(feature = "no_function"))]
lib,
functions,
optimization_level,
);

View File

@@ -2,7 +2,7 @@
use crate::eval::{Caches, GlobalRuntimeState};
use crate::parser::ParseState;
use crate::{Engine, RhaiResultOf, Scope, SharedModule, AST};
use crate::{Engine, RhaiResultOf, Scope, AST};
#[cfg(feature = "no_std")]
use std::prelude::v1::*;
@@ -115,6 +115,10 @@ impl Engine {
let global = &mut GlobalRuntimeState::new(self);
global.source = ast.source_raw().cloned();
#[cfg(not(feature = "no_function"))]
if !ast.functions().is_empty() {
global.lib.push(ast.functions().clone());
}
#[cfg(not(feature = "no_module"))]
{
global.embedded_module_resolver = ast.resolver().cloned();
@@ -122,28 +126,15 @@ impl Engine {
let statements = ast.statements();
if !statements.is_empty() {
let lib: &[SharedModule] = &[
#[cfg(not(feature = "no_function"))]
AsRef::<SharedModule>::as_ref(ast).clone(),
];
let lib = if lib.first().map_or(true, |m| m.is_empty()) {
&[][..]
} else {
&lib
};
self.eval_global_statements(global, caches, lib, scope, statements)?;
self.eval_global_statements(global, caches, scope, statements)?;
}
#[cfg(feature = "debugging")]
if self.debugger.is_some() {
global.debugger.status = crate::eval::DebuggerStatus::Terminate;
let lib = &[
#[cfg(not(feature = "no_function"))]
AsRef::<crate::SharedModule>::as_ref(ast).clone(),
];
let mut this = crate::Dynamic::NULL;
let node = &crate::ast::Stmt::Noop(crate::Position::NONE);
self.run_debugger(global, caches, lib, scope, &mut this, node)?;
self.run_debugger(global, caches, scope, &mut this, node)?;
}
Ok(())