From 6931dc1b95d5a4058296e35acbb8defa3f247eff Mon Sep 17 00:00:00 2001 From: trdthg Date: Mon, 24 Jun 2024 17:19:54 +0000 Subject: [PATCH] fix CSR::RegisterMapByName key type to std::string --- src/machine/csr/controlstate.h | 6 +++--- src/machine/instruction.cpp | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/machine/csr/controlstate.h b/src/machine/csr/controlstate.h index 7f5cde29..90918fd9 100644 --- a/src/machine/csr/controlstate.h +++ b/src/machine/csr/controlstate.h @@ -255,16 +255,16 @@ namespace machine { namespace CSR { class RegisterMapByName { bool initialized = false; - std::unordered_map map; + std::unordered_map map; void init() { for (size_t i = 0; i < REGISTERS.size(); i++) { - map.emplace(REGISTERS[i].name, i); + map.emplace(std::string(REGISTERS[i].name), i); } initialized = true; } public: - size_t at(const char* name) { + size_t at(std::string name) { if (!initialized) init(); return map.at(name); } diff --git a/src/machine/instruction.cpp b/src/machine/instruction.cpp index c132096a..340065dd 100644 --- a/src/machine/instruction.cpp +++ b/src/machine/instruction.cpp @@ -1375,14 +1375,15 @@ bool parse_immediate_value( uint16_t parse_csr_address(const QString &field_token, uint &chars_taken) { if (field_token.at(0).isLetter()) { - size_t index = CSR::REGISTER_MAP_BY_NAME.at(qPrintable(field_token)); - if (index < 0) { + try { + size_t index = CSR::REGISTER_MAP_BY_NAME.at(field_token.toStdString()); + auto ® = CSR::REGISTERS[index]; + chars_taken = strlen(reg.name); + return reg.address.data; + } catch (std::out_of_range &e) { chars_taken = 0; return 0; } - auto ® = CSR::REGISTERS[index]; - chars_taken = strlen(reg.name); - return reg.address.data; } else { char *r; uint64_t val;