added function argument errors back

This commit is contained in:
afonya 2025-06-18 14:31:30 +02:00
parent 6fe9395817
commit e583e3622e
Signed by: afonya
GPG key ID: EBB9C4CAFAAFB2DC
3 changed files with 47 additions and 8 deletions

View file

@ -27,6 +27,7 @@ pub enum ErrorSubType {
VariableAlreadyExists, VariableAlreadyExists,
ArgumentDuplication, ArgumentDuplication,
TooManyArguments, TooManyArguments,
NotEnoughArguments,
NoExpression, NoExpression,
//Machine errors //Machine errors
RegisterNotFound, RegisterNotFound,
@ -112,6 +113,7 @@ pub fn convert_subtypes_to_string(stype: &ErrorSubType) -> String {
ErrorSubType::FileError => String::from("File error"), ErrorSubType::FileError => String::from("File error"),
ErrorSubType::RuntimeError => String::from("Runtime error"), ErrorSubType::RuntimeError => String::from("Runtime error"),
ErrorSubType::NoExpression => String::from("No expression found"), ErrorSubType::NoExpression => String::from("No expression found"),
ErrorSubType::NotEnoughArguments => String::from("Not enough arguments"),
} }
} }
fn convert_subtypes_to_short(stype: &ErrorSubType) -> String { fn convert_subtypes_to_short(stype: &ErrorSubType) -> String {
@ -141,6 +143,7 @@ fn convert_subtypes_to_short(stype: &ErrorSubType) -> String {
ErrorSubType::FileError => String::from("FE:"), ErrorSubType::FileError => String::from("FE:"),
ErrorSubType::RuntimeError => String::from("RE:"), ErrorSubType::RuntimeError => String::from("RE:"),
ErrorSubType::NoExpression => String::from("NE:"), ErrorSubType::NoExpression => String::from("NE:"),
ErrorSubType::NotEnoughArguments => String::from("NA:"),
} }
} }
pub fn reverse_subtype_short(str: String) -> ErrorSubType { pub fn reverse_subtype_short(str: String) -> ErrorSubType {
@ -170,6 +173,7 @@ pub fn reverse_subtype_short(str: String) -> ErrorSubType {
"FE" => ErrorSubType::FileError, "FE" => ErrorSubType::FileError,
"RE" => ErrorSubType::RuntimeError, "RE" => ErrorSubType::RuntimeError,
"NE" => ErrorSubType::NoExpression, "NE" => ErrorSubType::NoExpression,
"NA" => ErrorSubType::NotEnoughArguments,
_ => panic!("Unknown error subtype short: {}", str), _ => panic!("Unknown error subtype short: {}", str),
} }
} }

View file

@ -821,15 +821,50 @@ impl Machine {
match mem { match mem {
VMMemory::Function(func) => { VMMemory::Function(func) => {
let arg = 0; let arg = 0;
let mut nocon = false;
for i in &self.stack { for i in &self.stack {
let mut new_mem = i.clone(); let mut new_mem = i.clone();
if self.functions[func.id].variables.len() <= arg || self.functions[func.id].variables[arg].start != 0 { if self.functions[func.id].variables.len() <= arg || self.functions[func.id].variables[arg].start != 0 {
break; let err = create_error(&format!("Too many arguments supplied for function: `{}`", func.id), operation.pos, ErrorType::SemanticError, ErrorSubType::TooManyArguments, &self.ctx[self.call_stack[executed_stack].func].clone());
if executed_func.try_catch > 0 {
fallback_to_catch(&mut self.memory, &mut self.state, &mut self.functions, &mut self.call_stack, &mut executed_stack, executed_func, err);
executed_func = &func_clone[self.call_stack[executed_stack].func];
nocon = true;
break;
} else {
print_error(&err, &self.ctx[self.call_stack[executed_stack].func].clone());
self.state = VMState::Error(err);
return;
}
} }
set_var_id(&mut new_mem, self.functions[func.id].variables[arg].id); set_var_id(&mut new_mem, self.functions[func.id].variables[arg].id);
self.memory.push(new_mem); self.memory.push(new_mem);
} }
for arg in &self.functions[func.id].variables {
if arg.start != 0 {
break;
}
match get_mem_pos_by_var_id(&self.memory, arg.id) {
None => {
let err = create_error(&format!("Not enough arguments supplied for function: `{}`", func.id), operation.pos, ErrorType::SemanticError, ErrorSubType::NotEnoughArguments, &self.ctx[self.call_stack[executed_stack].func].clone());
if executed_func.try_catch > 0 {
fallback_to_catch(&mut self.memory, &mut self.state, &mut self.functions, &mut self.call_stack, &mut executed_stack, executed_func, err);
executed_func = &func_clone[self.call_stack[executed_stack].func];
nocon = true;
break;
} else {
print_error(&err, &self.ctx[self.call_stack[executed_stack].func].clone());
self.state = VMState::Error(err);
return;
}
},
_ => {}
}
}
self.stack.clear(); self.stack.clear();
if nocon {
continue;
}
self.call_stack.push(CallStack { func: func.id, return_reg: operation.arg2 as usize, pc: 0 }); self.call_stack.push(CallStack { func: func.id, return_reg: operation.arg2 as usize, pc: 0 });
executed_func = &func_clone[func.id]; executed_func = &func_clone[func.id];

View file

@ -1,8 +1,8 @@
gethelj a = 1 lőcsve test(a,b) {
piszolj { ugass(a,b)
ugass(a)
gethelj test = szaft"a"szaft+1
} csecs(err) {
ugass(szaft"Hibás bemb"szaft, err)
} }
ugass(test) piszolj {
test(0)
} csecs (e) {
ugass(e)
}