|
@@ -306,6 +306,20 @@ static void sLoadIntRef(Script* sc) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void sLoadFloatRef(Script* sc) {
|
|
|
|
+ int address = 0;
|
|
|
|
+ if(sPopInt(sc, &address) && sCheckAddress(sc, address, sizeof(float))) {
|
|
|
|
+ sPush(sc, sc->stack + address, sizeof(float));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void sLoadBoolRef(Script* sc) {
|
|
|
|
+ int address = 0;
|
|
|
|
+ if(sPopInt(sc, &address) && sCheckAddress(sc, address, sizeof(bool))) {
|
|
|
|
+ sPush(sc, sc->stack + address, sizeof(bool));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
#define CASE_NUMBER_OP(name, op) \
|
|
#define CASE_NUMBER_OP(name, op) \
|
|
case OP_##name##_INT: NUMBER_OP(int, Int, op); break; \
|
|
case OP_##name##_INT: NUMBER_OP(int, Int, op); break; \
|
|
case OP_##name##_FLOAT: \
|
|
case OP_##name##_FLOAT: \
|
|
@@ -321,7 +335,9 @@ static void sLoadIntRef(Script* sc) {
|
|
case OP_STORE_##TYPE: sStore(sc, sizeof(type)); break; \
|
|
case OP_STORE_##TYPE: sStore(sc, sizeof(type)); break; \
|
|
case OP_RETURN_##TYPE: RETURN(type, Type); break; \
|
|
case OP_RETURN_##TYPE: RETURN(type, Type); break; \
|
|
case OP_PRINT_##TYPE: PRINT(type, Type, type##Printer); break; \
|
|
case OP_PRINT_##TYPE: PRINT(type, Type, type##Printer); break; \
|
|
- case OP_EQUAL_##TYPE: BOOL_OP(type, Type, ==); break;
|
|
|
|
|
|
+ case OP_EQUAL_##TYPE: BOOL_OP(type, Type, ==); break; \
|
|
|
|
+ case OP_REF_STORE_##TYPE: sStoreRef(sc, sizeof(type)); break; \
|
|
|
|
+ case OP_REF_LOAD_##TYPE: sLoad##Type##Ref(sc); break;
|
|
|
|
|
|
static void sConsumeInstruction(Script* sc) {
|
|
static void sConsumeInstruction(Script* sc) {
|
|
switch(sReadOperation(sc)) {
|
|
switch(sReadOperation(sc)) {
|
|
@@ -333,8 +349,6 @@ static void sConsumeInstruction(Script* sc) {
|
|
CASE_TYPE(INT, Int, int);
|
|
CASE_TYPE(INT, Int, int);
|
|
CASE_TYPE(BOOL, Bool, bool);
|
|
CASE_TYPE(BOOL, Bool, bool);
|
|
CASE_TYPE(FLOAT, Float, float);
|
|
CASE_TYPE(FLOAT, Float, float);
|
|
- case OP_LOAD_INT_REF: sLoadIntRef(sc); break;
|
|
|
|
- case OP_STORE_INT_REF: sStoreRef(sc, sizeof(int)); break;
|
|
|
|
case OP_NOTHING: break;
|
|
case OP_NOTHING: break;
|
|
case OP_PUSH_INT: PUSH_CONSTANT(int, Int); break;
|
|
case OP_PUSH_INT: PUSH_CONSTANT(int, Int); break;
|
|
case OP_PUSH_FLOAT: PUSH_CONSTANT(float, Float); break;
|
|
case OP_PUSH_FLOAT: PUSH_CONSTANT(float, Float); break;
|