diff --git a/src/common.cpp b/src/common.cpp index b54eb5f..858e3b5 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -4,11 +4,11 @@ Syntax::Syntax(String filename, String modulename, Value expression) {} -Value Syntax::get_value() { - return pod_to_value(_value->expression.get(&*_value)); +Result Syntax::get_value(Arena& arena) { + return Value::create(arena, _value->expression.get(&*_value)); } -Result pod_to_value(PodObject* obj, Arena& arena) { +Result Value::create(Arena& arena, PodObject* obj) { switch (obj->header.tag) { case Tag::Nil: return Value(); @@ -32,7 +32,7 @@ Result syntax_unwrap(Arena& arena, Value& val) { Syntax* syntax = val.to(); if (syntax == 0) return val.copy(arena); - return syntax->get_value(); + return syntax->get_value(arena); } Result Nil::copy(Arena& arena) { return Value(Nil()); } diff --git a/src/common.hpp b/src/common.hpp index 72cc908..9279e36 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -141,7 +141,7 @@ class Syntax : public Object { return Syntax(TRY(MkGcRoot(obj, arena))); } - Value get_value(); + Result get_value(Arena& arena); virtual Result copy(Arena& arena) final; @@ -214,6 +214,8 @@ class Value { new (buf) T(std::move(obj)); } + static Result create(Arena& arena, PodObject* obj); + template bool is() { return dynamic_cast((Object*)buf) != nullptr; @@ -233,6 +235,4 @@ class Value { uint8_t buf[24]; }; -Value pod_to_value(PodObject* obj); - Result syntax_unwrap(Value& val);