Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
1 files changed, 51 insertions, 49 deletions
-rw-r--r--spasm/src/spasm.cpp100
diff --git a/spasm/src/spasm.cpp b/spasm/src/spasm.cpp
index e67c975..857143f 100644
--- a/spasm/src/spasm.cpp
+++ b/spasm/src/spasm.cpp
@@ -1,10 +1,13 @@
#include <algorithm>
#include <iostream>
+#include <cassert>
#include "spasm.hpp"
namespace SpasmImpl
{
+
+
PC_t Spasm::op_size = 21;
// Be sure the same number is on the previous and next lines
Operation Spasm::operations[] = {NULL,
@@ -105,16 +108,6 @@ void Spasm::deleteobj()
}
/*!
-** Returns the dstack, so that it can be examined after execution
-**
-** \return const reference to the data stack
-*/
-const Dstack& Spasm::get_dstack() const
-{
- return data_stack;
-}
-
-/*!
** Starts the machine. The machine stops if it reaches an invalid opcode
** or opcode 0 or the pc reaches beyond the end of the bytecode.
*/
@@ -139,7 +132,7 @@ void Spasm::run()
void Spasm::push()
{
++pc;
- data_stack.push(*reinterpret_cast<data_t*>(bytecode + pc));
+ push_data(*reinterpret_cast<data_t*>(bytecode + pc));
pc += sizeof(data_t) - 1;
}
@@ -148,7 +141,7 @@ void Spasm::push()
*/
void Spasm::pop()
{
- data_stack.pop();
+ data_stack.pop_back();
}
/*!
@@ -156,7 +149,7 @@ void Spasm::pop()
*/
void Spasm::dup()
{
- data_stack.push(data_stack.top());
+ push_data(data_stack.back());
}
/*!
@@ -167,7 +160,7 @@ void Spasm::read()
{
data_t x;
*istr >> x;
- data_stack.push(x);
+ push_data(x);
}
/*!
@@ -176,7 +169,8 @@ void Spasm::read()
*/
void Spasm::print()
{
- *ostr << data_stack.pop();
+ *ostr << data_stack.back();
+ pop();
}
/*!
@@ -185,9 +179,9 @@ void Spasm::print()
*/
void Spasm::plus()
{
- data_t x, y = data_stack.pop();
- x = data_stack.pop();
- data_stack.push(x + y);
+ data_t x, y = pop_data();
+ x = pop_data();
+ push_data(x + y);
}
/*!
@@ -196,9 +190,9 @@ void Spasm::plus()
*/
void Spasm::minus()
{
- data_t x, y = data_stack.pop();
- x = data_stack.pop();
- data_stack.push(x - y);
+ data_t x, y = pop_data();
+ x = pop_data();
+ push_data(x - y);
}
/*!
@@ -207,9 +201,9 @@ void Spasm::minus()
*/
void Spasm::multiply()
{
- data_t x, y = data_stack.pop();
- x = data_stack.pop();
- data_stack.push(x * y);
+ data_t y = pop_data(),
+ x = pop_data();
+ push_data(x * y);
}
/*!
@@ -218,9 +212,9 @@ void Spasm::multiply()
*/
void Spasm::divide()
{
- data_t x, y = data_stack.pop();
- x = data_stack.pop();
- data_stack.push(x / y);
+ data_t y = pop_data(),
+ x = pop_data();
+ push_data(x / y);
}
/*!
@@ -229,9 +223,9 @@ void Spasm::divide()
*/
void Spasm::modulus()
{
- data_t x, y = data_stack.pop();
- x = data_stack.pop();
- data_stack.push(x % y);
+ data_t y = pop_data(),
+ x = pop_data();
+ push_data(x % y);
}
/*!
@@ -242,7 +236,7 @@ void Spasm::modulus()
void Spasm::gotrue()
{
++pc;
- if (data_stack.pop())
+ if (pop_data())
pc = *(reinterpret_cast<PC_t*>(bytecode + pc)) - 1;
else
pc += sizeof(size_t) - 1;
@@ -256,7 +250,7 @@ void Spasm::gotrue()
void Spasm::gofalse()
{
++pc;
- if (!data_stack.pop())
+ if (!pop_data())
pc = *(reinterpret_cast<PC_t*>(bytecode + pc)) - 1;
else
pc += sizeof(size_t) - 1;
@@ -278,12 +272,15 @@ void Spasm::go()
*/
void Spasm::call()
{
+ assert(false && "not-implemented");
+#if 0
size_t fs; // new frame size
return_stack.push(pc); // using the ++pc in run()
- data_stack.pop(&fs, sizeof(fs));
- data_stack.pop(&pc, sizeof(pc));
+ pop_data(&fs, sizeof(fs));
+ pop_data(&pc, sizeof(pc));
frame.new_frame(fs);
--pc; // the ++pc in run()
+#endif
}
/*!
@@ -303,10 +300,7 @@ void Spasm::ret()
*/
void Spasm::load()
{
- size_t offset;
-
- data_stack.pop(&offset, sizeof(offset));
- data_stack.push(frame[offset]);
+ assert(false && "not-implemented");
}
/*!
@@ -314,11 +308,7 @@ void Spasm::load()
*/
void Spasm::store()
{
- data_t value = data_stack.pop();
- size_t offset;
-
- data_stack.pop(&offset, sizeof(offset));
- frame[offset] = value;
+ assert(false && "not-implemented");
}
/*!
@@ -327,10 +317,10 @@ void Spasm::store()
*/
void Spasm::less()
{
- data_t y = data_stack.pop();
- data_t x = data_stack.pop();
+ data_t y = pop_data();
+ data_t x = pop_data();
- data_stack.push(x < y);
+ push_data(x < y);
}
/*!
@@ -339,10 +329,22 @@ void Spasm::less()
*/
void Spasm::lesseq()
{
- data_t y = data_stack.pop();
- data_t x = data_stack.pop();
+ data_t y = pop_data();
+ data_t x = pop_data();
+
+ push_data(x <= y);
+}
+
+data_t Spasm::pop_data()
+{
+ auto result = data_stack.back();
+ data_stack.pop_back();
+ return result;
+}
- data_stack.push(x <= y);
+void Spasm::push_data(data_t data)
+{
+ data_stack.push_back(data);
}
} // namespace SpasmImpl