diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-09-20 13:05:55 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-09-20 16:37:15 +0200 |
| commit | 757a701c1aa2a6fb80033c7e75666661818da6f9 (patch) | |
| tree | 0415fec94d3856f4ebc97a1744cf2ba75fe8e7aa /src/eval/machine.rs | |
| parent | e29f55bb294cc298daad97accf6d8a76976b409c (diff) | |
A New World
Diffstat (limited to 'src/eval/machine.rs')
| -rw-r--r-- | src/eval/machine.rs | 80 |
1 files changed, 0 insertions, 80 deletions
diff --git a/src/eval/machine.rs b/src/eval/machine.rs deleted file mode 100644 index 9c58c659..00000000 --- a/src/eval/machine.rs +++ /dev/null @@ -1,80 +0,0 @@ -use std::path::PathBuf; - -use super::{Scopes, Value}; -use crate::diag::{StrResult, TypError}; -use crate::source::SourceId; -use crate::syntax::Span; -use crate::util::PathExt; -use crate::Context; - -/// A virtual machine. -pub struct Machine<'a> { - /// The core context. - pub ctx: &'a mut Context, - /// The route of source ids the machine took to reach its current location. - pub route: Vec<SourceId>, - /// The dependencies of the current evaluation process. - pub deps: Vec<(SourceId, usize)>, - /// The stack of scopes. - pub scopes: Scopes<'a>, - /// A control flow event that is currently happening. - pub flow: Option<Flow>, -} - -impl<'a> Machine<'a> { - /// Create a new virtual machine. - pub fn new(ctx: &'a mut Context, route: Vec<SourceId>, scopes: Scopes<'a>) -> Self { - Self { - ctx, - route, - deps: vec![], - scopes, - flow: None, - } - } - - /// Resolve a user-entered path to be relative to the compilation - /// environment's root. - pub fn locate(&self, path: &str) -> StrResult<PathBuf> { - if let Some(&id) = self.route.last() { - if let Some(path) = path.strip_prefix('/') { - return Ok(self.ctx.config.root.join(path).normalize()); - } - - if let Some(dir) = self.ctx.sources.get(id).path().parent() { - return Ok(dir.join(path).normalize()); - } - } - - return Err("cannot access file system from here".into()); - } -} - -/// A control flow event that occurred during evaluation. -#[derive(Debug, Clone, PartialEq)] -pub enum Flow { - /// Stop iteration in a loop. - Break(Span), - /// Skip the remainder of the current iteration in a loop. - Continue(Span), - /// Stop execution of a function early, optionally returning an explicit - /// value. - Return(Span, Option<Value>), -} - -impl Flow { - /// Return an error stating that this control flow is forbidden. - pub fn forbidden(&self) -> TypError { - match *self { - Self::Break(span) => { - error!(span, "cannot break outside of loop") - } - Self::Continue(span) => { - error!(span, "cannot continue outside of loop") - } - Self::Return(span, _) => { - error!(span, "cannot return outside of function") - } - } - } -} |
