#include "Value.hpp" #include "Type.hpp" #include "Function.hpp" #include "Code.hpp" namespace jk { /*static*/ std::shared_ptr Value::make_nil() { auto value = std::make_shared(); value->m_type = std::make_shared(TYPE_NIL); return value; } /*static*/ std::shared_ptr Value::make_int(int val) { auto value = std::make_shared(); value->m_type = std::make_shared(TYPE_INT); value->m_int_val = val; return value; } /*static*/ std::shared_ptr Value::make_function(std::shared_ptr val) { auto value = std::make_shared(); value->m_type = std::make_shared(TYPE_FUNCTION); value->m_function_val = val; return value; } /*static*/ std::shared_ptr Value::make_code(std::shared_ptr val) { auto value = std::make_shared(); value->m_type = std::make_shared(TYPE_CODE); value->m_code_val = val; return value; } /*static*/ std::shared_ptr Value::make_ref(size_t val) { auto value = std::make_shared(); value->m_type = std::make_shared(TYPE_REF); value->m_ref_val = val; return value; } std::shared_ptr Value::as_function() const { return m_function_val; } std::shared_ptr Value::as_code() const { return m_code_val; } std::weak_ptr Value::type() const { return m_type; } std::string Value::string() const { switch (m_type->type()) { case TYPE_NIL: return ""; case TYPE_INT: return std::to_string(*m_int_val); default: std::cerr << "cannot stringify value '" << TypeTypeStr[m_type->type()] << "'" << std::endl; abort(); } } }