From 8336211a4b0ec4b93e869bfafaa56f2e017185e8 Mon Sep 17 00:00:00 2001 From: Greg Shuflin Date: Tue, 2 Nov 2021 21:03:48 -0700 Subject: [PATCH] Disallow functions with more than 255 arguments --- schala-lang/language/src/parsing/mod.rs | 8 +++++++- schala-lang/language/src/parsing/test.rs | 12 +++++++++++- schala-lang/language/src/symbol_table/resolver.rs | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/schala-lang/language/src/parsing/mod.rs b/schala-lang/language/src/parsing/mod.rs index f5bee46..84f93b5 100644 --- a/schala-lang/language/src/parsing/mod.rs +++ b/schala-lang/language/src/parsing/mod.rs @@ -562,7 +562,13 @@ impl Parser { #[recursive_descent_method] fn formal_param_list(&mut self) -> ParseResult> { - Ok(delimited!(self, LParen, formal_param, Comma, RParen)) + let tok = self.token_handler.peek(); + let list = delimited!(self, LParen, formal_param, Comma, RParen); + if list.len() > 255 { + ParseError::new_with_token("A function cannot have more than 255 arguments", tok.clone()) + } else { + Ok(list) + } } #[recursive_descent_method] diff --git a/schala-lang/language/src/parsing/test.rs b/schala-lang/language/src/parsing/test.rs index fe78bdf..2d201a4 100644 --- a/schala-lang/language/src/parsing/test.rs +++ b/schala-lang/language/src/parsing/test.rs @@ -2,7 +2,7 @@ #![allow(clippy::upper_case_acronyms)] #![allow(clippy::vec_init_then_push)] //use test_case::test_case; -use std::rc::Rc; +use std::{fmt::Write, rc::Rc}; use pretty_assertions::assert_eq; @@ -788,6 +788,16 @@ fn functions() { ); } +#[test] +fn max_function_params() { + let mut buf = "fn longfunc(".to_string(); + for n in 0..256 { + write!(buf, "a{}, ", n).unwrap(); + } + write!(buf, ") {{ return 20 }}").unwrap(); + assert_fail!(&buf, "A function cannot have more than 255 arguments"); +} + #[test] fn functions_with_different_whitespace() { use ExpressionKind::*; diff --git a/schala-lang/language/src/symbol_table/resolver.rs b/schala-lang/language/src/symbol_table/resolver.rs index c2c1aff..32f7ca1 100644 --- a/schala-lang/language/src/symbol_table/resolver.rs +++ b/schala-lang/language/src/symbol_table/resolver.rs @@ -9,7 +9,7 @@ use crate::{ #[derive(Debug)] enum NameType { //TODO eventually this needs to support closures - Param(u8), //TODO handle implications of functions being limited to 255 params + Param(u8), LocalVariable(ItemId), LocalFunction(ItemId), Import(Fqsn),