summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-05-16 19:13:39 +0200
committerLaurenz <laurmaedje@gmail.com>2022-05-16 20:22:48 +0200
commit242b01549a472d4eeca1404b8f63427e23224253 (patch)
tree7d44ef801ce857469912a75233a1e7a1603e405e /src/lib.rs
parenta741bd6b83d1e374c8218b5439e26522499cc4ae (diff)
Safe `eval` function
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/lib.rs b/src/lib.rs
index eb6e8f72..06324c11 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -54,6 +54,7 @@ use std::any::Any;
use std::collections::HashMap;
use std::fmt::{self, Display, Formatter};
use std::hash::Hash;
+use std::mem;
use std::path::PathBuf;
use std::sync::Arc;
@@ -141,25 +142,26 @@ impl Context {
let source = self.sources.get(id);
let ast = source.ast()?;
+ // Save the old context.
+ let prev_flow = self.flow.take();
+ let prev_deps = mem::replace(&mut self.deps, vec![(id, source.rev())]);
+ self.route.push(id);
+
+ // Evaluate the module.
let std = self.std.clone();
let mut scp = Scopes::new(Some(&std));
+ let result = ast.eval(self, &mut scp);
- // Evaluate the module.
- let prev = std::mem::replace(&mut self.deps, vec![(id, source.rev())]);
- self.route.push(id);
- let content = ast.eval(self, &mut scp);
+ // Restore the old context and handle control flow.
self.route.pop().unwrap();
- let deps = std::mem::replace(&mut self.deps, prev);
- let flow = self.flow.take();
-
- // Assemble the module.
- let module = Module { scope: scp.top, content: content?, deps };
-
- // Handle unhandled flow.
- if let Some(flow) = flow {
+ let deps = mem::replace(&mut self.deps, prev_deps);
+ if let Some(flow) = mem::replace(&mut self.flow, prev_flow) {
return Err(flow.forbidden());
}
+ // Assemble the module.
+ let module = Module { scope: scp.top, content: result?, deps };
+
// Save the evaluated module.
self.modules.insert(id, module.clone());