|
@@ -390,11 +390,11 @@ static void sStore(Script* sc, int length) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void sEqualPointer(Script* sc) {
|
|
|
|
|
|
+static void sEqualPointer(Script* sc, bool wanted) {
|
|
Pointer a;
|
|
Pointer a;
|
|
Pointer b;
|
|
Pointer b;
|
|
if(sPopPointer(sc, &a) && sPopPointer(sc, &b)) {
|
|
if(sPopPointer(sc, &a) && sPopPointer(sc, &b)) {
|
|
- sPushBool(sc, a.array == b.array && a.offset == b.offset);
|
|
|
|
|
|
+ sPushBool(sc, (a.array == b.array && a.offset == b.offset) == wanted);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -433,15 +433,24 @@ static void sCall(Script* sc) {
|
|
sPush##To(sc, value); \
|
|
sPush##To(sc, value); \
|
|
} \
|
|
} \
|
|
}
|
|
}
|
|
|
|
+#define CASE_CAST(TYPE1, Type1, type1, TYPE2, Type2, type2) \
|
|
|
|
+ case OP_##TYPE1##_TO_##TYPE2: CAST(Type1, type1, Type2); break; \
|
|
|
|
+ case OP_##TYPE2##_TO_##TYPE1: \
|
|
|
|
+ CAST(Type2, type2, Type1); \
|
|
|
|
+ break;
|
|
#define CASE_CHANGE(TYPE, Type, type) \
|
|
#define CASE_CHANGE(TYPE, Type, type) \
|
|
case OP_PUSH_PRE_CHANGE_##TYPE: PUSH_PRE_CHANGE(Type, type); break; \
|
|
case OP_PUSH_PRE_CHANGE_##TYPE: PUSH_PRE_CHANGE(Type, type); break; \
|
|
case OP_PUSH_POST_CHANGE_##TYPE: PUSH_POST_CHANGE(Type, type); break; \
|
|
case OP_PUSH_POST_CHANGE_##TYPE: PUSH_POST_CHANGE(Type, type); break; \
|
|
case OP_CHANGE_##TYPE: \
|
|
case OP_CHANGE_##TYPE: \
|
|
CHANGE(type); \
|
|
CHANGE(type); \
|
|
break;
|
|
break;
|
|
-#define CASE_NUMBER_OP(name, op) \
|
|
|
|
|
|
+#define CASE_INTEGRAL_OP(name, op) \
|
|
case OP_##name##_INT32: NUMBER_OP(int32, Int32, op); break; \
|
|
case OP_##name##_INT32: NUMBER_OP(int32, Int32, op); break; \
|
|
- case OP_##name##_INT64: NUMBER_OP(int64, Int64, op); break; \
|
|
|
|
|
|
+ case OP_##name##_INT64: \
|
|
|
|
+ NUMBER_OP(int64, Int64, op); \
|
|
|
|
+ break;
|
|
|
|
+#define CASE_NUMBER_OP(name, op) \
|
|
|
|
+ CASE_INTEGRAL_OP(name, op) \
|
|
case OP_##name##_FLOAT: \
|
|
case OP_##name##_FLOAT: \
|
|
NUMBER_OP(float, Float, op); \
|
|
NUMBER_OP(float, Float, op); \
|
|
break;
|
|
break;
|
|
@@ -455,6 +464,7 @@ static void sCall(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_EQUAL_##TYPE: BOOL_OP(type, Type, ==); break; \
|
|
case OP_EQUAL_##TYPE: BOOL_OP(type, Type, ==); break; \
|
|
|
|
+ case OP_NOT_EQUAL_##TYPE: BOOL_OP(type, Type, !=); break; \
|
|
case OP_LOAD_##TYPE: sLoad(sc, sizeof(type)); break;
|
|
case OP_LOAD_##TYPE: sLoad(sc, sizeof(type)); break;
|
|
|
|
|
|
static void sConsumeInstruction(Script* sc) {
|
|
static void sConsumeInstruction(Script* sc) {
|
|
@@ -463,13 +473,23 @@ static void sConsumeInstruction(Script* sc) {
|
|
CASE_NUMBER_OP(SUB, -);
|
|
CASE_NUMBER_OP(SUB, -);
|
|
CASE_NUMBER_OP(MUL, *);
|
|
CASE_NUMBER_OP(MUL, *);
|
|
CASE_BOOL_OP(LESS, <);
|
|
CASE_BOOL_OP(LESS, <);
|
|
|
|
+ CASE_BOOL_OP(LESS_EQUAL, <=);
|
|
CASE_BOOL_OP(GREATER, >);
|
|
CASE_BOOL_OP(GREATER, >);
|
|
|
|
+ CASE_BOOL_OP(GREATER_EQUAL, >=);
|
|
CASE_TYPE(INT32, Int32, int32);
|
|
CASE_TYPE(INT32, Int32, int32);
|
|
CASE_TYPE(INT64, Int64, int64);
|
|
CASE_TYPE(INT64, Int64, int64);
|
|
CASE_TYPE(BOOL, Bool, bool);
|
|
CASE_TYPE(BOOL, Bool, bool);
|
|
CASE_TYPE(FLOAT, Float, float);
|
|
CASE_TYPE(FLOAT, Float, float);
|
|
CASE_CHANGE(INT32, Int32, int32);
|
|
CASE_CHANGE(INT32, Int32, int32);
|
|
CASE_CHANGE(INT64, Int64, int64);
|
|
CASE_CHANGE(INT64, Int64, int64);
|
|
|
|
+ CASE_INTEGRAL_OP(BIT_AND, &);
|
|
|
|
+ CASE_INTEGRAL_OP(BIT_OR, |);
|
|
|
|
+ CASE_INTEGRAL_OP(BIT_XOR, ^);
|
|
|
|
+ CASE_INTEGRAL_OP(LEFT_SHIFT, <<);
|
|
|
|
+ CASE_INTEGRAL_OP(RIGHT_SHIFT, >>);
|
|
|
|
+ CASE_CAST(INT32, Int32, int32, FLOAT, Float, float);
|
|
|
|
+ CASE_CAST(INT32, Int32, int32, INT64, Int64, int64);
|
|
|
|
+ CASE_CAST(INT64, Int64, int64, FLOAT, Float, float);
|
|
case OP_NOTHING: break;
|
|
case OP_NOTHING: break;
|
|
case OP_PUSH_INT32: PUSH_CONSTANT(int32, Int32); break;
|
|
case OP_PUSH_INT32: PUSH_CONSTANT(int32, Int32); break;
|
|
case OP_PUSH_INT64: PUSH_CONSTANT(int64, Int64); break;
|
|
case OP_PUSH_INT64: PUSH_CONSTANT(int64, Int64); break;
|
|
@@ -489,17 +509,7 @@ static void sConsumeInstruction(Script* sc) {
|
|
case OP_AND: BOOL_OP(bool, Bool, &&); break;
|
|
case OP_AND: BOOL_OP(bool, Bool, &&); break;
|
|
case OP_OR: BOOL_OP(bool, Bool, ||); break;
|
|
case OP_OR: BOOL_OP(bool, Bool, ||); break;
|
|
case OP_BIT_NOT_INT32: sBitNotInt32(sc); break;
|
|
case OP_BIT_NOT_INT32: sBitNotInt32(sc); break;
|
|
- case OP_BIT_AND_INT32: NUMBER_OP(int32, Int32, &); break;
|
|
|
|
- case OP_BIT_OR_INT32: NUMBER_OP(int32, Int32, |); break;
|
|
|
|
- case OP_BIT_XOR_INT32: NUMBER_OP(int32, Int32, ^); break;
|
|
|
|
- case OP_LEFT_SHIFT_INT32: NUMBER_OP(int32, Int32, <<); break;
|
|
|
|
- case OP_RIGHT_SHIFT_INT32: NUMBER_OP(int32, Int32, >>); break;
|
|
|
|
case OP_BIT_NOT_INT64: sBitNotInt64(sc); break;
|
|
case OP_BIT_NOT_INT64: sBitNotInt64(sc); break;
|
|
- case OP_BIT_AND_INT64: NUMBER_OP(int64, Int64, &); break;
|
|
|
|
- case OP_BIT_OR_INT64: NUMBER_OP(int64, Int64, |); break;
|
|
|
|
- case OP_BIT_XOR_INT64: NUMBER_OP(int64, Int64, ^); break;
|
|
|
|
- case OP_LEFT_SHIFT_INT64: NUMBER_OP(int64, Int64, <<); break;
|
|
|
|
- case OP_RIGHT_SHIFT_INT64: NUMBER_OP(int64, Int64, >>); break;
|
|
|
|
case OP_LINE: sLine(sc); break;
|
|
case OP_LINE: sLine(sc); break;
|
|
case OP_GOTO: sGoTo(sc); break;
|
|
case OP_GOTO: sGoTo(sc); break;
|
|
case OP_IF_GOTO: sIfGoTo(sc); break;
|
|
case OP_IF_GOTO: sIfGoTo(sc); break;
|
|
@@ -518,13 +528,8 @@ static void sConsumeInstruction(Script* sc) {
|
|
case OP_DELETE: sDeleteArray(sc); break;
|
|
case OP_DELETE: sDeleteArray(sc); break;
|
|
case OP_LENGTH: sLength(sc); break;
|
|
case OP_LENGTH: sLength(sc); break;
|
|
case OP_STORE_POINTER: sStore(sc, sizeof(Pointer)); break;
|
|
case OP_STORE_POINTER: sStore(sc, sizeof(Pointer)); break;
|
|
- case OP_EQUAL_POINTER: sEqualPointer(sc); break;
|
|
|
|
- case OP_INT32_TO_FLOAT: CAST(Int32, int32, Float); break;
|
|
|
|
- case OP_FLOAT_TO_INT32: CAST(Float, float, Int32); break;
|
|
|
|
- case OP_INT32_TO_INT64: CAST(Int32, int32, Int64); break;
|
|
|
|
- case OP_INT64_TO_INT32: CAST(Int64, int64, Int32); break;
|
|
|
|
- case OP_FLOAT_TO_INT64: CAST(Float, float, Int64); break;
|
|
|
|
- case OP_INT64_TO_FLOAT: CAST(Int64, int64, Float); break;
|
|
|
|
|
|
+ case OP_EQUAL_POINTER: sEqualPointer(sc, true); break;
|
|
|
|
+ case OP_NOT_EQUAL_POINTER: sEqualPointer(sc, false); break;
|
|
case OP_CALL: sCall(sc); break;
|
|
case OP_CALL: sCall(sc); break;
|
|
}
|
|
}
|
|
}
|
|
}
|