From 7d1a546ec98123585ec1251183637d4327902dde Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Tue, 27 Aug 2024 15:15:20 -0500 Subject: [PATCH] fix multiple parameter functions. change panic when 0 arguments provided to running kabel --- kabel/src/codegen.rs | 2 +- kabel/src/main.rs | 7 ++++++- kabel/src/vm.rs | 6 +----- kabel/tmp.kab | 10 +++------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/kabel/src/codegen.rs b/kabel/src/codegen.rs index b0593c716aba047fc3ba61e5e027c659e01c181d..0f0d7699f0775f4fdda642d1b5f1d5b1842017a3 100644 --- a/kabel/src/codegen.rs +++ b/kabel/src/codegen.rs @@ -602,7 +602,7 @@ impl Codegen { } } pub fn visit_call(&mut self, ast: &AST, ident: AST, args: Vec) { - for arg in args.iter().rev() { + for arg in args.iter() { self.visit(arg.clone()); } self.visit(ident); diff --git a/kabel/src/main.rs b/kabel/src/main.rs index 2ce4fc3b1dbc831eb3fb3b29b23e2fbbca2b9746..133df716d6633cc208044112fc50e489eada123b 100644 --- a/kabel/src/main.rs +++ b/kabel/src/main.rs @@ -1,11 +1,15 @@ //use std::{env, fs}; -use std::{env, fs}; +use std::{env, fs, process::exit}; use kabel::{debug::{debug_ast, debug_bytecode, debug_stack, debug_token_array}, run_codegen, run_lexer, run_parser, run_semantic_analysis}; fn main() { let args: Vec = env::args().collect(); + if args.len() < 2 { + println!("Must provide kabel file to run"); + exit(1); + } let program = fs::read_to_string(args[1].clone()).unwrap(); @@ -62,6 +66,7 @@ fn main() { output += "\n"; } vm.unit_ptr = 0; + println!("{}", output); output += "\n"; match vm.run(&mut output) { diff --git a/kabel/src/vm.rs b/kabel/src/vm.rs index de068a26aed3d5f782de65a5a3a34ba7c142de27..6ddcd38d4b1d1a9a1fa3d83b6fe22c725fc22bd1 100644 --- a/kabel/src/vm.rs +++ b/kabel/src/vm.rs @@ -325,12 +325,8 @@ impl VM { if num_args as usize != function.arity { return Err(vm_error!(self, RuntimeErrorKind::IncorrectArity, "Function has {} arguments, {} provided", function.arity, num_args)) } - self.stack_offset = self.stack.len()-1; + self.stack_offset = self.stack.len() - num_args as usize; self.call_stack.push((self.unit_ptr, self.ip, self.stack_offset)); - for _ in 0..num_args { - let arg = self.stack.pop().expect("Missing arguments in call"); - self.stack.push(arg); - } self.stack.insert(self.stack.len()-num_args as usize, Value::Fun(function)); self.ip = 0; self.unit_ptr = function.unit_ptr as usize; diff --git a/kabel/tmp.kab b/kabel/tmp.kab index 330ab7b0b84aab79d4b539194a8015e3dfb0ecf8..b1c15739a79a219627756fba7639500a71d5b212 100644 --- a/kabel/tmp.kab +++ b/kabel/tmp.kab @@ -1,8 +1,4 @@ -var add_one = (num) => { - return num + 1; -}; -function add_two(num) { - return num + 2; +function apply(fn, value) { + return fn(value); } -print add_one(1); -print add_two(2); +print apply((value) => { return value + 1; }, 1);