#include "backend/StackMachine.hpp"
#include "backend/Interpreter.hpp"
#include <ctime>
#include <functional>
#include <mutable/util/fn.hpp>
#include <regex>
#include "tables/Opcodes.tbl"
Go to the source code of this file.
|
#define | M_OPCODE(CODE, ...) { #CODE, StackMachine::Opcode:: CODE }, |
|
#define | M_OPCODE(CODE, ...) && CODE, |
|
#define | NEXT goto *labels[std::size_t(*op_++)] |
|
#define | PUSH(VAL, NUL) |
|
#define | POP() --top_ |
|
#define | TOP_IS_NULL (null_bits_[top_ - 1UL]) |
|
#define | TOP (values_[top_ - 1UL]) |
|
#define | LOAD(TO_TYPE, FROM_TYPE) |
|
#define | STORE(TO_TYPE, FROM_TYPE) |
|
#define | UNARY(OP, TYPE) |
|
#define | BINARY(OP, TYPE) |
|
#define | CMP(TYPE) |
|
|
const char * | tystr (const PrimitiveType *ty) |
| Return the type suffix for the given PrimitiveType ty .
|
|
◆ BINARY
#define BINARY |
( |
|
OP, |
|
|
|
TYPE |
|
) |
| |
Value: { \
M_insist(top_ >= 2); \
TYPE rhs =
TOP.as<TYPE>(); \
POP(); \
TYPE lhs =
TOP.as<TYPE>(); \
} \
◆ CMP
Value: { \
M_insist(top_ >= 2); \
TYPE rhs =
TOP.as<TYPE>(); \
POP(); \
TYPE lhs =
TOP.as<TYPE>(); \
TOP = int64_t(lhs >= rhs) - int64_t(lhs <= rhs); \
} \
◆ LOAD
#define LOAD |
( |
|
TO_TYPE, |
|
|
|
FROM_TYPE |
|
) |
| |
Value: { \
M_insist(top_ >= 1); \
const void *ptr =
TOP.as_p(); \
TOP = (TO_TYPE)(*
reinterpret_cast<const FROM_TYPE*
>(ptr)); \
} \
◆ M_OPCODE [1/2]
#define M_OPCODE |
( |
|
CODE, |
|
|
|
... |
|
) |
| { #CODE, StackMachine::Opcode:: CODE }, |
◆ M_OPCODE [2/2]
#define M_OPCODE |
( |
|
CODE, |
|
|
|
... |
|
) |
| && CODE, |
◆ NEXT
#define NEXT goto *labels[std::size_t(*op_++)] |
◆ POP
◆ PUSH
#define PUSH |
( |
|
VAL, |
|
|
|
NUL |
|
) |
| |
Value: { \
M_insist(top_ < required_stack_size(), "index out of bounds"); \
values_[top_] = (VAL); \
null_bits_[top_] = (NUL); \
++top_; \
}
◆ STORE
#define STORE |
( |
|
TO_TYPE, |
|
|
|
FROM_TYPE |
|
) |
| |
Value: { \
M_insist(top_ >= 2); \
TO_TYPE val =
TOP.as<FROM_TYPE>(); \
POP(); \
void *ptr =
TOP.as_p(); \
*reinterpret_cast<TO_TYPE*>(ptr) = val; \
POP(); \
} \
◆ TOP
#define TOP (values_[top_ - 1UL]) |
◆ TOP_IS_NULL
#define TOP_IS_NULL (null_bits_[top_ - 1UL]) |
◆ UNARY
#define UNARY |
( |
|
OP, |
|
|
|
TYPE |
|
) |
| |
Value: { \
M_insist(top_ >= 1); \
TYPE val =
TOP.as<TYPE>(); \
} \
◆ tystr()