|
@@ -257,6 +257,19 @@ static bool sFloatGreater(float a, float b) {
|
|
return b > a;
|
|
return b > a;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void sInvertSign(Script* sc) {
|
|
|
|
+ Object* o = sPeek(sc);
|
|
|
|
+ if(o == NULL) {
|
|
|
|
+ return;
|
|
|
|
+ } else if(o->type == OT_INT) {
|
|
|
|
+ o->data.intValue = -o->data.intValue;
|
|
|
|
+ } else if(o->type == OT_FLOAT) {
|
|
|
|
+ o->data.floatValue = -o->data.floatValue;
|
|
|
|
+ } else {
|
|
|
|
+ sError(sc, "object is not a number on line %d", sc->line);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static void sEqual(Script* sc) {
|
|
static void sEqual(Script* sc) {
|
|
Object o[2];
|
|
Object o[2];
|
|
if(sPop(sc, o) || sPop(sc, o + 1)) {
|
|
if(sPop(sc, o) || sPop(sc, o + 1)) {
|
|
@@ -381,6 +394,7 @@ static void sConsumeInstruction(Script* sc) {
|
|
case OP_MUL: sNumberBinary(sc, sIntMul, sFloatMul); break;
|
|
case OP_MUL: sNumberBinary(sc, sIntMul, sFloatMul); break;
|
|
case OP_DIV: sNumberBinary(sc, sIntDiv, sFloatDiv); break;
|
|
case OP_DIV: sNumberBinary(sc, sIntDiv, sFloatDiv); break;
|
|
case OP_MOD: sIntBinary(sc, sMod); break;
|
|
case OP_MOD: sIntBinary(sc, sMod); break;
|
|
|
|
+ case OP_INVERT_SIGN: sInvertSign(sc); break;
|
|
case OP_LESS: sBoolBinary(sc, sIntLess, sFloatLess); break;
|
|
case OP_LESS: sBoolBinary(sc, sIntLess, sFloatLess); break;
|
|
case OP_GREATER: sBoolBinary(sc, sIntGreater, sFloatGreater); break;
|
|
case OP_GREATER: sBoolBinary(sc, sIntGreater, sFloatGreater); break;
|
|
case OP_EQUAL: sEqual(sc); break;
|
|
case OP_EQUAL: sEqual(sc); break;
|
|
@@ -481,6 +495,7 @@ void sPrintCode(Script* sc) {
|
|
case OP_MUL: puts("Mul"); break;
|
|
case OP_MUL: puts("Mul"); break;
|
|
case OP_DIV: puts("Div"); break;
|
|
case OP_DIV: puts("Div"); break;
|
|
case OP_MOD: puts("Mod"); break;
|
|
case OP_MOD: puts("Mod"); break;
|
|
|
|
+ case OP_INVERT_SIGN: puts("Invert Sign"); break;
|
|
case OP_LESS: puts("Less"); break;
|
|
case OP_LESS: puts("Less"); break;
|
|
case OP_GREATER: puts("Greater"); break;
|
|
case OP_GREATER: puts("Greater"); break;
|
|
case OP_EQUAL: puts("Equal"); break;
|
|
case OP_EQUAL: puts("Equal"); break;
|