From 170c5c3629f6ce7c53afbcab16eb19efedb99239 Mon Sep 17 00:00:00 2001 From: Rerumu <25379555+Rerumu@users.noreply.github.com> Date: Fri, 23 Jun 2023 15:49:32 -0400 Subject: [PATCH] Add temporary local limit for Luau --- codegen/luau/src/backend/statement.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/codegen/luau/src/backend/statement.rs b/codegen/luau/src/backend/statement.rs index 2b463e6..b25979c 100644 --- a/codegen/luau/src/backend/statement.rs +++ b/codegen/luau/src/backend/statement.rs @@ -359,6 +359,15 @@ impl Driver for Statement { } } +fn has_sane_variables(ast: &FuncData) -> bool { + let local_count = ast.local_data().iter().map(|v| v.0).sum::(); + let local_count = usize::try_from(local_count).unwrap(); + let param_count = ast.num_param(); + let temp_count = ast.num_stack(); + + temp_count + param_count + local_count < 170 +} + fn write_parameter_list(ast: &FuncData, w: &mut dyn Write) -> Result<()> { write!(w, "function(")?; write_ascending("loc", 0..ast.num_param(), w)?; @@ -396,6 +405,13 @@ fn write_variable_list(ast: &FuncData, mng: &mut Manager, w: &mut dyn Write) -> impl Driver for FuncData { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { + if !has_sane_variables(self) { + return Err(std::io::Error::new( + std::io::ErrorKind::Other, + "too many variables in function", + )); + } + let (table_map, has_branch) = br_target::visit(self); mng.indent();