Fix callstack bug with returning to previous function
This commit is contained in:
parent
a11b2bfa7e
commit
7d88d483df
3 changed files with 6 additions and 2 deletions
|
@ -402,10 +402,13 @@ Result<Expression> Compiler::compile_list(Context& context, Pair& expr) {
|
|||
return compile_if(context, sym, expr);
|
||||
} else if (TRY(sym.cmp("lambda")) == 0) {
|
||||
return compile_lambda(context, sym, expr);
|
||||
} else {
|
||||
return compile_function_call(context, expr);
|
||||
}
|
||||
} else if (first.is<Pair>()) {
|
||||
return compile_function_call(context, expr);
|
||||
}
|
||||
|
||||
return ERROR(TypeMismatch);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,8 @@ StaticArena<64 * 1024 * 1024> arena;
|
|||
|
||||
Result<void> run() {
|
||||
// auto code_str = TRY(String::create("(* (+ 1 2 3) (/ 4 2))"));
|
||||
auto code_str = TRY(String::create("((lambda (x) (* x x)) 2)"));
|
||||
auto code_str =
|
||||
TRY(String::create("((lambda (f y) (f y)) (lambda (x) (* x x)) 2)"));
|
||||
|
||||
auto parsed = TRY(read_one(code_str));
|
||||
auto code_str_written = TRY(write_one(parsed));
|
||||
|
|
|
@ -87,7 +87,7 @@ Result<void> VM::vm_call(Opcode& oc) {
|
|||
|
||||
uint64_t old_base = _base;
|
||||
|
||||
Value fun_val = TRY(fun.copy());
|
||||
Value fun_val = TRY(_fun.copy());
|
||||
Value oldbase_val = TRY(Int64::create(old_base));
|
||||
Value pc_val = TRY(Int64::create(_pc));
|
||||
_callstack.set(_callstack.gettop(), fun_val);
|
||||
|
|
Loading…
Reference in a new issue