Fix no_std builds.
This commit is contained in:
parent
00255a9b78
commit
6dedb1ed9f
@ -31,6 +31,7 @@ New features
|
|||||||
------------
|
------------
|
||||||
|
|
||||||
* Added support for integer _ranges_ via the `..` and `..=` operators.
|
* Added support for integer _ranges_ via the `..` and `..=` operators.
|
||||||
|
* Added `EvalAltResult::ErrorCustomSyntax` to catch errors in custom syntax, which should not happen unless an `AST` is compiled on one `Engine` but evaluated on another unrelated `Engine`.
|
||||||
|
|
||||||
Enhancements
|
Enhancements
|
||||||
------------
|
------------
|
||||||
|
@ -416,14 +416,16 @@ impl Engine {
|
|||||||
.into())
|
.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr::Custom(custom, _) => {
|
Expr::Custom(custom, pos) => {
|
||||||
let expressions: StaticVec<_> = custom.inputs.iter().map(Into::into).collect();
|
let expressions: StaticVec<_> = custom.inputs.iter().map(Into::into).collect();
|
||||||
|
// The first token acts as the custom syntax's key
|
||||||
let key_token = custom.tokens.first().unwrap();
|
let key_token = custom.tokens.first().unwrap();
|
||||||
|
// The key should exist, unless the AST is compiled in a different Engine
|
||||||
let custom_def = self.custom_syntax.get(key_token).ok_or_else(|| {
|
let custom_def = self.custom_syntax.get(key_token).ok_or_else(|| {
|
||||||
let code: Vec<_> = custom.tokens.iter().map(|s| s.as_str()).collect();
|
Box::new(ERR::ErrorCustomSyntax(
|
||||||
Box::new(ERR::ErrorSystem(
|
|
||||||
format!("Invalid custom syntax prefix: {}", key_token),
|
format!("Invalid custom syntax prefix: {}", key_token),
|
||||||
code.join(" ").into(),
|
custom.tokens.iter().map(|s| s.to_string()).collect(),
|
||||||
|
*pos,
|
||||||
))
|
))
|
||||||
})?;
|
})?;
|
||||||
let mut context = EvalContext {
|
let mut context = EvalContext {
|
||||||
|
@ -71,6 +71,7 @@ pub enum EvalAltResult {
|
|||||||
ErrorDotExpr(String, Position),
|
ErrorDotExpr(String, Position),
|
||||||
/// Arithmetic error encountered. Wrapped value is the error message.
|
/// Arithmetic error encountered. Wrapped value is the error message.
|
||||||
ErrorArithmetic(String, Position),
|
ErrorArithmetic(String, Position),
|
||||||
|
|
||||||
/// Number of operations over maximum limit.
|
/// Number of operations over maximum limit.
|
||||||
ErrorTooManyOperations(Position),
|
ErrorTooManyOperations(Position),
|
||||||
/// [Modules][crate::Module] over maximum limit.
|
/// [Modules][crate::Module] over maximum limit.
|
||||||
@ -81,6 +82,14 @@ pub enum EvalAltResult {
|
|||||||
ErrorDataTooLarge(String, Position),
|
ErrorDataTooLarge(String, Position),
|
||||||
/// The script is prematurely terminated. Wrapped value is the termination token.
|
/// The script is prematurely terminated. Wrapped value is the termination token.
|
||||||
ErrorTerminated(Dynamic, Position),
|
ErrorTerminated(Dynamic, Position),
|
||||||
|
|
||||||
|
/// Error encountered for a custom syntax. Wrapped values are the error message and
|
||||||
|
/// custom syntax symbols stream.
|
||||||
|
///
|
||||||
|
/// Normally this should never happen, unless an [`AST`][crate::AST] is compiled on one
|
||||||
|
/// [`Engine`][crate::Engine] but evaluated on another unrelated [`Engine`][crate::Engine].
|
||||||
|
ErrorCustomSyntax(String, Vec<String>, Position),
|
||||||
|
|
||||||
/// Run-time error encountered. Wrapped value is the error token.
|
/// Run-time error encountered. Wrapped value is the error token.
|
||||||
ErrorRuntime(Dynamic, Position),
|
ErrorRuntime(Dynamic, Position),
|
||||||
|
|
||||||
@ -204,6 +213,8 @@ impl fmt::Display for EvalAltResult {
|
|||||||
index, max
|
index, max
|
||||||
)?,
|
)?,
|
||||||
Self::ErrorDataTooLarge(typ, _) => write!(f, "{} exceeds maximum limit", typ)?,
|
Self::ErrorDataTooLarge(typ, _) => write!(f, "{} exceeds maximum limit", typ)?,
|
||||||
|
|
||||||
|
Self::ErrorCustomSyntax(s, tokens, _) => write!(f, "{}: {}", s, tokens.join(" "))?,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not write any position if None
|
// Do not write any position if None
|
||||||
@ -266,7 +277,8 @@ impl EvalAltResult {
|
|||||||
| Self::ErrorArithmetic(_, _)
|
| Self::ErrorArithmetic(_, _)
|
||||||
| Self::ErrorRuntime(_, _) => true,
|
| Self::ErrorRuntime(_, _) => true,
|
||||||
|
|
||||||
Self::ErrorTooManyOperations(_)
|
Self::ErrorCustomSyntax(_, _, _)
|
||||||
|
| Self::ErrorTooManyOperations(_)
|
||||||
| Self::ErrorTooManyModules(_)
|
| Self::ErrorTooManyModules(_)
|
||||||
| Self::ErrorStackOverflow(_)
|
| Self::ErrorStackOverflow(_)
|
||||||
| Self::ErrorDataTooLarge(_, _)
|
| Self::ErrorDataTooLarge(_, _)
|
||||||
@ -282,7 +294,8 @@ impl EvalAltResult {
|
|||||||
Self::ErrorSystem(_, _) => true,
|
Self::ErrorSystem(_, _) => true,
|
||||||
Self::ErrorParsing(_, _) => true,
|
Self::ErrorParsing(_, _) => true,
|
||||||
|
|
||||||
Self::ErrorTooManyOperations(_)
|
Self::ErrorCustomSyntax(_, _, _)
|
||||||
|
| Self::ErrorTooManyOperations(_)
|
||||||
| Self::ErrorTooManyModules(_)
|
| Self::ErrorTooManyModules(_)
|
||||||
| Self::ErrorStackOverflow(_)
|
| Self::ErrorStackOverflow(_)
|
||||||
| Self::ErrorDataTooLarge(_, _) => true,
|
| Self::ErrorDataTooLarge(_, _) => true,
|
||||||
@ -295,6 +308,8 @@ impl EvalAltResult {
|
|||||||
/// Get the [position][Position] of this error.
|
/// Get the [position][Position] of this error.
|
||||||
#[cfg(not(feature = "no_object"))]
|
#[cfg(not(feature = "no_object"))]
|
||||||
pub(crate) fn dump_fields(&self, map: &mut crate::Map) {
|
pub(crate) fn dump_fields(&self, map: &mut crate::Map) {
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
map.insert(
|
map.insert(
|
||||||
"error".into(),
|
"error".into(),
|
||||||
format!("{:?}", self)
|
format!("{:?}", self)
|
||||||
@ -358,6 +373,17 @@ impl EvalAltResult {
|
|||||||
Self::ErrorTerminated(t, _) => {
|
Self::ErrorTerminated(t, _) => {
|
||||||
map.insert("token".into(), t.clone());
|
map.insert("token".into(), t.clone());
|
||||||
}
|
}
|
||||||
|
Self::ErrorCustomSyntax(_, tokens, _) => {
|
||||||
|
map.insert(
|
||||||
|
"tokens".into(),
|
||||||
|
Dynamic::from_array(
|
||||||
|
tokens
|
||||||
|
.iter()
|
||||||
|
.map(|s| Dynamic::from_str(s).unwrap())
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
/// Get the [position][Position] of this error.
|
/// Get the [position][Position] of this error.
|
||||||
@ -389,6 +415,7 @@ impl EvalAltResult {
|
|||||||
| Self::ErrorStackOverflow(pos)
|
| Self::ErrorStackOverflow(pos)
|
||||||
| Self::ErrorDataTooLarge(_, pos)
|
| Self::ErrorDataTooLarge(_, pos)
|
||||||
| Self::ErrorTerminated(_, pos)
|
| Self::ErrorTerminated(_, pos)
|
||||||
|
| Self::ErrorCustomSyntax(_, _, pos)
|
||||||
| Self::ErrorRuntime(_, pos)
|
| Self::ErrorRuntime(_, pos)
|
||||||
| Self::LoopBreak(_, pos)
|
| Self::LoopBreak(_, pos)
|
||||||
| Self::Return(_, pos) => *pos,
|
| Self::Return(_, pos) => *pos,
|
||||||
@ -436,6 +463,7 @@ impl EvalAltResult {
|
|||||||
| Self::ErrorStackOverflow(pos)
|
| Self::ErrorStackOverflow(pos)
|
||||||
| Self::ErrorDataTooLarge(_, pos)
|
| Self::ErrorDataTooLarge(_, pos)
|
||||||
| Self::ErrorTerminated(_, pos)
|
| Self::ErrorTerminated(_, pos)
|
||||||
|
| Self::ErrorCustomSyntax(_, _, pos)
|
||||||
| Self::ErrorRuntime(_, pos)
|
| Self::ErrorRuntime(_, pos)
|
||||||
| Self::LoopBreak(_, pos)
|
| Self::LoopBreak(_, pos)
|
||||||
| Self::Return(_, pos) => *pos = new_position,
|
| Self::Return(_, pos) => *pos = new_position,
|
||||||
|
Loading…
Reference in New Issue
Block a user