summaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-05-25 14:13:01 +0200
committerLaurenz <laurmaedje@gmail.com>2022-05-25 14:56:37 +0200
commit30fdba4356683198a298eebb44e28cb8c191a0e1 (patch)
tree3c702ca8ecd3240b25bb3bee9cc26e3b608baef0 /src/eval
parentc010cbc17dcbb2f0d6005d21530143bf57cb5871 (diff)
Move deps from context to VM
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/func.rs1
-rw-r--r--src/eval/machine.rs10
-rw-r--r--src/eval/mod.rs21
3 files changed, 20 insertions, 12 deletions
diff --git a/src/eval/func.rs b/src/eval/func.rs
index 16575c80..f15549dc 100644
--- a/src/eval/func.rs
+++ b/src/eval/func.rs
@@ -230,6 +230,7 @@ impl Closure {
// Evaluate the body.
let mut sub = Machine::new(vm.ctx, route, scopes);
let result = self.body.eval(&mut sub);
+ vm.deps.extend(sub.deps);
// Handle control flow.
match sub.flow {
diff --git a/src/eval/machine.rs b/src/eval/machine.rs
index 14633978..904a64c8 100644
--- a/src/eval/machine.rs
+++ b/src/eval/machine.rs
@@ -13,6 +13,8 @@ pub struct Machine<'a> {
pub ctx: &'a mut Context,
/// The route of source ids at which the machine is located.
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.
@@ -22,7 +24,13 @@ pub struct Machine<'a> {
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, scopes, flow: None }
+ Self {
+ ctx,
+ route,
+ deps: vec![],
+ scopes,
+ flow: None,
+ }
}
/// Resolve a user-entered path to be relative to the compilation
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 702a76b2..e403c3cb 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -73,28 +73,26 @@ pub fn evaluate(
// Parse the file.
let source = ctx.sources.get(id);
let ast = source.ast()?;
-
- // Save the old dependencies.
- let prev_deps = std::mem::replace(&mut ctx.deps, vec![(id, source.rev())]);
+ let rev = source.rev();
// Evaluate the module.
let std = ctx.config.std.clone();
let scopes = Scopes::new(Some(&std));
let mut vm = Machine::new(ctx, route, scopes);
let result = ast.eval(&mut vm);
- let scope = vm.scopes.top;
- let flow = vm.flow;
-
- // Restore the and dependencies.
- let deps = std::mem::replace(&mut ctx.deps, prev_deps);
+ vm.deps.push((id, rev));
// Handle control flow.
- if let Some(flow) = flow {
+ if let Some(flow) = vm.flow {
return Err(flow.forbidden());
}
// Assemble the module.
- let module = Module { scope, content: result?, deps };
+ let module = Module {
+ scope: vm.scopes.top,
+ content: result?,
+ deps: vm.deps,
+ };
// Save the evaluated module.
ctx.modules.insert(id, module.clone());
@@ -987,7 +985,8 @@ fn import(vm: &mut Machine, path: &str, span: Span) -> TypResult<Module> {
// Evaluate the file.
let route = vm.route.clone();
let module = evaluate(vm.ctx, id, route).trace(|| Tracepoint::Import, span)?;
- vm.ctx.deps.extend(module.deps.iter().cloned());
+ vm.deps.extend(module.deps.iter().cloned());
+
Ok(module)
}