diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-04-19 17:51:33 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-04-19 17:51:33 +0200 |
| commit | f08ae95b9d8be5165f9c8cac4c755d0510c3a18a (patch) | |
| tree | cc4bdf617618535d128e1a5611f270c8a99df31f /src/eval/args.rs | |
| parent | 5a6330dbfce9ed30c77502b66db843fd72b2d267 (diff) | |
Fix argument sinks
Fixes #886.
Diffstat (limited to 'src/eval/args.rs')
| -rw-r--r-- | src/eval/args.rs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/eval/args.rs b/src/eval/args.rs index 8617bd93..bea2baa1 100644 --- a/src/eval/args.rs +++ b/src/eval/args.rs @@ -62,14 +62,23 @@ impl Args { } /// Consume n positional arguments if possible. - pub fn consume(&mut self, n: usize) -> SourceResult<EcoVec<Arg>> { - if n > self.items.len() { + pub fn consume(&mut self, n: usize) -> SourceResult<Vec<Arg>> { + let mut list = vec![]; + + let mut i = 0; + while i < self.items.len() && list.len() < n { + if self.items[i].name.is_none() { + list.push(self.items.remove(i)); + } else { + i += 1; + } + } + + if list.len() < n { bail!(self.span, "not enough arguments"); } - let vec = self.items.to_vec(); - let (left, right) = vec.split_at(n); - self.items = right.into(); - Ok(left.into()) + + Ok(list) } /// Consume and cast the first positional argument. |
