Fix bug.
This commit is contained in:
parent
c311758b5c
commit
4ab306607d
@ -306,7 +306,7 @@ pub enum Expr {
|
|||||||
Variable(
|
Variable(
|
||||||
#[cfg(not(feature = "no_module"))]
|
#[cfg(not(feature = "no_module"))]
|
||||||
Box<(Option<NonZeroUsize>, super::Namespace, u64, ImmutableString)>,
|
Box<(Option<NonZeroUsize>, super::Namespace, u64, ImmutableString)>,
|
||||||
#[cfg(feature = "no_module")] Box<(Option<NonZeroUsize>, (), u64, ImmutableString)>,
|
#[cfg(feature = "no_module")] Box<(Option<NonZeroUsize>, [(); 0], u64, ImmutableString)>,
|
||||||
Option<NonZeroU8>,
|
Option<NonZeroU8>,
|
||||||
Position,
|
Position,
|
||||||
),
|
),
|
||||||
|
@ -191,7 +191,7 @@ impl fmt::Debug for Engine {
|
|||||||
#[cfg(not(feature = "unchecked"))]
|
#[cfg(not(feature = "unchecked"))]
|
||||||
f.field("limits", &self.limits);
|
f.field("limits", &self.limits);
|
||||||
|
|
||||||
#[cfg(not(feature = "debugging"))]
|
#[cfg(feature = "debugging")]
|
||||||
f.field("debugger_interface", &self.debugger_interface.is_some());
|
f.field("debugger_interface", &self.debugger_interface.is_some());
|
||||||
|
|
||||||
f.finish()
|
f.finish()
|
||||||
|
@ -62,25 +62,22 @@ impl Engine {
|
|||||||
}
|
}
|
||||||
Expr::Variable(v, None, ..) => match &**v {
|
Expr::Variable(v, None, ..) => match &**v {
|
||||||
// Normal variable access
|
// Normal variable access
|
||||||
#[cfg(not(feature = "no_module"))]
|
|
||||||
(_, ns, ..) if ns.is_empty() => {
|
(_, ns, ..) if ns.is_empty() => {
|
||||||
self.search_scope_only(global, caches, scope, this_ptr, expr)
|
self.search_scope_only(global, caches, scope, this_ptr, expr)
|
||||||
}
|
}
|
||||||
#[cfg(feature = "no_module")]
|
|
||||||
(_, (), ..) => self.search_scope_only(global, caches, scope, this_ptr, expr),
|
|
||||||
|
|
||||||
// Qualified variable access
|
// Qualified variable access
|
||||||
#[cfg(not(feature = "no_module"))]
|
#[cfg(not(feature = "no_module"))]
|
||||||
(_, namespace, hash_var, var_name) => {
|
(_, ns, hash_var, var_name) => {
|
||||||
// foo:bar::baz::VARIABLE
|
// foo:bar::baz::VARIABLE
|
||||||
if let Some(module) = self.search_imports(global, namespace) {
|
if let Some(module) = self.search_imports(global, ns) {
|
||||||
return module.get_qualified_var(*hash_var).map_or_else(
|
return module.get_qualified_var(*hash_var).map_or_else(
|
||||||
|| {
|
|| {
|
||||||
let sep = crate::tokenizer::Token::DoubleColon.literal_syntax();
|
let sep = crate::tokenizer::Token::DoubleColon.literal_syntax();
|
||||||
|
|
||||||
Err(ERR::ErrorVariableNotFound(
|
Err(ERR::ErrorVariableNotFound(
|
||||||
format!("{namespace}{sep}{var_name}"),
|
format!("{ns}{sep}{var_name}"),
|
||||||
namespace.position(),
|
ns.position(),
|
||||||
)
|
)
|
||||||
.into())
|
.into())
|
||||||
},
|
},
|
||||||
@ -94,7 +91,7 @@ impl Engine {
|
|||||||
|
|
||||||
// global::VARIABLE
|
// global::VARIABLE
|
||||||
#[cfg(not(feature = "no_function"))]
|
#[cfg(not(feature = "no_function"))]
|
||||||
if namespace.len() == 1 && namespace.root() == crate::engine::KEYWORD_GLOBAL {
|
if ns.len() == 1 && ns.root() == crate::engine::KEYWORD_GLOBAL {
|
||||||
if let Some(ref constants) = global.constants {
|
if let Some(ref constants) = global.constants {
|
||||||
if let Some(value) =
|
if let Some(value) =
|
||||||
crate::func::locked_write(constants).get_mut(var_name.as_str())
|
crate::func::locked_write(constants).get_mut(var_name.as_str())
|
||||||
@ -109,17 +106,17 @@ impl Engine {
|
|||||||
let sep = crate::tokenizer::Token::DoubleColon.literal_syntax();
|
let sep = crate::tokenizer::Token::DoubleColon.literal_syntax();
|
||||||
|
|
||||||
return Err(ERR::ErrorVariableNotFound(
|
return Err(ERR::ErrorVariableNotFound(
|
||||||
format!("{namespace}{sep}{var_name}"),
|
format!("{ns}{sep}{var_name}"),
|
||||||
namespace.position(),
|
ns.position(),
|
||||||
)
|
)
|
||||||
.into());
|
.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
Err(
|
Err(ERR::ErrorModuleNotFound(ns.to_string(), ns.position()).into())
|
||||||
ERR::ErrorModuleNotFound(namespace.to_string(), namespace.position())
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "no_module")]
|
||||||
|
_ => unreachable!("Invalid expression {:?}", expr),
|
||||||
},
|
},
|
||||||
_ => unreachable!("Expr::Variable expected but gets {:?}", expr),
|
_ => unreachable!("Expr::Variable expected but gets {:?}", expr),
|
||||||
}
|
}
|
||||||
@ -142,14 +139,18 @@ impl Engine {
|
|||||||
|
|
||||||
let index = match expr {
|
let index = match expr {
|
||||||
// Check if the variable is `this`
|
// Check if the variable is `this`
|
||||||
Expr::Variable(v, None, ..) if v.0.is_none() && v.3 == KEYWORD_THIS => {
|
Expr::Variable(v, None, ..)
|
||||||
|
if v.0.is_none() && v.1.is_empty() && v.3 == KEYWORD_THIS =>
|
||||||
|
{
|
||||||
return if this_ptr.is_null() {
|
return if this_ptr.is_null() {
|
||||||
Err(ERR::ErrorUnboundThis(expr.position()).into())
|
Err(ERR::ErrorUnboundThis(expr.position()).into())
|
||||||
} else {
|
} else {
|
||||||
Ok(this_ptr.into())
|
Ok(this_ptr.into())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
_ if global.always_search_scope => 0,
|
_ if global.always_search_scope => 0,
|
||||||
|
|
||||||
Expr::Variable(_, Some(i), ..) => i.get() as usize,
|
Expr::Variable(_, Some(i), ..) => i.get() as usize,
|
||||||
// Scripted function with the same name
|
// Scripted function with the same name
|
||||||
#[cfg(not(feature = "no_function"))]
|
#[cfg(not(feature = "no_function"))]
|
||||||
@ -165,6 +166,7 @@ impl Engine {
|
|||||||
return Ok(val.into());
|
return Ok(val.into());
|
||||||
}
|
}
|
||||||
Expr::Variable(v, None, ..) => v.0.map_or(0, NonZeroUsize::get),
|
Expr::Variable(v, None, ..) => v.0.map_or(0, NonZeroUsize::get),
|
||||||
|
|
||||||
_ => unreachable!("Expr::Variable expected but gets {:?}", expr),
|
_ => unreachable!("Expr::Variable expected but gets {:?}", expr),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1595,7 +1595,7 @@ impl Engine {
|
|||||||
#[cfg(not(feature = "no_module"))]
|
#[cfg(not(feature = "no_module"))]
|
||||||
let ns = crate::ast::Namespace::NONE;
|
let ns = crate::ast::Namespace::NONE;
|
||||||
#[cfg(feature = "no_module")]
|
#[cfg(feature = "no_module")]
|
||||||
let ns = ();
|
let ns = [];
|
||||||
|
|
||||||
let s = match input.next().expect(NEVER_ENDS) {
|
let s = match input.next().expect(NEVER_ENDS) {
|
||||||
(Token::Identifier(s), ..) => s,
|
(Token::Identifier(s), ..) => s,
|
||||||
@ -1660,7 +1660,7 @@ impl Engine {
|
|||||||
#[cfg(not(feature = "no_module"))]
|
#[cfg(not(feature = "no_module"))]
|
||||||
let ns = crate::ast::Namespace::NONE;
|
let ns = crate::ast::Namespace::NONE;
|
||||||
#[cfg(feature = "no_module")]
|
#[cfg(feature = "no_module")]
|
||||||
let ns = ();
|
let ns = [];
|
||||||
|
|
||||||
let s = match input.next().expect(NEVER_ENDS) {
|
let s = match input.next().expect(NEVER_ENDS) {
|
||||||
(Token::Reserved(s), ..) => s,
|
(Token::Reserved(s), ..) => s,
|
||||||
@ -2542,7 +2542,7 @@ impl Engine {
|
|||||||
#[cfg(not(feature = "no_module"))]
|
#[cfg(not(feature = "no_module"))]
|
||||||
let ns = crate::ast::Namespace::NONE;
|
let ns = crate::ast::Namespace::NONE;
|
||||||
#[cfg(feature = "no_module")]
|
#[cfg(feature = "no_module")]
|
||||||
let ns = ();
|
let ns = [];
|
||||||
|
|
||||||
segments.push(name.clone());
|
segments.push(name.clone());
|
||||||
tokens.push(state.get_interned_string(CUSTOM_SYNTAX_MARKER_IDENT));
|
tokens.push(state.get_interned_string(CUSTOM_SYNTAX_MARKER_IDENT));
|
||||||
|
Loading…
Reference in New Issue
Block a user