diff --git a/src/arena.cpp b/src/arena.cpp index f3485b3..d7e0889 100644 --- a/src/arena.cpp +++ b/src/arena.cpp @@ -56,6 +56,8 @@ Result Arena::gc_root(GcRootList* node) { } Result Arena::gc_pod(PodObject* obj) { + if (obj == 0) return 0; + switch (obj->header.tag) { case Tag::Nil: return gc_nil((PodNil*)obj); @@ -89,8 +91,8 @@ Result Arena::gc_pod(PodObject* obj) { return gc_stdlib_function((PodStdlibFunction*)obj); case Tag::Module: return gc_module((PodModule*)obj); - case Tag::Stack: - return gc_stack((PodStack*)obj); + case Tag::StackFrame: + return gc_stack((PodStackFrame*)obj); case Tag::Error: return gc_error((PodError*)obj); } @@ -251,9 +253,10 @@ Result Arena::gc_module(PodModule* obj) { return nobj; } -Result Arena::gc_stack(PodStack* obj) { - auto nobj = TRY(alloc(sizeof(OffPtr) * obj->size)); - nobj->header.tag = Tag::Stack; +Result Arena::gc_stack(PodStackFrame* obj) { + auto nobj = TRY(alloc(sizeof(OffPtr) * obj->size)); + nobj->header.tag = Tag::StackFrame; + nobj->parent = TRY(gc_pod(obj->parent.get())); nobj->size = obj->size; nobj->top = obj->top; for (uint64_t i = 0; i < obj->top; i++) { diff --git a/src/arena.hpp b/src/arena.hpp index 2d8fd8f..40e67d6 100644 --- a/src/arena.hpp +++ b/src/arena.hpp @@ -159,7 +159,7 @@ class Arena { Result gc_function(PodFunction* obj); Result gc_stdlib_function(PodStdlibFunction* obj); Result gc_module(PodModule* obj); - Result gc_stack(PodStack* obj); + Result gc_stack(PodStackFrame* obj); Result gc_error(PodError* obj); void add_root(GcRootList* node) { _gcroot.insert(node); } diff --git a/src/common.cpp b/src/common.cpp index 8f67b29..0cc9ba3 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -42,8 +42,8 @@ Result Value::create(PodObject* obj) { return Value(TRY(StdlibFunction::create((PodStdlibFunction*)obj))); case Tag::Module: return Value(TRY(Module::create((PodModule*)obj))); - case Tag::Stack: - return Value(TRY(Stack::create((PodStack*)obj))); + case Tag::StackFrame: + return Value(TRY(StackFrame::create((PodStackFrame*)obj))); case Tag::Error: return Value(TRY(Error::create((PodError*)obj))); }; @@ -302,17 +302,33 @@ Result Module::cmp(const Module& rhs) const { return res; } -Result Stack::copy_value() const { - return Value(Stack(TRY(_value.copy()))); +Result StackFrame::create(uint64_t size) { + auto nil = Value(TRY(Nil::create())); + auto pod = TRY(arena_alloc(sizeof(OffPtr) * size)); + pod->header.tag = Tag::StackFrame; + + pod->parent = nil.pod(); + pod->size = size; + pod->top = 0; + + for (uint64_t i = 0; i < size; i++) { + pod->data[i] = 0; + } + + return StackFrame(TRY(MkGcRoot(pod))); } -Result Stack::get(uint64_t idx) const { +Result StackFrame::copy_value() const { + return Value(StackFrame(TRY(_value.copy()))); +} + +Result StackFrame::get(uint64_t idx) const { if (idx >= _value->top) return ERROR(KeyError); return Value::create(_value->data[idx].get()); } -Result Stack::set(uint64_t idx, const Value& val) { +Result StackFrame::set(uint64_t idx, const Value& val) { if (idx >= _value->size) return ERROR(KeyError); if (idx >= _value->top) { @@ -323,7 +339,7 @@ Result Stack::set(uint64_t idx, const Value& val) { return Result(); } -Result Stack::settop(uint64_t idx) { +Result StackFrame::settop(uint64_t idx) { uint64_t top = _value->top; for (uint64_t i = std::min(top, idx); i < std::max(top, idx); i++) { _value->data[i] = 0; diff --git a/src/common.hpp b/src/common.hpp index de4670c..40c8059 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -32,7 +32,7 @@ class Dict; class ByteArray; class Writer; class Opcode; -class Stack; +class StackFrame; class Error; class Function; class StdlibFunction; @@ -100,7 +100,7 @@ class Object { virtual Result cmp(const char* rhs) const { return ERROR(NotImplemented); } - virtual Result cmp(const Stack& rhs) const { + virtual Result cmp(const StackFrame& rhs) const { return ERROR(NotImplemented); } virtual Result cmp(const Error& rhs) const { @@ -1086,23 +1086,25 @@ class Module : public Object { GcRoot _value; }; -class Stack : public Object { +class StackFrame : public Object { public: - Stack() {} - Stack(Stack&& rhs) : _value(std::move(rhs._value)) {} - Stack(GcRoot&& val) : _value(std::move(val)) {} + StackFrame() {} + StackFrame(StackFrame&& rhs) : _value(std::move(rhs._value)) {} + StackFrame(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() const final { return Tag::Stack; } + virtual Tag tag() const final { return Tag::StackFrame; } virtual PodObject* pod() const final { return _value.get(); } virtual Result cmp(const Object& rhs) const final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(const Stack& rhs) const final { return 0; } + virtual Result cmp(const StackFrame& rhs) const final { return 0; } - virtual void move(Object* obj) final { new (obj) Stack(std::move(_value)); } + virtual void move(Object* obj) final { + new (obj) StackFrame(std::move(_value)); + } - static Result create(PodStack* obj) { - return Stack(TRY(MkGcRoot(obj))); + static Result create(PodStackFrame* obj) { + return StackFrame(TRY(MkGcRoot(obj))); } using Object::get; @@ -1111,19 +1113,7 @@ class Stack : public Object { Result settop(uint64_t idx); uint64_t gettop() { return _value->top; } - static Result create(uint64_t size) { - auto pod = TRY(arena_alloc(sizeof(OffPtr) * size)); - pod->header.tag = Tag::Stack; - - pod->size = size; - pod->top = 0; - - for (uint64_t i = 0; i < size; i++) { - pod->data[i] = 0; - } - - return Stack(TRY(MkGcRoot(pod))); - } + static Result create(uint64_t size); Result slice(uint64_t start, uint64_t end) { if (start > end || end > gettop()) return ERROR(IndexOutOfRange); @@ -1139,10 +1129,10 @@ class Stack : public Object { } virtual Result copy_value() const final; - Result copy() const; + Result copy() const; private: - GcRoot _value; + GcRoot _value; }; class Error : public Object { diff --git a/src/compiler.cpp b/src/compiler.cpp index a06425f..91fc31c 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -237,7 +237,7 @@ Result Compiler::compile_expr(Context& context, const Value& expr) { case Tag::Function: case Tag::StdlibFunction: case Tag::Module: - case Tag::Stack: + case Tag::StackFrame: case Tag::Error: return ERROR(TypeMismatch); } diff --git a/src/pod.hpp b/src/pod.hpp index 8432ce9..94f4fdf 100644 --- a/src/pod.hpp +++ b/src/pod.hpp @@ -23,7 +23,7 @@ enum class Tag : uint8_t { Function, StdlibFunction, Module, - Stack, + StackFrame, Error, }; @@ -192,10 +192,11 @@ class PodModule final : public PodObject { OffPtr fun; }; -class PodStack final : public PodObject { +class PodStackFrame final : public PodObject { public: - PodStack() : PodObject(Tag::Stack) {}; + PodStackFrame() : PodObject(Tag::StackFrame) {}; + OffPtr parent; uint64_t size; uint64_t top; OffPtr data[]; diff --git a/src/vm.hpp b/src/vm.hpp index 9be2906..17ecf1c 100644 --- a/src/vm.hpp +++ b/src/vm.hpp @@ -5,15 +5,15 @@ class VM { public: VM() {} - VM(Stack&& stack, Stack&& callstack) + VM(StackFrame&& stack, StackFrame&& callstack) : _stack(std::move(stack)), _callstack(std::move(callstack)) {} VM(VM&& vm) : _stack(std::move(vm._stack)), _callstack(std::move(vm._callstack)) {} VM(const VM&) = delete; static Result create() { - auto stack = TRY(Stack::create(16 * 1024)); - auto callstack = TRY(Stack::create(16 * 1024)); + auto stack = TRY(StackFrame::create(16 * 1024)); + auto callstack = TRY(StackFrame::create(16 * 1024)); return VM(std::move(stack), std::move(callstack)); } @@ -48,13 +48,11 @@ class VM { Result getreg(uint64_t idx); Result setreg(uint64_t idx, const Value& value); - Result globals() { - return _globals.copy(); - } + Result globals() { return _globals.copy(); } private: - Stack _stack; - Stack _callstack; + StackFrame _stack; + StackFrame _callstack; Function _fun; Array _code; Array _constants; diff --git a/src/writer.cpp b/src/writer.cpp index f091ad9..713a468 100644 --- a/src/writer.cpp +++ b/src/writer.cpp @@ -39,8 +39,8 @@ Result Writer::write_one(const Value& obj) { return write_stdlib_function(*obj.to()); case Tag::Module: return write_module(*obj.to()); - case Tag::Stack: - return write_stack(*obj.to()); + case Tag::StackFrame: + return write_stack(*obj.to()); case Tag::Error: return write_error(*obj.to()); }; @@ -376,7 +376,7 @@ Result Writer::write_module(const Module& val) { return res; } -Result Writer::write_stack(const Stack& val) { +Result Writer::write_stack(const StackFrame& val) { return TRY(String::create("#")); } diff --git a/src/writer.hpp b/src/writer.hpp index bc79004..2f3df43 100644 --- a/src/writer.hpp +++ b/src/writer.hpp @@ -27,7 +27,7 @@ class Writer { Result write_function(const Function& val); Result write_stdlib_function(const StdlibFunction& val); Result write_module(const Module& val); - Result write_stack(const Stack& val); + Result write_stack(const StackFrame& val); Result write_error(const Error& val); };