diff options
Diffstat (limited to 'pkg/lang/vm/exec.go')
| -rw-r--r-- | pkg/lang/vm/exec.go | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go index 79016fa..41b7019 100644 --- a/pkg/lang/vm/exec.go +++ b/pkg/lang/vm/exec.go @@ -43,7 +43,8 @@ func (vm *VM) execPushArray() error { } func (vm *VM) execPushFunction(pc int) { - vm.stack.Push(value.NewFunction(pc)) + // TODO: Make push ops into functions, where the argCount can be passed. + vm.stack.Push(value.NewFunction(pc, 0)) } func (vm *VM) execGetLocal(offset int) error { @@ -126,7 +127,7 @@ func (vm *VM) execGetMember(name string) error { member = member.WithEnv(envPtr) } - val := value.NewFunction(0).WithData(member) + val := value.NewFunction(0, 0).WithData(member) vm.stack.Push(val) parent.Drop(vm.memory) @@ -504,7 +505,7 @@ func (vm *VM) execLte() error { return nil } -func (vm *VM) execCall() error { +func (vm *VM) execCall(argCount uint) error { f, err := vm.stack.Pop() if err != nil { return err @@ -519,13 +520,31 @@ func (vm *VM) execCall() error { fn := f.Data().(value.FunctionData) + if argCount != fn.Args() { + return ErrNotEnoughArguments{ + Got: argCount, + Needed: fn.Args(), + } + } + + if err = vm.stack.ShiftTopCallBase(int(argCount)); err != nil { + return err + } + if err = vm.stack.PushCall(fn.Pc(), vm.pc, fn.Env()); err != nil { return err } if fn.Native() != nil { - // TODO: Arguments - val, err := fn.Native()([]value.Value{}) + args := make([]value.Value, argCount) + for i := 0; i < int(argCount); i++ { + args[i], err = vm.stack.Pop() + if err != nil { + return err + } + } + + val, err := fn.Native()(args) if err != nil { return err } |
