~starkingdoms/starkingdoms

7d1a546ec98123585ec1251183637d4327902dde — ghostly_zsh 1 year, 3 months ago fb87d2a
fix multiple parameter functions. change panic when 0 arguments provided to running kabel
4 files changed, 11 insertions(+), 14 deletions(-)

M kabel/src/codegen.rs
M kabel/src/main.rs
M kabel/src/vm.rs
M kabel/tmp.kab
M kabel/src/codegen.rs => kabel/src/codegen.rs +1 -1
@@ 602,7 602,7 @@ impl Codegen {
        }
    }
    pub fn visit_call(&mut self, ast: &AST, ident: AST, args: Vec<AST>) {
        for arg in args.iter().rev() {
        for arg in args.iter() {
            self.visit(arg.clone());
        }
        self.visit(ident);

M kabel/src/main.rs => kabel/src/main.rs +6 -1
@@ 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<String> = 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) {

M kabel/src/vm.rs => kabel/src/vm.rs +1 -5
@@ 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;

M kabel/tmp.kab => kabel/tmp.kab +3 -7
@@ 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);