diff --git a/src/vm.c b/src/vm.c index 4ab3b34d..4dc9abef 100644 --- a/src/vm.c +++ b/src/vm.c @@ -91,7 +91,7 @@ void printBC(u32* p) { for (i64 i = 0; i < am; i++) printf(" %d", p[i]); while(p!=n) { i32 c = *p++; - i32 pow = 10; + i64 pow = 10; i32 log = 1; while (pow<=c) { pow*=10; log++; } len+= log+1; @@ -156,6 +156,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl i32 bodyAm1, bodyAm2, bodyILen; if (isArr(bodyObj)) { if (a(bodyObj)->ia!=2) thrM("VM compiler: Unexpected body list length"); + // print(bodyObj); putchar('\n'); BS2B boGetU = TI(bodyObj,getU); B b1 = boGetU(bodyObj,0); B b2 = boGetU(bodyObj,1); @@ -163,11 +164,11 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl bodyAm1 = a(b1)->ia; BS2B b1GetU = TI(b1,getU); bodyAm2 = a(b2)->ia; BS2B b2GetU = TI(b2,getU); bodyILen = bodyAm1+bodyAm2; - TALLOC(i32, bodyInds_, bodyILen+2); bodyI = bodyInds_; - for (i32 i = 0; i < bodyAm1; i++) bodyI[i ] = o2i(b1GetU(b1, i)); - for (i32 i = 0; i < bodyAm2; i++) bodyI[i+bodyAm1+1] = o2i(b2GetU(b2, i)); - for (i32 i = 1; i < bodyAm1; i++) if (bodyI[i]<=bodyI[i-1]) thrM("VM compiler: Expected body indices to be sorted"); - for (i32 i = 1; i < bodyAm2; i++) if (bodyI[i]<=bodyI[i-1]) thrM("VM compiler: Expected body indices to be sorted"); + TALLOC(i32, bodyInds_, bodyILen+2); bodyI = bodyInds_; i32* bodyI2 = bodyInds_+bodyAm1+1; + for (i32 i = 0; i < bodyAm1; i++) bodyI [i] = o2i(b1GetU(b1, i)); + for (i32 i = 0; i < bodyAm2; i++) bodyI2[i] = o2i(b2GetU(b2, i)); + for (i32 i = 1; i < bodyAm1; i++) if (bodyI [i]<=bodyI [i-1]) thrM("VM compiler: Expected body indices to be sorted"); + for (i32 i = 1; i < bodyAm2; i++) if (bodyI2[i]<=bodyI2[i-1]) thrM("VM compiler: Expected body indices to be sorted"); bodyI[bodyAm1] = bodyI[bodyILen+1] = I32_MAX; } else { bodyILen = 2; @@ -177,7 +178,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl bodyAm1 = 1; bodyAm2 = 1; } - + // for (int i = 0; i < bodyILen+2; i++) printf("%d ", bodyI[i]); putchar('\n'); printf("things: %d %d\n", bodyAm1, bodyAm2); TSALLOC(Block*, usedBlocks, 2); // list of blocks to be referenced by DFND, stored in result->blocks TSALLOC(Body*, bodies, 2); // list of bodies of this block TSALLOC(i32, newBC, 20); // transformed bytecode @@ -205,8 +206,10 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl i32 curr2 = bodyI[pos2]; i32 currBody = curr1imm = imm; bl->bodyCount = bodyCount; - if (index1 != 0) { - Body* t = bodies[0]; - bodies[0] = bodies[index1]; - bodies[index1] = t; - index1 = 0; + if (index1 != 0) { // this is a _mess_ + i32 sw0 = 0; i32 sw1 = index1; + + Body* t = bodies[sw0]; bodies[sw0] = bodies[sw1]; bodies[sw1] = t; + index1 = sw0; + + if (index2==sw0) index2 = sw1; + else if (index2==sw1) index2 = sw0; } for (i32 i = 0; i < bodyCount; i++) { bl->bodies[i] = bodies[i];