Clean up control flow code in the VM; Remove returns from if and if/else_if statements
This commit is contained in:
parent
0c73f80947
commit
28c65b0715
@ -226,8 +226,6 @@ impl<'src> Parser<'src> {
|
|||||||
if let Token::Else = self.current.0 {
|
if let Token::Else = self.current.0 {
|
||||||
self.next_token()?;
|
self.next_token()?;
|
||||||
} else {
|
} else {
|
||||||
let else_if_end = self.current.1;
|
|
||||||
|
|
||||||
return Ok(Node::new(
|
return Ok(Node::new(
|
||||||
Statement::IfElseIf {
|
Statement::IfElseIf {
|
||||||
condition,
|
condition,
|
||||||
|
@ -254,15 +254,16 @@ impl Vm {
|
|||||||
position: condition_position,
|
position: condition_position,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
let condition = if let Some(condition) = condition_value.as_boolean() {
|
||||||
if let Some(condition) = condition_value.as_boolean() {
|
condition
|
||||||
if condition {
|
|
||||||
return self.run_node(*body, context);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return Err(VmError::ExpectedBoolean {
|
return Err(VmError::ExpectedBoolean {
|
||||||
position: condition_position,
|
position: condition_position,
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if condition {
|
||||||
|
self.run_node(*body, context)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(None)
|
Ok(None)
|
||||||
@ -321,15 +322,16 @@ impl Vm {
|
|||||||
position: condition_position,
|
position: condition_position,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
let condition = if let Some(condition) = condition_value.as_boolean() {
|
||||||
if let Some(condition) = condition_value.as_boolean() {
|
condition
|
||||||
if condition {
|
|
||||||
return self.run_node(body, context);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return Err(VmError::ExpectedBoolean {
|
return Err(VmError::ExpectedBoolean {
|
||||||
position: condition_position,
|
position: condition_position,
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if condition {
|
||||||
|
self.run_node(body, context)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,15 +372,16 @@ impl Vm {
|
|||||||
position: condition_position,
|
position: condition_position,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
let condition = if let Some(condition) = condition_value.as_boolean() {
|
||||||
if let Some(condition) = condition_value.as_boolean() {
|
condition
|
||||||
if condition {
|
|
||||||
return self.run_node(body, context);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return Err(VmError::ExpectedBoolean {
|
return Err(VmError::ExpectedBoolean {
|
||||||
position: condition_position,
|
position: condition_position,
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if condition {
|
||||||
|
return self.run_node(body, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -657,6 +660,34 @@ impl Display for VmError {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn r#if() {
|
||||||
|
let input = "if true { 1 }";
|
||||||
|
|
||||||
|
assert_eq!(run(input, &mut Context::new()), Ok(None));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn if_else() {
|
||||||
|
let input = "if false { 1 } else { 2 }";
|
||||||
|
|
||||||
|
assert_eq!(run(input, &mut Context::new()), Ok(Some(Value::integer(2))));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn if_else_if() {
|
||||||
|
let input = "if false { 1 } else if true { 2 }";
|
||||||
|
|
||||||
|
assert_eq!(run(input, &mut Context::new()), Ok(None));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn if_else_if_else() {
|
||||||
|
let input = "if false { 1 } else if false { 2 } else { 3 }";
|
||||||
|
|
||||||
|
assert_eq!(run(input, &mut Context::new()), Ok(Some(Value::integer(3))));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn while_loop() {
|
fn while_loop() {
|
||||||
let input = "x = 0; while x < 5 { x += 1; } x";
|
let input = "x = 0; while x < 5 { x += 1; } x";
|
||||||
|
Loading…
Reference in New Issue
Block a user