feat(tvix/eval): Validate closed formals
Validate "closed formals" (formal parameters without an ellipsis) via a new ValidateClosedFormals op, which checks the arguments (in an attr set at the top of the stack) against the formal parameters on the Lambda in the current frame, and returns a new UnexpectedArgument error (including the span of the formals themselves!!) if any arguments aren't allowed Change-Id: Idcc47a59167a83be1832a6229f137d84e426c56c Reviewed-on: https://cl.tvl.fyi/c/depot/+/7002 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
e63d14419f
commit
2a3d498104
7 changed files with 133 additions and 13 deletions
|
|
@ -2,9 +2,12 @@
|
|||
use std::{
|
||||
cell::{Ref, RefCell, RefMut},
|
||||
collections::HashMap,
|
||||
hash::Hash,
|
||||
rc::Rc,
|
||||
};
|
||||
|
||||
use codemap::Span;
|
||||
|
||||
use crate::{
|
||||
chunk::Chunk,
|
||||
upvalues::{UpvalueCarrier, Upvalues},
|
||||
|
|
@ -19,6 +22,23 @@ pub(crate) struct Formals {
|
|||
|
||||
/// Do the formals of this function accept extra arguments
|
||||
pub(crate) ellipsis: bool,
|
||||
|
||||
/// The span of the formals themselves, to use to emit errors
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
impl Formals {
|
||||
/// Returns true if the given arg is a valid argument to these formals.
|
||||
///
|
||||
/// This is true if it is either listed in the list of arguments, or the formals have an
|
||||
/// ellipsis
|
||||
pub(crate) fn contains<Q>(&self, arg: &Q) -> bool
|
||||
where
|
||||
Q: ?Sized + Hash + Eq,
|
||||
NixString: std::borrow::Borrow<Q>,
|
||||
{
|
||||
self.ellipsis || self.arguments.contains_key(&arg)
|
||||
}
|
||||
}
|
||||
|
||||
/// The opcodes for a thunk or closure, plus the number of
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue