diff --git a/src/vm/vm.cc b/src/vm/vm.cc index ac5fe27..705f49d 100644 --- a/src/vm/vm.cc +++ b/src/vm/vm.cc @@ -1,5 +1,7 @@ #include "vm.hh" +#include "vm_exceptions.hh" + namespace tyche { void VM::load_bytecode(ByteArray const& ba) @@ -10,7 +12,22 @@ void VM::load_bytecode(ByteArray const& ba) void VM::call(size_t n_params) { - // TODO + // TODO - parameters + + Value f = stack_.pop(); + if (f.type() != Type::Function) + throw VMTypeError(Type::Function, f.type()); + + loc_.emplace(f.as_function_id(), 0); + stack_.push_fp(); + run_until_return(); + stack_.pop_fp(); + loc_.pop(); +} + +void VM::run_until_return() +{ + } } // tyche diff --git a/src/vm/vm.hh b/src/vm/vm.hh index 5bfe52d..852b583 100644 --- a/src/vm/vm.hh +++ b/src/vm/vm.hh @@ -15,6 +15,8 @@ public: private: struct Location { uint32_t function_id; uint32_t pc; }; + void run_until_return(); + Stack stack_; Code code_; std::stack loc_; diff --git a/src/vm/vm_exceptions.hh b/src/vm/vm_exceptions.hh index dc4160f..7bebf3c 100644 --- a/src/vm/vm_exceptions.hh +++ b/src/vm/vm_exceptions.hh @@ -24,6 +24,13 @@ public: explicit VMStackOutOfRange() : VMRuntimeError("Item does not exist in stack") {} }; +class VMTypeError : public VMRuntimeError +{ +public: + explicit VMTypeError(Type expected, Type found) : VMRuntimeError("Type error") {} // TODO - print types +}; + + } #endif //TYCHE_VM_EXCEPTIONS_HH