Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
1 files changed, 23 insertions, 26 deletions
-rw-r--r--spasm/src/spasm.cpp49
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