From 294fb4f864b765b5e2de524b75de16116dd44385 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 29 Dec 2023 19:04:39 +0100 Subject: [PATCH] remove celltype --- src/vm/includes/Cell.h | 20 ++++++-------------- src/vm/includes/Handle.h | 25 +++++++++++++------------ src/vm/src/Compiler.cpp | 4 ++-- src/vm/src/MemoryContext.cpp | 7 +++---- 4 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/vm/includes/Cell.h b/src/vm/includes/Cell.h index d3baa57..e06d54a 100644 --- a/src/vm/includes/Cell.h +++ b/src/vm/includes/Cell.h @@ -11,19 +11,12 @@ #include #include #include -enum class CellType { - NUMATOM, - STRATOM, - CONS -}; using CellValType = int64_t; struct Cell { - explicit Cell(CellType type) : _type(type) {} virtual ~Cell() = 0; - CellType _type; std::atomic _live = false; virtual void print(std::ostream &out) = 0; @@ -31,7 +24,7 @@ struct Cell { struct NumAtomCell : public Cell { NumAtomCell() = delete; - explicit NumAtomCell(CellValType val) : Cell(CellType::NUMATOM), _val(val) {} + explicit NumAtomCell(CellValType val) : _val(val) {} CellValType _val; @@ -42,7 +35,7 @@ struct NumAtomCell : public Cell { struct StrAtomCell : public Cell { StrAtomCell() = delete; - explicit StrAtomCell(std::string val) : Cell(CellType::STRATOM), _val(std::move(val)) {} + explicit StrAtomCell(std::string val) : _val(std::move(val)) {} std::string _val; @@ -52,9 +45,8 @@ struct StrAtomCell : public Cell { }; struct ConsCell : public Cell { - ConsCell() : Cell(CellType::CONS) {} - explicit ConsCell(Cell *car) : Cell(CellType::CONS), _car(car) {} - ConsCell(Cell *car, Cell *cdr) : Cell(CellType::CONS), _car(car), _cdr(cdr) {} + explicit ConsCell(Cell *car) : _car(car) {} + ConsCell(Cell *car, Cell *cdr) : _car(car), _cdr(cdr) {} std::atomic _car = nullptr; std::atomic _cdr = nullptr; @@ -62,7 +54,7 @@ struct ConsCell : public Cell { void print(std::ostream &out) override { std::stringstream res; if (_car) { - if (_car.load()->_type == CellType::CONS) { + if (dynamic_cast(_car.load())) { res << "("; _car.load()->print(res); res << ")"; @@ -71,7 +63,7 @@ struct ConsCell : public Cell { } } if (_cdr) { - if (_cdr.load()->_type == CellType::CONS) { + if (dynamic_cast(_cdr.load())) { res << " "; _cdr.load()->print(res); } else { diff --git a/src/vm/includes/Handle.h b/src/vm/includes/Handle.h index 2504850..ac17ec3 100644 --- a/src/vm/includes/Handle.h +++ b/src/vm/includes/Handle.h @@ -24,15 +24,11 @@ public: bool operator==(const Handle &rhs) const { if (_target == rhs._target) { return true; - } else if ((_target != nullptr && rhs._target != nullptr) && (_target->_type == rhs._target->_type)) { - if (_target->_type == CellType::NUMATOM) { + } else if ((_target != nullptr && rhs._target != nullptr) && (typeid(_target) == typeid(rhs._target))) { + if (auto p = dynamic_cast(_target)) { return dynamic_cast(*_target)._val == dynamic_cast(*rhs._target)._val; - } else if (_target->_type == CellType::STRATOM) { + } else if (auto p = dynamic_cast(_target)) { return dynamic_cast(*_target)._val == dynamic_cast(*rhs._target)._val; - } else if (_target->_type == CellType::CONS) { - // This is questionable - return dynamic_cast(*_target)._car == dynamic_cast(*rhs._target)._car && - dynamic_cast(*_target)._cdr == dynamic_cast(*rhs._target)._cdr; } } return false; @@ -45,18 +41,23 @@ public: CellValType val() { return dynamic_cast(*_target)._val; } std::string_view strval() { return dynamic_cast(*_target)._val; } - CellType type() const { - if (!_target) return CellType::CONS; - return _target->_type; + bool num() const { + return dynamic_cast(_target) != nullptr; + } + bool str() const { + return dynamic_cast(_target) != nullptr; } bool atom() const { - return type() != CellType::CONS; + if (!_target) return false; + return dynamic_cast(_target) == nullptr; } bool null() { if (!_target) return true; - if (type() == CellType::CONS && car() == nullptr && cdr() == nullptr) return true; + if (auto p = dynamic_cast(_target)) { + return car() == nullptr && cdr() == nullptr; + } return false; } diff --git a/src/vm/src/Compiler.cpp b/src/vm/src/Compiler.cpp index b046af2..409ba88 100644 --- a/src/vm/src/Compiler.cpp +++ b/src/vm/src/Compiler.cpp @@ -34,10 +34,10 @@ Handle Compiler::compile(Handle src, Handle fake_env, Handle suffix) { if (expr.null()) { out.append(Handle("NIL")); } else if (expr.atom()) { - if (expr.type() == CellType::NUMATOM) { + if (expr.num()) { out.append(Handle("LDC")); out.append(expr); - } else if (expr.type() == CellType::STRATOM) { + } else if (expr.str()) { Handle idx = findIndex(expr, fake_env); if (idx == nullptr) { out.append(Handle("LDC")); diff --git a/src/vm/src/MemoryContext.cpp b/src/vm/src/MemoryContext.cpp index 01753a7..b0a0ab2 100644 --- a/src/vm/src/MemoryContext.cpp +++ b/src/vm/src/MemoryContext.cpp @@ -87,13 +87,12 @@ void MemoryContext::gc_thread_entry() { // std::cerr << out.str(); // } - if (c->_type == CellType::CONS) { - ConsCell &cc = dynamic_cast(*c); + if (auto cc = dynamic_cast(c)) { // {std::stringstream out; out << "processing car " << cc._car << "\n"; std::cerr<_car); // {std::stringstream out; out << "real car " << toVisit.back() << "\n"; std::cerr<_cdr); // {std::stringstream out; out << "real cdr " << toVisit.back() << "\n"; std::cerr<