Browse Source

refatored binary int operations

Kajetan Johannes Hammerle 4 years ago
parent
commit
72d9f8d444
1 changed files with 11 additions and 20 deletions
  1. 11 20
      Script.c

+ 11 - 20
Script.c

@@ -71,7 +71,7 @@ static void sPushNull(Script* sc) {
     sPush(sc, &o);
 }
 
-void sAdd(Script* sc) {
+static void sIntBinary(Script* sc, int (*f)(int, int)) {
     Object a;
     if(sPop(sc, &a)) {
         return;
@@ -84,28 +84,19 @@ void sAdd(Script* sc) {
         sc->error = NOT_AN_INT;
         return;
     }
-    Object o = {.type = OT_INT, .data.intValue = a.data.intValue + b.data.intValue};
+    Object o = {.type = OT_INT, .data.intValue = f(a.data.intValue, b.data.intValue)};
     sPush(sc, &o);
 }
 
-void sMul(Script* sc) {
-    Object a;
-    if(sPop(sc, &a)) {
-        return;
-    }
-    Object b;
-    if(sPop(sc, &b)) {
-        return;
-    }
-    if(a.type != OT_INT || b.type != OT_INT) {
-        sc->error = NOT_AN_INT;
-        return;
-    }
-    Object o = {.type = OT_INT, .data.intValue = a.data.intValue * b.data.intValue};
-    sPush(sc, &o);
+static int sIntAdd(int a, int b) {
+    return a + b;
+}
+
+static int sIntMul(int a, int b) {
+    return a * b;
 }
 
-void sPrint(Script* sc) {
+static void sPrint(Script* sc) {
     Object o;
     if(sPop(sc, &o)) {
         return;
@@ -120,8 +111,8 @@ static void sConsumeInstruction(Script* sc) {
         case OP_NOTHING: break;
         case OP_PUSH_INT: sPushInt(sc); break;
         case OP_PUSH_NULL: sPushNull(sc); break;
-        case OP_ADD: sAdd(sc); break;
-        case OP_MUL: sMul(sc); break;
+        case OP_ADD: sIntBinary(sc, sIntAdd); break;
+        case OP_MUL: sIntBinary(sc, sIntMul); break;
         case OP_PRINT: sPrint(sc); break;
     }
 }