|
@@ -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;
|
|
|
}
|
|
|
}
|