better error messages

This commit is contained in:
2024-01-04 00:11:54 +01:00
parent cffb9c9151
commit 3bcb6686eb
4 changed files with 19 additions and 4 deletions

View File

@@ -44,23 +44,33 @@ public:
const Handle car() const {
if (!_target) return Handle(nullptr);
if (_target->_type != CellType::CONS) throw std::invalid_argument("Expected cons cell, got something else");
return dynamic_cast<ConsCell &>(*_target)._car.load();
}
const Handle cdr() const {
if (!_target) return Handle(nullptr);
if (_target->_type != CellType::CONS) throw std::invalid_argument("Expected cons cell, got something else");
return dynamic_cast<ConsCell &>(*_target)._cdr.load();
}
Handle car() {
if (!_target) return Handle(nullptr);
if (_target->_type != CellType::CONS) throw std::invalid_argument("Expected cons cell, got something else");
return dynamic_cast<ConsCell &>(*_target)._car.load();
}
Handle cdr() {
if (!_target) return Handle(nullptr);
if (_target->_type != CellType::CONS) throw std::invalid_argument("Expected cons cell, got something else");
return dynamic_cast<ConsCell &>(*_target)._cdr.load();
}
CellValType val() const { return dynamic_cast<NumAtomCell &>(*_target)._val; }
std::string_view strval() const { return dynamic_cast<StrAtomCell &>(*_target)._val; }
CellValType val() const {
if (_target->_type != CellType::NUMATOM) throw std::invalid_argument("Expected number cell, got something else");
return dynamic_cast<NumAtomCell &>(*_target)._val;
}
std::string_view strval() const {
if (_target->_type != CellType::STRATOM) throw std::invalid_argument("Expected string cell, got something else");
return dynamic_cast<StrAtomCell &>(*_target)._val;
}
CellType type() const {
if (!_target) return CellType::CONS;

View File

@@ -68,6 +68,7 @@ Handle Handle::makeNumCell(int64_t val) { return MemoryContext::get().create_cel
Handle Handle::makeStrCell(std::string val) { return MemoryContext::get().create_cell<StrAtomCell>(std::move(val)); }
void Handle::setcar(const Handle &car) {
if (_target->_type != CellType::CONS) throw std::invalid_argument("Expected cons cell, got something else");
MemoryContext::get().run_dirty<void>([&](std::function<void(Cell *)> lost) -> void {
lost(dynamic_cast<ConsCell &>(*_target)._car);
dynamic_cast<ConsCell &>(*_target)._car = car.get();
@@ -75,6 +76,7 @@ void Handle::setcar(const Handle &car) {
}
void Handle::setcdr(const Handle &cdr) {
if (_target->_type != CellType::CONS) throw std::invalid_argument("Expected cons cell, got something else");
MemoryContext::get().run_dirty<void>([&](std::function<void(Cell *)> lost) -> void {
lost(dynamic_cast<ConsCell &>(*_target)._cdr);
dynamic_cast<ConsCell &>(*_target)._cdr = cdr.get();

View File

@@ -64,7 +64,10 @@ std::string Parser::Tokenizer::getNext() {
return ret;
}
std::string_view Parser::Tokenizer::peek() const { return _tokens.front(); }
std::string_view Parser::Tokenizer::peek() const {
if (_tokens.empty()) throw std::invalid_argument("Unexpected end of input (or maybe missing \")\"?");
return _tokens.front();
}
void Parser::Tokenizer::load(std::string_view input) {
std::string_view::size_type curpos = input.find_first_not_of(std::string{' ', '\n', '\r'});

View File

@@ -242,7 +242,7 @@ void VM::step() {
std::getline(_instream, read);
_s.push(Parser::parse_str(read));
} else {
assert(false);
throw std::invalid_argument("Unexpected end of program");
}