From f1fd15171cf6a98983b7c51c2cfce38b1f7fade0 Mon Sep 17 00:00:00 2001 From: Konstantin Nazarov Date: Sat, 10 Aug 2024 18:46:20 +0100 Subject: [PATCH] Add const qualifiers where necessary --- src/arena.hpp | 6 +- src/common.cpp | 10 +-- src/common.hpp | 184 +++++++++++++++++++++++++++++------------------ src/compiler.cpp | 28 ++++++-- 4 files changed, 144 insertions(+), 84 deletions(-) diff --git a/src/arena.hpp b/src/arena.hpp index 800831b..f21c009 100644 --- a/src/arena.hpp +++ b/src/arena.hpp @@ -44,9 +44,9 @@ class GcRoot : public GcRootBase { static Result> create(T* ptr); Result> copy() const { return GcRoot::create((T*)_ptr); } - T* get() { return (T*)_ptr; } - T& operator*() { return *(T*)_ptr; } - T* operator->() { return (T*)_ptr; } + T* get() const { return (T*)_ptr; } + T& operator*() const { return *(T*)_ptr; } + T* operator->() const { return (T*)_ptr; } }; template diff --git a/src/common.cpp b/src/common.cpp index cea7659..e143760 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -199,7 +199,7 @@ Result Dict::get(Value& key) { return TRY(Value::create(_value->data[pos * 2 + 1].get())); } -Result Dict::insert(Value& key, Value& value) { +Result Dict::insert(const Value& key, const Value& value) { auto pos = TRY(find(key)); auto s = size(); if (pos >= s) { @@ -232,7 +232,7 @@ Result Dict::insert(Value& key, Value& value) { return Dict(TRY(MkGcRoot(pod))); } -Result Dict::find(Value& key) { +Result Dict::find(const Value& key) { uint64_t left = 0; uint64_t right = size(); uint64_t pos = (left + right) / 2; @@ -253,17 +253,17 @@ Result Dict::find(Value& key) { return left; } -Result Int64::cmp(Float& rhs) { +Result Int64::cmp(const Float& rhs) const { return (_value->value > rhs._value->value) - (_value->value < rhs._value->value); } -Result Float::cmp(Int64& rhs) { +Result Float::cmp(const Int64& rhs) const { return (_value->value > rhs._value->value) - (_value->value < rhs._value->value); } -Result Dict::cmp(Dict& rhs) { +Result Dict::cmp(const Dict& rhs) const { auto lsize = size() * 2; auto rsize = rhs.size() * 2; uint64_t i = 0; diff --git a/src/common.hpp b/src/common.hpp index 1b41a8d..7e02f79 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -31,23 +31,41 @@ short cmp_tag(Tag lhs, Tag rhs); class Object { public: - virtual Tag tag() = 0; + virtual Tag tag() const = 0; virtual Result copy() const = 0; - virtual PodObject* pod() = 0; + virtual PodObject* pod() const = 0; virtual void move(Object*) = 0; virtual ~Object() = default; - virtual Result cmp(Object&) = 0; - virtual Result cmp(Nil&) { return cmp_tag(tag(), Tag::Nil); } - virtual Result cmp(Int64&) { return cmp_tag(tag(), Tag::Int64); } - virtual Result cmp(Float&) { return cmp_tag(tag(), Tag::Float); } - virtual Result cmp(Bool&) { return cmp_tag(tag(), Tag::Bool); } - virtual Result cmp(String&) { return cmp_tag(tag(), Tag::String); } - virtual Result cmp(Symbol&) { return cmp_tag(tag(), Tag::Symbol); } - virtual Result cmp(Syntax&) { return cmp_tag(tag(), Tag::Syntax); } - virtual Result cmp(Pair&) { return cmp_tag(tag(), Tag::Pair); } - virtual Result cmp(Array&) { return cmp_tag(tag(), Tag::Array); } - virtual Result cmp(ByteArray&) { + virtual Result cmp(const Object&) const = 0; + virtual Result cmp(const Nil&) const { + return cmp_tag(tag(), Tag::Nil); + } + virtual Result cmp(const Int64&) const { + return cmp_tag(tag(), Tag::Int64); + } + virtual Result cmp(const Float&) const { + return cmp_tag(tag(), Tag::Float); + } + virtual Result cmp(const Bool&) const { + return cmp_tag(tag(), Tag::Bool); + } + virtual Result cmp(const String&) const { + return cmp_tag(tag(), Tag::String); + } + virtual Result cmp(const Symbol&) const { + return cmp_tag(tag(), Tag::Symbol); + } + virtual Result cmp(const Syntax&) const { + return cmp_tag(tag(), Tag::Syntax); + } + virtual Result cmp(const Pair&) const { + return cmp_tag(tag(), Tag::Pair); + } + virtual Result cmp(const Array&) const { + return cmp_tag(tag(), Tag::Array); + } + virtual Result cmp(const ByteArray&) const { return cmp_tag(tag(), Tag::ByteArray); } virtual Result get(Value& key); @@ -62,11 +80,13 @@ class Nil : public Object { Nil(Nil&& rhs) : _value(std::move(rhs._value)) {} Nil(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() final { return Tag::Nil; } - virtual PodObject* pod() final { return _value.get(); } + virtual Tag tag() const final { return Tag::Nil; } + virtual PodObject* pod() const final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Nil& rhs) final { return 0; } + virtual Result cmp(const Object& rhs) const final { + return -TRY(rhs.cmp(*this)); + } + virtual Result cmp(const Nil& rhs) const final { return 0; } static Result create(PodNil* obj) { return Nil(TRY(MkGcRoot(obj))); } @@ -96,10 +116,12 @@ class Array : public Object { return *this; } - virtual Tag tag() final { return Tag::Array; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Array& rhs) final { return 0; } + virtual Tag tag() const final { return Tag::Array; } + 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 Array& rhs) const final { return 0; } virtual void move(Object* obj) final { new (obj) Array(std::move(_value)); } @@ -170,10 +192,12 @@ class ByteArray : public Object { return *this; } - virtual Tag tag() final { return Tag::ByteArray; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(ByteArray& rhs) final { return 0; } + virtual Tag tag() const final { return Tag::ByteArray; } + 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 ByteArray& rhs) const final { return 0; } virtual void move(Object* obj) final { new (obj) ByteArray(std::move(_value)); @@ -277,10 +301,12 @@ class Dict : public Object { return *this; } - virtual Tag tag() final { return Tag::Dict; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Dict& rhs) final; + virtual Tag tag() const final { return Tag::Dict; } + 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 Dict& rhs) const final; virtual void move(Object* obj) final { new (obj) Dict(std::move(_value)); } @@ -299,7 +325,7 @@ class Dict : public Object { virtual Result get(Value& key) final; - Result insert(Value& key, Value& value); + Result insert(const Value& key, const Value& value); template Result insert(const K& key, const V& value); @@ -323,9 +349,9 @@ class Dict : public Object { } private: - Result find(Value& key); + Result find(const Value& key); - uint64_t size() { return _value->size; } + uint64_t size() const { return _value->size; } GcRoot _value; }; @@ -340,10 +366,12 @@ class String : public Object { return *this; } - virtual Tag tag() final { return Tag::String; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(String& rhs) final { + virtual Tag tag() const final { return Tag::String; } + 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 String& rhs) const final { auto lsize = size(); auto rsize = rhs.size(); uint64_t i = 0; @@ -390,7 +418,7 @@ class String : public Object { return String(TRY(MkGcRoot(pod))); } - uint64_t size() { return _value->size; } + uint64_t size() const { return _value->size; } virtual Result copy() const final; Result operator[](uint64_t idx) { @@ -461,10 +489,12 @@ class Symbol : public Object { Symbol() {} Symbol(Symbol&& rhs) : _value(std::move(rhs._value)) {} Symbol(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() final { return Tag::Symbol; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Symbol& rhs) final { + virtual Tag tag() const final { return Tag::Symbol; } + 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 Symbol& rhs) const final { auto lsize = size(); auto rsize = rhs.size(); uint64_t i = 0; @@ -484,7 +514,7 @@ class Symbol : public Object { } return 0; } - virtual Result cmp(const char* rhs) final { + virtual Result cmp(const char* rhs) const final { auto lsize = size(); auto rsize = strlen(rhs); uint64_t i = 0; @@ -533,7 +563,7 @@ class Symbol : public Object { static Result create(String& rhs); virtual Result copy() const final; - uint64_t size() { return _value->size; } + uint64_t size() const { return _value->size; } Result operator[](uint64_t idx) { if (idx >= _value->size) return ERROR(IndexOutOfRange); @@ -550,10 +580,12 @@ class Syntax : public Object { Syntax(Syntax&& rhs) : _value(std::move(rhs._value)) {} Syntax(GcRoot&& val) : _value(std::move(val)) {} Syntax(String filename, String modulename, Value expression); - virtual Tag tag() final { return Tag::Syntax; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Syntax& rhs) final { return 0; } + virtual Tag tag() const final { return Tag::Syntax; } + 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 Syntax& rhs) const final { return 0; } virtual void move(Object* obj) final { new (obj) Syntax(std::move(_value)); } @@ -574,10 +606,12 @@ class Pair : public Object { Pair() {} Pair(Pair&& rhs) : _value(std::move(rhs._value)) {} Pair(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() final { return Tag::Pair; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Pair& rhs) final { return 0; } + virtual Tag tag() const final { return Tag::Pair; } + 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 Pair& rhs) const final { return 0; } virtual void move(Object* obj) final { new (obj) Pair(std::move(_value)); } @@ -600,14 +634,16 @@ class Int64 : public Object { Int64() {} Int64(Int64&& rhs) : _value(std::move(rhs._value)) {} Int64(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() final { return Tag::Int64; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Int64& rhs) final { + virtual Tag tag() const final { return Tag::Int64; } + 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 Int64& rhs) const final { return (_value->value > rhs._value->value) - (_value->value < rhs._value->value); } - virtual Result cmp(Float& rhs) final; + virtual Result cmp(const Float& rhs) const final; virtual void move(Object* obj) final { new (obj) Int64(std::move(_value)); } @@ -638,14 +674,16 @@ class Float : public Object { Float() {} Float(Float&& rhs) : _value(std::move(rhs._value)) {} Float(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() final { return Tag::Float; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Float& rhs) final { + virtual Tag tag() const final { return Tag::Float; } + 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 Float& rhs) const final { return (_value->value > rhs._value->value) - (_value->value < rhs._value->value); } - virtual Result cmp(Int64& rhs) final; + virtual Result cmp(const Int64& rhs) const final; virtual void move(Object* obj) final { new (obj) Float(std::move(_value)); } @@ -675,10 +713,12 @@ class Bool : public Object { Bool(Bool&& rhs) : _value(std::move(rhs._value)) {} Bool(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() final { return Tag::Bool; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Bool& rhs) final { return 0; } + virtual Tag tag() const final { return Tag::Bool; } + 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 Bool& rhs) const final { return 0; } virtual void move(Object* obj) final { new (obj) Bool(std::move(_value)); } @@ -706,10 +746,12 @@ class Opcode : public Object { Opcode(Opcode&& rhs) : _value(std::move(rhs._value)) {} Opcode(GcRoot&& val) : _value(std::move(val)) {} - virtual Tag tag() final { return Tag::Opcode; } - virtual PodObject* pod() final { return _value.get(); } - virtual Result cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); } - virtual Result cmp(Opcode& rhs) final { return 0; } + virtual Tag tag() const final { return Tag::Opcode; } + 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 Opcode& rhs) const final { return 0; } virtual void move(Object* obj) final { new (obj) Opcode(std::move(_value)); } @@ -787,13 +829,13 @@ class Value { return dynamic_cast((Object*)buf); } - PodObject* pod() { return ((Object*)buf)->pod(); } + PodObject* pod() const { return ((Object*)buf)->pod(); } Tag tag() { return ((Object*)buf)->tag(); } Object& operator*() { return *(Object*)(buf); } Object* operator->() { return (Object*)(buf); } - Result cmp(Value& rhs) { + Result cmp(const Value& rhs) const { return ((Object*)buf)->cmp(*(Object*)rhs.buf); } diff --git a/src/compiler.cpp b/src/compiler.cpp index da1bb1b..f0555d4 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -2,17 +2,19 @@ struct Context { Context() {} - Context(Value&& env, Array&& constants) + Context(Value&& env, Array&& constants, Dict&& constants_dict) : env(std::move(env)), constants(std::move(constants)), - maxreg(0), - maxconst(0) {} + constants_dict(std::move(constants_dict)), + maxreg(0) {} static Result create() { auto env = TRY(Nil::create()); auto constants = TRY(Array::create()); + auto constants_dict = TRY(Dict::create()); - return Context(std::move(env), std::move(constants)); + return Context(std::move(env), std::move(constants), + std::move(constants_dict)); } uint64_t alloc_reg() { @@ -21,10 +23,26 @@ struct Context { return reg; } + Result add_const(Value& val) { + auto idx = constants_dict.get(val); + + if (idx.has_value()) { + if (!idx.value().is()) return ERROR(TypeMismatch); + + return idx.value().to()->value(); + } + + int64_t i = constants.size(); + + constants = TRY(constants.append(val)); + constants_dict = TRY(constants_dict.insert(val, TRY(Value::create(i)))); + return i; + } + Value env; Array constants; + Dict constants_dict; uint64_t maxreg; - uint64_t maxconst; }; Result add_opcode(Array& opcodes, Oc opcode, OpArg arg1 = {0, 0},