Add const qualifiers where necessary
This commit is contained in:
parent
db6ff8deba
commit
f1fd15171c
4 changed files with 144 additions and 84 deletions
|
@ -44,9 +44,9 @@ class GcRoot : public GcRootBase {
|
||||||
static Result<GcRoot<T>> create(T* ptr);
|
static Result<GcRoot<T>> create(T* ptr);
|
||||||
Result<GcRoot<T>> copy() const { return GcRoot<T>::create((T*)_ptr); }
|
Result<GcRoot<T>> copy() const { return GcRoot<T>::create((T*)_ptr); }
|
||||||
|
|
||||||
T* get() { return (T*)_ptr; }
|
T* get() const { return (T*)_ptr; }
|
||||||
T& operator*() { return *(T*)_ptr; }
|
T& operator*() const { return *(T*)_ptr; }
|
||||||
T* operator->() { return (T*)_ptr; }
|
T* operator->() const { return (T*)_ptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
|
|
@ -199,7 +199,7 @@ Result<Value> Dict::get(Value& key) {
|
||||||
return TRY(Value::create(_value->data[pos * 2 + 1].get()));
|
return TRY(Value::create(_value->data[pos * 2 + 1].get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<Dict> Dict::insert(Value& key, Value& value) {
|
Result<Dict> Dict::insert(const Value& key, const Value& value) {
|
||||||
auto pos = TRY(find(key));
|
auto pos = TRY(find(key));
|
||||||
auto s = size();
|
auto s = size();
|
||||||
if (pos >= s) {
|
if (pos >= s) {
|
||||||
|
@ -232,7 +232,7 @@ Result<Dict> Dict::insert(Value& key, Value& value) {
|
||||||
return Dict(TRY(MkGcRoot(pod)));
|
return Dict(TRY(MkGcRoot(pod)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<uint64_t> Dict::find(Value& key) {
|
Result<uint64_t> Dict::find(const Value& key) {
|
||||||
uint64_t left = 0;
|
uint64_t left = 0;
|
||||||
uint64_t right = size();
|
uint64_t right = size();
|
||||||
uint64_t pos = (left + right) / 2;
|
uint64_t pos = (left + right) / 2;
|
||||||
|
@ -253,17 +253,17 @@ Result<uint64_t> Dict::find(Value& key) {
|
||||||
return left;
|
return left;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<short> Int64::cmp(Float& rhs) {
|
Result<short> Int64::cmp(const Float& rhs) const {
|
||||||
return (_value->value > rhs._value->value) -
|
return (_value->value > rhs._value->value) -
|
||||||
(_value->value < rhs._value->value);
|
(_value->value < rhs._value->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<short> Float::cmp(Int64& rhs) {
|
Result<short> Float::cmp(const Int64& rhs) const {
|
||||||
return (_value->value > rhs._value->value) -
|
return (_value->value > rhs._value->value) -
|
||||||
(_value->value < rhs._value->value);
|
(_value->value < rhs._value->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<short> Dict::cmp(Dict& rhs) {
|
Result<short> Dict::cmp(const Dict& rhs) const {
|
||||||
auto lsize = size() * 2;
|
auto lsize = size() * 2;
|
||||||
auto rsize = rhs.size() * 2;
|
auto rsize = rhs.size() * 2;
|
||||||
uint64_t i = 0;
|
uint64_t i = 0;
|
||||||
|
|
184
src/common.hpp
184
src/common.hpp
|
@ -31,23 +31,41 @@ short cmp_tag(Tag lhs, Tag rhs);
|
||||||
|
|
||||||
class Object {
|
class Object {
|
||||||
public:
|
public:
|
||||||
virtual Tag tag() = 0;
|
virtual Tag tag() const = 0;
|
||||||
virtual Result<Value> copy() const = 0;
|
virtual Result<Value> copy() const = 0;
|
||||||
virtual PodObject* pod() = 0;
|
virtual PodObject* pod() const = 0;
|
||||||
virtual void move(Object*) = 0;
|
virtual void move(Object*) = 0;
|
||||||
virtual ~Object() = default;
|
virtual ~Object() = default;
|
||||||
|
|
||||||
virtual Result<short> cmp(Object&) = 0;
|
virtual Result<short> cmp(const Object&) const = 0;
|
||||||
virtual Result<short> cmp(Nil&) { return cmp_tag(tag(), Tag::Nil); }
|
virtual Result<short> cmp(const Nil&) const {
|
||||||
virtual Result<short> cmp(Int64&) { return cmp_tag(tag(), Tag::Int64); }
|
return cmp_tag(tag(), Tag::Nil);
|
||||||
virtual Result<short> cmp(Float&) { return cmp_tag(tag(), Tag::Float); }
|
}
|
||||||
virtual Result<short> cmp(Bool&) { return cmp_tag(tag(), Tag::Bool); }
|
virtual Result<short> cmp(const Int64&) const {
|
||||||
virtual Result<short> cmp(String&) { return cmp_tag(tag(), Tag::String); }
|
return cmp_tag(tag(), Tag::Int64);
|
||||||
virtual Result<short> cmp(Symbol&) { return cmp_tag(tag(), Tag::Symbol); }
|
}
|
||||||
virtual Result<short> cmp(Syntax&) { return cmp_tag(tag(), Tag::Syntax); }
|
virtual Result<short> cmp(const Float&) const {
|
||||||
virtual Result<short> cmp(Pair&) { return cmp_tag(tag(), Tag::Pair); }
|
return cmp_tag(tag(), Tag::Float);
|
||||||
virtual Result<short> cmp(Array&) { return cmp_tag(tag(), Tag::Array); }
|
}
|
||||||
virtual Result<short> cmp(ByteArray&) {
|
virtual Result<short> cmp(const Bool&) const {
|
||||||
|
return cmp_tag(tag(), Tag::Bool);
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const String&) const {
|
||||||
|
return cmp_tag(tag(), Tag::String);
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Symbol&) const {
|
||||||
|
return cmp_tag(tag(), Tag::Symbol);
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Syntax&) const {
|
||||||
|
return cmp_tag(tag(), Tag::Syntax);
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Pair&) const {
|
||||||
|
return cmp_tag(tag(), Tag::Pair);
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Array&) const {
|
||||||
|
return cmp_tag(tag(), Tag::Array);
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const ByteArray&) const {
|
||||||
return cmp_tag(tag(), Tag::ByteArray);
|
return cmp_tag(tag(), Tag::ByteArray);
|
||||||
}
|
}
|
||||||
virtual Result<Value> get(Value& key);
|
virtual Result<Value> get(Value& key);
|
||||||
|
@ -62,11 +80,13 @@ class Nil : public Object {
|
||||||
Nil(Nil&& rhs) : _value(std::move(rhs._value)) {}
|
Nil(Nil&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Nil(GcRoot<PodNil>&& val) : _value(std::move(val)) {}
|
Nil(GcRoot<PodNil>&& val) : _value(std::move(val)) {}
|
||||||
|
|
||||||
virtual Tag tag() final { return Tag::Nil; }
|
virtual Tag tag() const final { return Tag::Nil; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
|
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Nil& rhs) final { return 0; }
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Nil& rhs) const final { return 0; }
|
||||||
|
|
||||||
static Result<Nil> create(PodNil* obj) { return Nil(TRY(MkGcRoot(obj))); }
|
static Result<Nil> create(PodNil* obj) { return Nil(TRY(MkGcRoot(obj))); }
|
||||||
|
|
||||||
|
@ -96,10 +116,12 @@ class Array : public Object {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Tag tag() final { return Tag::Array; }
|
virtual Tag tag() const final { return Tag::Array; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Array& rhs) final { return 0; }
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Array& rhs) const final { return 0; }
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Array(std::move(_value)); }
|
virtual void move(Object* obj) final { new (obj) Array(std::move(_value)); }
|
||||||
|
|
||||||
|
@ -170,10 +192,12 @@ class ByteArray : public Object {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Tag tag() final { return Tag::ByteArray; }
|
virtual Tag tag() const final { return Tag::ByteArray; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(ByteArray& rhs) final { return 0; }
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const ByteArray& rhs) const final { return 0; }
|
||||||
|
|
||||||
virtual void move(Object* obj) final {
|
virtual void move(Object* obj) final {
|
||||||
new (obj) ByteArray(std::move(_value));
|
new (obj) ByteArray(std::move(_value));
|
||||||
|
@ -277,10 +301,12 @@ class Dict : public Object {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Tag tag() final { return Tag::Dict; }
|
virtual Tag tag() const final { return Tag::Dict; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Dict& rhs) final;
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Dict& rhs) const final;
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Dict(std::move(_value)); }
|
virtual void move(Object* obj) final { new (obj) Dict(std::move(_value)); }
|
||||||
|
|
||||||
|
@ -299,7 +325,7 @@ class Dict : public Object {
|
||||||
|
|
||||||
virtual Result<Value> get(Value& key) final;
|
virtual Result<Value> get(Value& key) final;
|
||||||
|
|
||||||
Result<Dict> insert(Value& key, Value& value);
|
Result<Dict> insert(const Value& key, const Value& value);
|
||||||
|
|
||||||
template <class K, class V>
|
template <class K, class V>
|
||||||
Result<Dict> insert(const K& key, const V& value);
|
Result<Dict> insert(const K& key, const V& value);
|
||||||
|
@ -323,9 +349,9 @@ class Dict : public Object {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Result<uint64_t> find(Value& key);
|
Result<uint64_t> find(const Value& key);
|
||||||
|
|
||||||
uint64_t size() { return _value->size; }
|
uint64_t size() const { return _value->size; }
|
||||||
GcRoot<PodDict> _value;
|
GcRoot<PodDict> _value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -340,10 +366,12 @@ class String : public Object {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Tag tag() final { return Tag::String; }
|
virtual Tag tag() const final { return Tag::String; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(String& rhs) final {
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const String& rhs) const final {
|
||||||
auto lsize = size();
|
auto lsize = size();
|
||||||
auto rsize = rhs.size();
|
auto rsize = rhs.size();
|
||||||
uint64_t i = 0;
|
uint64_t i = 0;
|
||||||
|
@ -390,7 +418,7 @@ class String : public Object {
|
||||||
return String(TRY(MkGcRoot(pod)));
|
return String(TRY(MkGcRoot(pod)));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t size() { return _value->size; }
|
uint64_t size() const { return _value->size; }
|
||||||
virtual Result<Value> copy() const final;
|
virtual Result<Value> copy() const final;
|
||||||
|
|
||||||
Result<char32_t> operator[](uint64_t idx) {
|
Result<char32_t> operator[](uint64_t idx) {
|
||||||
|
@ -461,10 +489,12 @@ class Symbol : public Object {
|
||||||
Symbol() {}
|
Symbol() {}
|
||||||
Symbol(Symbol&& rhs) : _value(std::move(rhs._value)) {}
|
Symbol(Symbol&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Symbol(GcRoot<PodSymbol>&& val) : _value(std::move(val)) {}
|
Symbol(GcRoot<PodSymbol>&& val) : _value(std::move(val)) {}
|
||||||
virtual Tag tag() final { return Tag::Symbol; }
|
virtual Tag tag() const final { return Tag::Symbol; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Symbol& rhs) final {
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Symbol& rhs) const final {
|
||||||
auto lsize = size();
|
auto lsize = size();
|
||||||
auto rsize = rhs.size();
|
auto rsize = rhs.size();
|
||||||
uint64_t i = 0;
|
uint64_t i = 0;
|
||||||
|
@ -484,7 +514,7 @@ class Symbol : public Object {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
virtual Result<short> cmp(const char* rhs) final {
|
virtual Result<short> cmp(const char* rhs) const final {
|
||||||
auto lsize = size();
|
auto lsize = size();
|
||||||
auto rsize = strlen(rhs);
|
auto rsize = strlen(rhs);
|
||||||
uint64_t i = 0;
|
uint64_t i = 0;
|
||||||
|
@ -533,7 +563,7 @@ class Symbol : public Object {
|
||||||
static Result<Symbol> create(String& rhs);
|
static Result<Symbol> create(String& rhs);
|
||||||
virtual Result<Value> copy() const final;
|
virtual Result<Value> copy() const final;
|
||||||
|
|
||||||
uint64_t size() { return _value->size; }
|
uint64_t size() const { return _value->size; }
|
||||||
|
|
||||||
Result<char32_t> operator[](uint64_t idx) {
|
Result<char32_t> operator[](uint64_t idx) {
|
||||||
if (idx >= _value->size) return ERROR(IndexOutOfRange);
|
if (idx >= _value->size) return ERROR(IndexOutOfRange);
|
||||||
|
@ -550,10 +580,12 @@ class Syntax : public Object {
|
||||||
Syntax(Syntax&& rhs) : _value(std::move(rhs._value)) {}
|
Syntax(Syntax&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Syntax(GcRoot<PodSyntax>&& val) : _value(std::move(val)) {}
|
Syntax(GcRoot<PodSyntax>&& val) : _value(std::move(val)) {}
|
||||||
Syntax(String filename, String modulename, Value expression);
|
Syntax(String filename, String modulename, Value expression);
|
||||||
virtual Tag tag() final { return Tag::Syntax; }
|
virtual Tag tag() const final { return Tag::Syntax; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Syntax& rhs) final { return 0; }
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Syntax& rhs) const final { return 0; }
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Syntax(std::move(_value)); }
|
virtual void move(Object* obj) final { new (obj) Syntax(std::move(_value)); }
|
||||||
|
|
||||||
|
@ -574,10 +606,12 @@ class Pair : public Object {
|
||||||
Pair() {}
|
Pair() {}
|
||||||
Pair(Pair&& rhs) : _value(std::move(rhs._value)) {}
|
Pair(Pair&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Pair(GcRoot<PodPair>&& val) : _value(std::move(val)) {}
|
Pair(GcRoot<PodPair>&& val) : _value(std::move(val)) {}
|
||||||
virtual Tag tag() final { return Tag::Pair; }
|
virtual Tag tag() const final { return Tag::Pair; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Pair& rhs) final { return 0; }
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Pair& rhs) const final { return 0; }
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Pair(std::move(_value)); }
|
virtual void move(Object* obj) final { new (obj) Pair(std::move(_value)); }
|
||||||
|
|
||||||
|
@ -600,14 +634,16 @@ class Int64 : public Object {
|
||||||
Int64() {}
|
Int64() {}
|
||||||
Int64(Int64&& rhs) : _value(std::move(rhs._value)) {}
|
Int64(Int64&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Int64(GcRoot<PodInt64>&& val) : _value(std::move(val)) {}
|
Int64(GcRoot<PodInt64>&& val) : _value(std::move(val)) {}
|
||||||
virtual Tag tag() final { return Tag::Int64; }
|
virtual Tag tag() const final { return Tag::Int64; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Int64& rhs) final {
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Int64& rhs) const final {
|
||||||
return (_value->value > rhs._value->value) -
|
return (_value->value > rhs._value->value) -
|
||||||
(_value->value < rhs._value->value);
|
(_value->value < rhs._value->value);
|
||||||
}
|
}
|
||||||
virtual Result<short> cmp(Float& rhs) final;
|
virtual Result<short> cmp(const Float& rhs) const final;
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Int64(std::move(_value)); }
|
virtual void move(Object* obj) final { new (obj) Int64(std::move(_value)); }
|
||||||
|
|
||||||
|
@ -638,14 +674,16 @@ class Float : public Object {
|
||||||
Float() {}
|
Float() {}
|
||||||
Float(Float&& rhs) : _value(std::move(rhs._value)) {}
|
Float(Float&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Float(GcRoot<PodFloat>&& val) : _value(std::move(val)) {}
|
Float(GcRoot<PodFloat>&& val) : _value(std::move(val)) {}
|
||||||
virtual Tag tag() final { return Tag::Float; }
|
virtual Tag tag() const final { return Tag::Float; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Float& rhs) final {
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Float& rhs) const final {
|
||||||
return (_value->value > rhs._value->value) -
|
return (_value->value > rhs._value->value) -
|
||||||
(_value->value < rhs._value->value);
|
(_value->value < rhs._value->value);
|
||||||
}
|
}
|
||||||
virtual Result<short> cmp(Int64& rhs) final;
|
virtual Result<short> cmp(const Int64& rhs) const final;
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Float(std::move(_value)); }
|
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(Bool&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Bool(GcRoot<PodBool>&& val) : _value(std::move(val)) {}
|
Bool(GcRoot<PodBool>&& val) : _value(std::move(val)) {}
|
||||||
|
|
||||||
virtual Tag tag() final { return Tag::Bool; }
|
virtual Tag tag() const final { return Tag::Bool; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Bool& rhs) final { return 0; }
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Bool& rhs) const final { return 0; }
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Bool(std::move(_value)); }
|
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(Opcode&& rhs) : _value(std::move(rhs._value)) {}
|
||||||
Opcode(GcRoot<PodOpcode>&& val) : _value(std::move(val)) {}
|
Opcode(GcRoot<PodOpcode>&& val) : _value(std::move(val)) {}
|
||||||
|
|
||||||
virtual Tag tag() final { return Tag::Opcode; }
|
virtual Tag tag() const final { return Tag::Opcode; }
|
||||||
virtual PodObject* pod() final { return _value.get(); }
|
virtual PodObject* pod() const final { return _value.get(); }
|
||||||
virtual Result<short> cmp(Object& rhs) final { return -TRY(rhs.cmp(*this)); }
|
virtual Result<short> cmp(const Object& rhs) const final {
|
||||||
virtual Result<short> cmp(Opcode& rhs) final { return 0; }
|
return -TRY(rhs.cmp(*this));
|
||||||
|
}
|
||||||
|
virtual Result<short> cmp(const Opcode& rhs) const final { return 0; }
|
||||||
|
|
||||||
virtual void move(Object* obj) final { new (obj) Opcode(std::move(_value)); }
|
virtual void move(Object* obj) final { new (obj) Opcode(std::move(_value)); }
|
||||||
|
|
||||||
|
@ -787,13 +829,13 @@ class Value {
|
||||||
return dynamic_cast<T*>((Object*)buf);
|
return dynamic_cast<T*>((Object*)buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
PodObject* pod() { return ((Object*)buf)->pod(); }
|
PodObject* pod() const { return ((Object*)buf)->pod(); }
|
||||||
Tag tag() { return ((Object*)buf)->tag(); }
|
Tag tag() { return ((Object*)buf)->tag(); }
|
||||||
|
|
||||||
Object& operator*() { return *(Object*)(buf); }
|
Object& operator*() { return *(Object*)(buf); }
|
||||||
Object* operator->() { return (Object*)(buf); }
|
Object* operator->() { return (Object*)(buf); }
|
||||||
|
|
||||||
Result<short> cmp(Value& rhs) {
|
Result<short> cmp(const Value& rhs) const {
|
||||||
return ((Object*)buf)->cmp(*(Object*)rhs.buf);
|
return ((Object*)buf)->cmp(*(Object*)rhs.buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,19 @@
|
||||||
|
|
||||||
struct Context {
|
struct Context {
|
||||||
Context() {}
|
Context() {}
|
||||||
Context(Value&& env, Array&& constants)
|
Context(Value&& env, Array&& constants, Dict&& constants_dict)
|
||||||
: env(std::move(env)),
|
: env(std::move(env)),
|
||||||
constants(std::move(constants)),
|
constants(std::move(constants)),
|
||||||
maxreg(0),
|
constants_dict(std::move(constants_dict)),
|
||||||
maxconst(0) {}
|
maxreg(0) {}
|
||||||
|
|
||||||
static Result<Context> create() {
|
static Result<Context> create() {
|
||||||
auto env = TRY(Nil::create());
|
auto env = TRY(Nil::create());
|
||||||
auto constants = TRY(Array::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() {
|
uint64_t alloc_reg() {
|
||||||
|
@ -21,10 +23,26 @@ struct Context {
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<int64_t> add_const(Value& val) {
|
||||||
|
auto idx = constants_dict.get(val);
|
||||||
|
|
||||||
|
if (idx.has_value()) {
|
||||||
|
if (!idx.value().is<Int64>()) return ERROR(TypeMismatch);
|
||||||
|
|
||||||
|
return idx.value().to<Int64>()->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;
|
Value env;
|
||||||
Array constants;
|
Array constants;
|
||||||
|
Dict constants_dict;
|
||||||
uint64_t maxreg;
|
uint64_t maxreg;
|
||||||
uint64_t maxconst;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Result<Array> add_opcode(Array& opcodes, Oc opcode, OpArg arg1 = {0, 0},
|
Result<Array> add_opcode(Array& opcodes, Oc opcode, OpArg arg1 = {0, 0},
|
||||||
|
|
Loading…
Reference in a new issue