revert back to old itasks, add sds support in bytecode
[mTask.git] / int / interpret.c
index f44c7bf..4c60bc9 100644 (file)
@@ -5,8 +5,9 @@
 #include "interpret.h"
 #include "misc.h"
 #include "task.h"
+#include "sds.h"
 
-void run_task(struct task *t)
+void run_task(struct task *t, int fd)
 {
        uint8_t *program = t->bc;
        int plen = t->tlen;
@@ -15,71 +16,78 @@ void run_task(struct task *t)
        char stack[STACKSIZE] = {0};
        printf("Running task with length: %d\n", plen);
        while(pc != plen){
-               printf("program: %x\n", program[pc]);
+               printf("program: %d\n", program[pc]);
+               printf("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
+                       stack[0], stack[1], stack[2], stack[3], stack[4],
+                       stack[5], stack[6], stack[7], stack[8], stack[9]);
                switch(program[pc++]){
                case BCNOP: trace("nop\n");
                        break;
-               case BCPUSH: trace("push %d\n", program[pc]);
-                       stack[sp++] = program[pc++];
+               case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]);
+                       stack[sp++] = program[pc]*265 + program[pc+1];
+                       pc+=2;
                        break;
                case BCPOP: trace("pop\n");
                        sp--;
                        break;
                case BCSDSSTORE: trace("sds store\n");
+                       sds_store(program[pc++], stack[sp-1]);
                        break;
                case BCSDSFETCH: trace("sds fetch\n");
+                       stack[sp++] = sds_fetch(program[pc++]);
                        break;
                case BCSDSPUBLISH: trace("sds publish\n");
+                       sds_publish(program[pc++], fd);
                        break;
                case BCNOT: trace("not\n");
                        stack[sp] = stack[sp] > 0 ? 0 : 1;
                        break;
                case BCADD: trace("add\n");
-                       stack[sp-1] = stack[sp] + stack[sp-1];
+                       stack[sp-2] = stack[sp-1] + stack[sp-2];
                        sp -= 1;
                        break;
                case BCSUB: trace("sub\n");
-                       stack[sp-1] = stack[sp] - stack[sp-1];
+                       stack[sp-2] = stack[sp-1] - stack[sp-2];
                        sp -= 1;
                        break;
                case BCMUL: trace("mul\n");
-                       stack[sp-1] = stack[sp] * stack[sp-1];
+                       stack[sp-2] = stack[sp-1] * stack[sp-2];
                        sp -= 1;
                        break;
                case BCDIV: trace("div\n");
-                       stack[sp-1] = stack[sp] / stack[sp-1];
+                       stack[sp-2] = stack[sp-1] / stack[sp-2];
                        sp -= 1;
                        break;
                case BCAND: trace("and\n");
-                       stack[sp-1] = stack[sp] && stack[sp-1];
+                       stack[sp-2] = stack[sp-1] && stack[sp-2];
                        sp -= 1;
                        break;
                case BCOR: trace("or\n");
-                       stack[sp-1] = stack[sp] || stack[sp-1];
+                       stack[sp-2] = stack[sp-1] || stack[sp-2];
                        sp -= 1;
                        break;
                case BCEQ: trace("eq\n");
-                       stack[sp-1] = stack[sp] == stack[sp-1];
+                       stack[sp-2] = stack[sp-1] == stack[sp-2];
                        sp -= 1;
                        break;
                case BCNEQ: trace("neq\n");
-                       stack[sp-1] = stack[sp] != stack[sp-1];
+                       stack[sp-2] = stack[sp-1] != stack[sp-2];
                        sp -= 1;
                        break;
                case BCLES: trace("les\n");
-                       stack[sp-1] = stack[sp] < stack[sp-1];
+                       stack[sp-2] = stack[sp-1] < stack[sp-2];
                        sp -= 1;
                        break;
                case BCGRE: trace("gre\n");
-                       stack[sp-1] = stack[sp] > stack[sp-1];
+                       stack[sp-2] = stack[sp-1] > stack[sp-2];
                        sp -= 1;
                        break;
                case BCLEQ: trace("leq\n");
-                       stack[sp-1] = stack[sp] <= stack[sp-1];
+                       stack[sp-2] = stack[sp-1] <= stack[sp-2];
                        sp -= 1;
                        break;
                case BCGEQ: trace("geq\n");
-                       stack[sp-1] = stack[sp] >= stack[sp-1];
+                       stack[sp-2] = stack[sp-1] >= stack[sp-2];
                        sp -= 1;
                        break;
                case BCJMP: trace("jmp to %d\n", program[pc]);