Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm_impl.hpp
diff options
context:
space:
mode:
Commit72d9bbcc3154142af79fb686d9dc7e4d1fa1badb (patch)
Author
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-29 09:13:12 +0200
Committer
 GitHub <noreply@github.com>
2018-11-29 09:13:12 +0200
Files3cea4377cba9370f3f2248557f82831d617d89d1 /spasm/src/spasm_impl.hpp
IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.tar
IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.tar.gz
IPL-72d9bbcc3154142af79fb686d9dc7e4d1fa1badb.zip
Parentcdfd42d72030a031e5c5d810fcd53441902b5cff (diff)
Feature/strings (#75)
* The assembler supports string opcode * disabled the string test until implmented * strings can be printed
1 files changed, 29 insertions, 8 deletions
-rw-r--r--spasm/src/spasm_impl.hpp37
diff --git a/spasm/src/spasm_impl.hpp b/spasm/src/spasm_impl.hpp
index 2548828..04e809a 100644
--- a/spasm/src/spasm_impl.hpp
+++ b/spasm/src/spasm_impl.hpp
@@ -3,6 +3,7 @@
#include <iostream>
+#include <unordered_set>
#include "types.hpp"
namespace SpasmImpl
@@ -23,6 +24,7 @@ enum OpCodes : char
JumpT,
JumpF,
Const,
+ String,
Add,
Sub,
Mul,
@@ -30,14 +32,29 @@ enum OpCodes : char
Mod,
Less,
LessEq,
- Greater,
- GreaterEq,
- Equal,
- NotEqual,
+ Greater,
+ GreaterEq,
+ Equal,
+ NotEqual,
LastIndex = NotEqual,
};
static_assert(LastIndex < 0x3f, "Too many opcodes");
+class StringTable
+{
+ public:
+ const SPStringValue* Get(const char* s, size_t length)
+ {
+ SPString v(s, length);
+ auto pos = m_Strings.insert(SPStringValue(v));
+ return &(*pos.first);
+ }
+
+ private:
+ typedef std::unordered_set<SPStringValue> StringMap;
+ StringMap m_Strings;
+};
+
//! The Abstract Stack Machine
/*!
** The machine contains a data stack for operations and control flow and
@@ -93,6 +110,8 @@ class Spasm
//! Stack for function frames
FrameStack m_Frames;
+ StringTable m_Strings;
+
//! Input stream for read () operation
std::istream* istr;
@@ -125,11 +144,11 @@ class Spasm
void less(reg_t a0, reg_t a1, reg_t a2);
void lesseq(reg_t a0, reg_t a1, reg_t a2);
- void greater(reg_t a0, reg_t a1, reg_t a2);
- void greatereq(reg_t a0, reg_t a1, reg_t a2);
+ void greater(reg_t a0, reg_t a1, reg_t a2);
+ void greatereq(reg_t a0, reg_t a1, reg_t a2);
- void equal(reg_t a0, reg_t a1, reg_t a2);
- void not_equal(reg_t a0, reg_t a1, reg_t a2);
+ void equal(reg_t a0, reg_t a1, reg_t a2);
+ void not_equal(reg_t a0, reg_t a1, reg_t a2);
data_t get_local(reg_t reg);
void set_local(reg_t reg, data_t data);
@@ -137,6 +156,8 @@ class Spasm
void push_data(data_t);
reg_t read_reg(size_t size);
data_t read_number(size_t size);
+ int64_t read_integer(size_t size);
+ data_t read_string(size_t size);
};
} // namespace SpasmImpl