refactor(tvix/eval): capture entire with_stack in upvalues
This completely rewrites the handling of "dynamic upvalues" to, instead of resolving them at thunk/closure instantiation time (which forces some values too early), capture the entire with stack of parent contexts if it exists. There are a couple of things in here that could be written more efficiently, but I'm first working through this to get to a bug related to with + recursion and the code complexity of some of the optimisations is distracting. Change-Id: Ia538e06c9146e3bf8decb9adf02dd726d2c651cf Reviewed-on: https://cl.tvl.fyi/c/depot/+/6486 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
d75b207a63
commit
07ea30370e
5 changed files with 122 additions and 148 deletions
|
|
@ -15,8 +15,6 @@ use std::{
|
|||
ops::Index,
|
||||
};
|
||||
|
||||
use smol_str::SmolStr;
|
||||
|
||||
use crate::opcode::{StackIdx, UpvalueIdx};
|
||||
|
||||
#[derive(Debug)]
|
||||
|
|
@ -102,17 +100,6 @@ pub enum UpvalueKind {
|
|||
|
||||
/// This upvalue captures an enclosing upvalue.
|
||||
Upvalue(UpvalueIdx),
|
||||
|
||||
/// This upvalue captures a dynamically resolved value (i.e.
|
||||
/// `with`).
|
||||
///
|
||||
/// It stores the identifier with which to perform a dynamic
|
||||
/// lookup, as well as the optional upvalue index in the enclosing
|
||||
/// function (if any).
|
||||
Dynamic {
|
||||
name: SmolStr,
|
||||
up: Option<UpvalueIdx>,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue