diff options
| Commit | 72d9bbcc3154142af79fb686d9dc7e4d1fa1badb (patch) | |
|---|---|---|
| Author | 2018-11-29 09:13:12 +0200 | |
| Committer | 2018-11-29 09:13:12 +0200 | |
| Files | 3cea4377cba9370f3f2248557f82831d617d89d1 /spasm/src/spasm.cpp | |
| IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.tar IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.tar.gz IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.zip | ||
| Parent | cdfd42d72030a031e5c5d810fcd53441902b5cff (diff) | |
Feature/strings (#75)
* The assembler supports string opcode
* disabled the string test until implmented
* strings can be printed
1 files changed, 23 insertions, 26 deletions
| -rw-r--r-- | spasm/src/spasm.cpp | 49 |
diff --git a/spasm/src/spasm.cpp b/spasm/src/spasm.cpp index 63e09a0..6a62c90 100644 --- a/spasm/src/spasm.cpp +++ b/spasm/src/spasm.cpp @@ -131,6 +131,13 @@ Spasm::RunResult Spasm::run() set_local(reg, value); break; } + case OpCodes::String: + { + const auto reg = read_reg(size); + const auto value = read_string(size); + set_local(reg, value); + break; + } case OpCodes::Add: { const auto arg0 = read_reg(size); @@ -461,6 +468,16 @@ void Spasm::push_data(data_t data) reg_t Spasm::read_reg(size_t size) { + return read_integer(size); +} + +data_t Spasm::read_number(size_t size) +{ + return data_t(double(read_integer(size))); +} + +int64_t Spasm::read_integer(size_t size) +{ switch (size) { case 0: @@ -488,33 +505,13 @@ reg_t Spasm::read_reg(size_t size) return 0; } -data_t Spasm::read_number(size_t size) +data_t Spasm::read_string(size_t size) { - switch (size) - { - case 0: - return data_t(double(m_ByteCode[m_PC++])); - case 1: - { - auto result = *reinterpret_cast<int16_t*>(&m_ByteCode[0] + m_PC); - m_PC += 2; - return data_t(double(result)); - } - case 2: - { - auto result = *reinterpret_cast<int32_t*>(&m_ByteCode[0] + m_PC); - m_PC += 4; - return data_t(double(result)); - } - case 3: - { - auto result = *reinterpret_cast<double*>(&m_ByteCode[0] + m_PC); - m_PC += 8; - return data_t(double(result)); - } - } - assert(false && "not reached"); - return data_t{}; + const auto length = read_integer(size); + const auto s = reinterpret_cast<const char*>(&m_ByteCode[m_PC]); + m_PC += length; + const auto value = m_Strings.Get(s, length); + return data_t(::Spasm::ValueType::String, (void*)value); } } // namespace SpasmImpl |
