diff --git a/public/vm/byte-stream.js b/public/vm/byte-stream.js
index fbf989e..9cb0f50 100755
--- a/public/vm/byte-stream.js
+++ b/public/vm/byte-stream.js
@@ -24,7 +24,7 @@ ByteStream.prototype.get_u4 = function() {
ByteStream.prototype.get_i4 = function() {
var unsigned_val = this.get_u4();
var sign_mult = (unsigned_val & 0x80000000) ? -1 : 1;
- return (unsigned_val & 0x7FFFFFFF) * sign_mult;
+ return (unsigned_val & 0x7FFFFFFF) + (unsigned_val & 0x80000000);
}
ByteStream.prototype.get_bytes = function(n) {
diff --git a/public/vm/bytecode-parser.js b/public/vm/bytecode-parser.js
index bce7604..1479957 100644
--- a/public/vm/bytecode-parser.js
+++ b/public/vm/bytecode-parser.js
@@ -77,10 +77,11 @@ var Bc0File = function (filename) {
for (var i = 0; i < this.string_count; i++) {
var c = stream.get_u1();
if (c == 0) {
- this.string_pool.push(current_string);
- current_string = "";
+ // this.string_pool.push(current_string);
+ // current_string = "";
+ this.string_pool.push(0);
} else {
- current_string += String.fromCharCode(c);
+ this.string_pool.push(String.fromCharCode(c));
}
}
@@ -98,6 +99,15 @@ var Bc0File = function (filename) {
}
}
+Bc0File.prototype.string_from_index = function (i) {
+ var result = "";
+ while (this.string_pool[i] !== 0 && i < this.string_pool.length) {
+ result += this.string_pool[i];
+ i++;
+ }
+ return result;
+}
+
function parse(filename) {
return new Bc0File(filename);
}
diff --git a/public/vm/c0vm.js b/public/vm/c0vm.js
index 01f21f8..32ae799 100755
--- a/public/vm/c0vm.js
+++ b/public/vm/c0vm.js
@@ -16,6 +16,13 @@ function c0_memory_error(val) {
throw ("c0 memory error: " + val);
}
+function num_to_i32(num) {
+ log("num is 0x" + num.toString(16));
+ log("num & 0x7FFFFFFF is " + (num & 0x7FFFFFFF));
+ log("neg factor is " + ( (num & 0x80000000)));
+ return (num & 0x7FFFFFFF) + ((num & 0x80000000));
+}
+
function i32_to_array(i32) {
return [(i32 & 0xFF),
((i32 >> 8) & 0xFF),
@@ -78,6 +85,8 @@ ProgramState.prototype.push = function(val) {
}
ProgramState.prototype.pop = function() {
+ if (this.frame.stack === [])
+ throw "Tried to pop from an empty stack!";
return this.frame.stack.pop();
}
@@ -152,19 +161,20 @@ ProgramState.prototype.step = function() {
var y = this.pop();
var x = this.pop();
log("Adding " + x + " and " + y);
- this.push((x+y) % 0x100000000);
+ this.push(num_to_i32(x+y));
break;
case op.ISUB:
this.frame.pc++;
var y = this.pop();
var x = this.pop();
- this.push((x-y) % 0x100000000);
+ log("Subtracting " + x + " and " + y);
+ this.push(num_to_i32(x-y));
break;
case op.IMUL:
this.frame.pc++;
var y = this.pop();
var x = this.pop();
- this.push((x*y) % 0x100000000);
+ this.push(num_to_i32(x*y));
break;
case op.IDIV:
this.frame.pc++;
@@ -229,7 +239,9 @@ ProgramState.prototype.step = function() {
case op.VSTORE:
this.frame.pc += 2;
var index = this.frame.program[this.frame.pc-1];
- this.frame.variables[index] = this.pop();
+ var val = this.pop();
+ this.frame.variables[index] = val;
+ log("Set variable " + index + " to value " + val);
break;
case op.ACONST_NULL:
this.frame.pc++;
@@ -249,7 +261,7 @@ ProgramState.prototype.step = function() {
var c2 = this.frame.program[this.frame.pc-1];
var index = (c1 * 0x1000) + c2;
- this.push(this.file.string_pool[index]);
+ this.push(this.file.string_from_index(index));
break;
// Control flow
@@ -328,6 +340,8 @@ ProgramState.prototype.step = function() {
};
console.log("Unknown native function index " + f.function_table_index);
}
+ log("Calling native function with index " + index + " with arguments " +
+ arg_array);
this.push(native_function(arg_array));
break;
@@ -372,7 +386,7 @@ ProgramState.prototype.step = function() {
// Read offset into a struct
var offset = this.frame.program[this.frame.pc + 1];
var index = this.pop();
- this.push(this.heap[index + offset]);
+ this.push(index + offset);
this.frame.pc += 2;
break;
@@ -380,10 +394,16 @@ ProgramState.prototype.step = function() {
// Read offset into an array
var elt_index = this.pop();
var index = this.pop();
- var array_length = this.heap[index];
- var elt_size = this.heap[index+1];
- if (elt_index >= array_length) c0_memory_error("Array index out of bounds.");
- this.push(this.heap[index + 2 + elt_size*elt_index]);
+
+ if (typeof index == "string") {
+ this.push(index.slice(elt_index));
+ } else {
+ var array_length = this.heap[index];
+ var elt_size = this.heap[index+1];
+ if (elt_index >= array_length)
+ c0_memory_error("Array index out of bounds.");
+ this.push(index + 2 + (elt_size*elt_index));
+ }
this.frame.pc++;
break;
@@ -407,6 +427,7 @@ ProgramState.prototype.step = function() {
for (var i = 0; i < 4; i++)
this.heap[addr + i] = array[i];
this.frame.pc++;
+ break;
case op.AMLOAD:
var addr = this.pop();
@@ -423,7 +444,10 @@ ProgramState.prototype.step = function() {
case op.CMLOAD:
var addr = this.pop();
- this.push(this.heap[addr]);
+ if (typeof addr == "string")
+ this.push(addr);
+ else
+ this.push(this.heap[addr]);
this.frame.pc++;
break;
@@ -454,12 +478,24 @@ function execute(file, callbacks, v) {
var state = new ProgramState(file, callbacks);
+ if (verbose) log(file);
+
log("Beginning execution");
while (true) {
var val = state.step();
if (val !== undefined) return val;
+ if (verbose) {
+ console.log("Machine state:");
+ console.log(" Current Stack Frame:");
+ console.log(" Stack: " + state.frame.stack);
+ console.log(" PC: " + state.frame.pc);
+ console.log(" Vars: " + state.frame.variables);
+ // console.log(" Code: " + state.frame.program);
+ console.log(" Heap: " + state.heap);
+ }
+
// if (at_breakpoint) {
// save state (maybe in a global in this file?)
// return;
diff --git a/public/vm/index.js b/public/vm/index.js
index a33698d..2a09301 100644
--- a/public/vm/index.js
+++ b/public/vm/index.js
@@ -20,11 +20,13 @@ callbacks = {};
callbacks[c0ffi.NATIVE_PRINT] = function(args) {
print(args[0]);
print("
");
+ return 0;
}
callbacks[c0ffi.NATIVE_PRINTINT] = function(args) {
print(args[0]);
print("
");
+ return 0;
}
console.log(callbacks);
diff --git a/public/vm/vm.js b/public/vm/vm.js
index fd125a0..47838cb 100644
--- a/public/vm/vm.js
+++ b/public/vm/vm.js
@@ -25,7 +25,7 @@ ByteStream.prototype.get_u4 = function() {
ByteStream.prototype.get_i4 = function() {
var unsigned_val = this.get_u4();
var sign_mult = (unsigned_val & 0x80000000) ? -1 : 1;
- return (unsigned_val & 0x7FFFFFFF) * sign_mult;
+ return (unsigned_val & 0x7FFFFFFF) + (unsigned_val & 0x80000000);
}
ByteStream.prototype.get_bytes = function(n) {
@@ -118,10 +118,11 @@ var Bc0File = function (filename) {
for (var i = 0; i < this.string_count; i++) {
var c = stream.get_u1();
if (c == 0) {
- this.string_pool.push(current_string);
- current_string = "";
+ // this.string_pool.push(current_string);
+ // current_string = "";
+ this.string_pool.push(0);
} else {
- current_string += String.fromCharCode(c);
+ this.string_pool.push(String.fromCharCode(c));
}
}
@@ -139,6 +140,15 @@ var Bc0File = function (filename) {
}
}
+Bc0File.prototype.string_from_index = function (i) {
+ var result = "";
+ while (this.string_pool[i] !== 0 && i < this.string_pool.length) {
+ result += this.string_pool[i];
+ i++;
+ }
+ return result;
+}
+
function parse(filename) {
return new Bc0File(filename);
}
@@ -277,6 +287,13 @@ function c0_memory_error(val) {
throw ("c0 memory error: " + val);
}
+function num_to_i32(num) {
+ log("num is 0x" + num.toString(16));
+ log("num & 0x7FFFFFFF is " + (num & 0x7FFFFFFF));
+ log("neg factor is " + ( (num & 0x80000000)));
+ return (num & 0x7FFFFFFF) + ((num & 0x80000000));
+}
+
function i32_to_array(i32) {
return [(i32 & 0xFF),
((i32 >> 8) & 0xFF),
@@ -339,6 +356,8 @@ ProgramState.prototype.push = function(val) {
}
ProgramState.prototype.pop = function() {
+ if (this.frame.stack === [])
+ throw "Tried to pop from an empty stack!";
return this.frame.stack.pop();
}
@@ -413,19 +432,20 @@ ProgramState.prototype.step = function() {
var y = this.pop();
var x = this.pop();
log("Adding " + x + " and " + y);
- this.push((x+y) % 0x100000000);
+ this.push(num_to_i32(x+y));
break;
case op.ISUB:
this.frame.pc++;
var y = this.pop();
var x = this.pop();
- this.push((x-y) % 0x100000000);
+ log("Subtracting " + x + " and " + y);
+ this.push(num_to_i32(x-y));
break;
case op.IMUL:
this.frame.pc++;
var y = this.pop();
var x = this.pop();
- this.push((x*y) % 0x100000000);
+ this.push(num_to_i32(x*y));
break;
case op.IDIV:
this.frame.pc++;
@@ -490,7 +510,9 @@ ProgramState.prototype.step = function() {
case op.VSTORE:
this.frame.pc += 2;
var index = this.frame.program[this.frame.pc-1];
- this.frame.variables[index] = this.pop();
+ var val = this.pop();
+ this.frame.variables[index] = val;
+ log("Set variable " + index + " to value " + val);
break;
case op.ACONST_NULL:
this.frame.pc++;
@@ -510,7 +532,7 @@ ProgramState.prototype.step = function() {
var c2 = this.frame.program[this.frame.pc-1];
var index = (c1 * 0x1000) + c2;
- this.push(this.file.string_pool[index]);
+ this.push(this.file.string_from_index(index));
break;
// Control flow
@@ -589,6 +611,8 @@ ProgramState.prototype.step = function() {
};
console.log("Unknown native function index " + f.function_table_index);
}
+ log("Calling native function with index " + index + " with arguments " +
+ arg_array);
this.push(native_function(arg_array));
break;
@@ -633,7 +657,7 @@ ProgramState.prototype.step = function() {
// Read offset into a struct
var offset = this.frame.program[this.frame.pc + 1];
var index = this.pop();
- this.push(this.heap[index + offset]);
+ this.push(index + offset);
this.frame.pc += 2;
break;
@@ -641,10 +665,16 @@ ProgramState.prototype.step = function() {
// Read offset into an array
var elt_index = this.pop();
var index = this.pop();
- var array_length = this.heap[index];
- var elt_size = this.heap[index+1];
- if (elt_index >= array_length) c0_memory_error("Array index out of bounds.");
- this.push(this.heap[index + 2 + elt_size*elt_index]);
+
+ if (typeof index == "string") {
+ this.push(index.slice(elt_index));
+ } else {
+ var array_length = this.heap[index];
+ var elt_size = this.heap[index+1];
+ if (elt_index >= array_length)
+ c0_memory_error("Array index out of bounds.");
+ this.push(index + 2 + (elt_size*elt_index));
+ }
this.frame.pc++;
break;
@@ -668,6 +698,7 @@ ProgramState.prototype.step = function() {
for (var i = 0; i < 4; i++)
this.heap[addr + i] = array[i];
this.frame.pc++;
+ break;
case op.AMLOAD:
var addr = this.pop();
@@ -684,7 +715,10 @@ ProgramState.prototype.step = function() {
case op.CMLOAD:
var addr = this.pop();
- this.push(this.heap[addr]);
+ if (typeof addr == "string")
+ this.push(addr);
+ else
+ this.push(this.heap[addr]);
this.frame.pc++;
break;
@@ -715,12 +749,24 @@ function execute(file, callbacks, v) {
var state = new ProgramState(file, callbacks);
+ if (verbose) log(file);
+
log("Beginning execution");
while (true) {
var val = state.step();
if (val !== undefined) return val;
+ if (verbose) {
+ console.log("Machine state:");
+ console.log(" Current Stack Frame:");
+ console.log(" Stack: " + state.frame.stack);
+ console.log(" PC: " + state.frame.pc);
+ console.log(" Vars: " + state.frame.variables);
+ // console.log(" Code: " + state.frame.program);
+ console.log(" Heap: " + state.heap);
+ }
+
// if (at_breakpoint) {
// save state (maybe in a global in this file?)
// return;
@@ -753,11 +799,13 @@ callbacks = {};
callbacks[c0ffi.NATIVE_PRINT] = function(args) {
print(args[0]);
print("
");
+ return 0;
}
callbacks[c0ffi.NATIVE_PRINTINT] = function(args) {
print(args[0]);
print("
");
+ return 0;
}
console.log(callbacks);
diff --git a/test/abort.c0 b/test/abort.c0
new file mode 100644
index 0000000..64491b4
--- /dev/null
+++ b/test/abort.c0
@@ -0,0 +1,6 @@
+#use
+
+int main () {
+ error("assertion failure");
+ return 0;
+}
diff --git a/test/abort.c0.bc0 b/test/abort.c0.bc0
new file mode 100644
index 0000000..ed14cee
--- /dev/null
+++ b/test/abort.c0.bc0
@@ -0,0 +1,25 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 12 # string pool total size
+# string pool
+61 73 73 65 72 74 69 6F 6E 20 66 61 69 6C 75 72 65 00 # "assertion failure"
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 00 # number of local variables = 0
+00 07 # code length = 7 bytes
+14 00 00 # aldc 0 # s[0] = "assertion failure"
+BF # athrow # error "assertion failure"
+10 00 # bipush 0 # 0
+B0 # return #
+
+00 00 # native count
+# native pool
+
diff --git a/test/abort.c0.bc0out b/test/abort.c0.bc0out
new file mode 100644
index 0000000..e69de29
diff --git a/test/abort.c0.c0out b/test/abort.c0.c0out
new file mode 100644
index 0000000..e69de29
diff --git a/test/abort.c0.ex b/test/abort.c0.ex
new file mode 100755
index 0000000..7091bd6
Binary files /dev/null and b/test/abort.c0.ex differ
diff --git a/test/arith.c0 b/test/arith.c0
new file mode 100644
index 0000000..4c66238
--- /dev/null
+++ b/test/arith.c0
@@ -0,0 +1,129 @@
+#use
+
+int main()
+{
+ int max; int min;
+ int x; int y; int z;
+ int constant;
+
+ //Testing overflow
+ max = 2147483647;
+ min = -2147483648;
+ y = max + 1;
+ printint(y);
+ print(" ");
+ y = min - 1;
+ printint(y);
+ print(" ");
+// printint(min / -1);
+
+ //Testing multiplication of negatives
+
+ x = -25;
+ y = 15;
+ printint(x * y);
+ print(" ");
+ printint(-15 * -2147483648);
+ print(" ");
+
+ //Divide by 0
+// println("");
+// printint(x / 0);
+
+ //Modulus by 0
+// println("");
+// printint(x % 0);
+
+ //Testing addition
+ x = -5;
+ y = -4;
+ printint(x + y);
+ z = x - y;
+ print(" ");
+ printint(z);
+ print(" ");
+
+
+ //Division truncation
+ x = 25;
+ y = 2;
+ z = x / y;
+ printint(z);
+ print(" ");
+
+ println("");
+ x = -25;
+ y = 2;
+ z = x / y;
+ printint(z);
+ print(" ");
+ x = -25;
+ y = -2;
+ z = x / y;
+ printint(z);
+ print(" ");
+
+ //Modulus testing
+ print("Modulus testing ");
+ printint(235%32);
+ printint(-15%2);
+ print(" ");
+ printint(5%6);
+ print(" ");
+ printint(5%-2);
+ print(" ");
+
+ //Testing constants
+ print("Testing constants ");
+ constant = -251;
+ printint(constant);
+ print(" ");
+
+ //Testing inequalities
+ println("Testing inequalities ");
+ if(5>4) print("y1 "); else print("n1 ");
+ if(1>-1) print("y2 "); else print("n2 ");
+ if(0>=0) print("y3 "); else print("n3 ");
+ if(12945<-235) print("y4 "); else print("n4 ");
+ if(5<5) print("y5 "); else print("n5 ");
+ if(-5==5) print("y6 "); else print("n6 ");
+ if(15!=-15) print("y7 "); else print("n7 ");
+
+ //Testing bitwise operators
+ println("Testing bitwise operators ");
+ printint(0xF232C & 0xFF2352);
+ print(" ");
+ printint(0xF232C | 0xFF232);
+ print(" ");
+ printint(0xCD25 ^ 0x1D27);
+ print(" ");
+ printint(~0x2F32);
+ print(" ");
+
+ //Testing bit shifting
+ println("Testing bit shifting");
+ printint(1<<31);
+ print(" ");
+ printint(23<<5);
+ print(" ");
+ printint(1>>5<<7);
+ print(" ");
+ printint(2352352>>2);
+ print(" ");
+
+ //Default value for integers
+// println("Testing default value for integers");
+// printint(default_int);
+// print(" ");
+
+ //Testing other arithmetic functions
+ printint(-6-25);
+ print(" ");
+ printint(6-25);
+ print(" ");
+
+
+
+ println("");
+ return 0;
+}
diff --git a/test/arith.c0.bc0 b/test/arith.c0.bc0
new file mode 100644
index 0000000..3a07a92
--- /dev/null
+++ b/test/arith.c0.bc0
@@ -0,0 +1,430 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 0F # int pool count
+# int pool
+7F FF FF FF
+80 00 00 00
+80 00 00 00
+00 00 00 EB
+FF FF FF 05
+00 00 32 91
+FF FF FF 15
+00 0F 23 2C
+00 FF 23 52
+00 0F 23 2C
+00 0F F2 32
+00 00 CD 25
+00 00 1D 27
+00 00 2F 32
+00 23 E4 E0
+
+01 16 # string pool total size
+# string pool
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+00 # ""
+20 20 20 00 # " "
+20 20 20 00 # " "
+4D 6F 64 75 6C 75 73 20 74 65 73 74 69 6E 67 20 20 20 00 # "Modulus testing "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+54 65 73 74 69 6E 67 20 63 6F 6E 73 74 61 6E 74 73 20 20 20 00 # "Testing constants "
+20 20 20 00 # " "
+54 65 73 74 69 6E 67 20 69 6E 65 71 75 61 6C 69 74 69 65 73 20 20 20 00 # "Testing inequalities "
+79 31 20 20 00 # "y1 "
+6E 31 20 20 00 # "n1 "
+79 32 20 20 00 # "y2 "
+6E 32 20 20 00 # "n2 "
+79 33 20 20 00 # "y3 "
+6E 33 20 20 00 # "n3 "
+79 34 20 20 00 # "y4 "
+6E 34 20 20 00 # "n4 "
+79 35 20 20 00 # "y5 "
+6E 35 20 20 00 # "n5 "
+79 36 20 20 00 # "y6 "
+6E 36 20 20 00 # "n6 "
+79 37 20 20 00 # "y7 "
+6E 37 20 20 00 # "n7 "
+54 65 73 74 69 6E 67 20 62 69 74 77 69 73 65 20 6F 70 65 72 61 74 6F 72 73 20 20 20 00 # "Testing bitwise operators "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+54 65 73 74 69 6E 67 20 62 69 74 20 73 68 69 66 74 69 6E 67 00 # "Testing bit shifting"
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+20 20 20 00 # " "
+00 # ""
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 06 # number of local variables = 6
+02 C5 # code length = 709 bytes
+13 00 00 # ildc 0 # c[0] = 2147483647
+36 00 # vstore 0 # max = 2147483647;
+13 00 01 # ildc 1 # c[1] = -2147483648
+36 01 # vstore 1 # min = -(-2147483648);
+15 00 # vload 0 # max
+10 01 # bipush 1 # 1
+60 # iadd # (max + 1)
+36 03 # vstore 3 # y = (max + 1);
+15 03 # vload 3 # y
+B7 00 00 # invokenative 0 # printint(y)
+57 # pop # (ignore result)
+14 00 00 # aldc 0 # s[0] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+15 01 # vload 1 # min
+10 01 # bipush 1 # 1
+64 # isub # (min - 1)
+36 03 # vstore 3 # y = (min - 1);
+15 03 # vload 3 # y
+B7 00 00 # invokenative 0 # printint(y)
+57 # pop # (ignore result)
+14 00 04 # aldc 4 # s[4] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 E7 # bipush -25 # -25
+36 02 # vstore 2 # x = -(25);
+10 0F # bipush 15 # 15
+36 03 # vstore 3 # y = 15;
+15 02 # vload 2 # x
+15 03 # vload 3 # y
+68 # imul # (x * y)
+B7 00 00 # invokenative 0 # printint((x * y))
+57 # pop # (ignore result)
+14 00 08 # aldc 8 # s[8] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 F1 # bipush -15 # -15
+13 00 02 # ildc 2 # c[2] = -2147483648
+68 # imul # (-(15) * -(-2147483648))
+B7 00 00 # invokenative 0 # printint((-(15) * -(-2147483648)))
+57 # pop # (ignore result)
+14 00 0C # aldc 12 # s[12] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 FB # bipush -5 # -5
+36 02 # vstore 2 # x = -(5);
+10 FC # bipush -4 # -4
+36 03 # vstore 3 # y = -(4);
+15 02 # vload 2 # x
+15 03 # vload 3 # y
+60 # iadd # (x + y)
+B7 00 00 # invokenative 0 # printint((x + y))
+57 # pop # (ignore result)
+15 02 # vload 2 # x
+15 03 # vload 3 # y
+64 # isub # (x - y)
+36 04 # vstore 4 # z = (x - y);
+14 00 10 # aldc 16 # s[16] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+15 04 # vload 4 # z
+B7 00 00 # invokenative 0 # printint(z)
+57 # pop # (ignore result)
+14 00 14 # aldc 20 # s[20] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 19 # bipush 25 # 25
+36 02 # vstore 2 # x = 25;
+10 02 # bipush 2 # 2
+36 03 # vstore 3 # y = 2;
+15 02 # vload 2 # x
+15 03 # vload 3 # y
+6C # idiv # (x / y)
+36 04 # vstore 4 # z = (x / y);
+15 04 # vload 4 # z
+B7 00 00 # invokenative 0 # printint(z)
+57 # pop # (ignore result)
+14 00 18 # aldc 24 # s[24] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+14 00 1C # aldc 28 # s[28] = ""
+B7 00 02 # invokenative 2 # println("")
+57 # pop # (ignore result)
+10 E7 # bipush -25 # -25
+36 02 # vstore 2 # x = -(25);
+10 02 # bipush 2 # 2
+36 03 # vstore 3 # y = 2;
+15 02 # vload 2 # x
+15 03 # vload 3 # y
+6C # idiv # (x / y)
+36 04 # vstore 4 # z = (x / y);
+15 04 # vload 4 # z
+B7 00 00 # invokenative 0 # printint(z)
+57 # pop # (ignore result)
+14 00 1D # aldc 29 # s[29] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 E7 # bipush -25 # -25
+36 02 # vstore 2 # x = -(25);
+10 FE # bipush -2 # -2
+36 03 # vstore 3 # y = -(2);
+15 02 # vload 2 # x
+15 03 # vload 3 # y
+6C # idiv # (x / y)
+36 04 # vstore 4 # z = (x / y);
+15 04 # vload 4 # z
+B7 00 00 # invokenative 0 # printint(z)
+57 # pop # (ignore result)
+14 00 21 # aldc 33 # s[33] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+14 00 25 # aldc 37 # s[37] = "Modulus testing "
+B7 00 01 # invokenative 1 # print("Modulus testing ")
+57 # pop # (ignore result)
+13 00 03 # ildc 3 # c[3] = 235
+10 20 # bipush 32 # 32
+70 # irem # (235 % 32)
+B7 00 00 # invokenative 0 # printint((235 % 32))
+57 # pop # (ignore result)
+10 F1 # bipush -15 # -15
+10 02 # bipush 2 # 2
+70 # irem # (-(15) % 2)
+B7 00 00 # invokenative 0 # printint((-(15) % 2))
+57 # pop # (ignore result)
+14 00 38 # aldc 56 # s[56] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 05 # bipush 5 # 5
+10 06 # bipush 6 # 6
+70 # irem # (5 % 6)
+B7 00 00 # invokenative 0 # printint((5 % 6))
+57 # pop # (ignore result)
+14 00 3C # aldc 60 # s[60] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 05 # bipush 5 # 5
+10 FE # bipush -2 # -2
+70 # irem # (5 % -(2))
+B7 00 00 # invokenative 0 # printint((5 % -(2)))
+57 # pop # (ignore result)
+14 00 40 # aldc 64 # s[64] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+14 00 44 # aldc 68 # s[68] = "Testing constants "
+B7 00 01 # invokenative 1 # print("Testing constants ")
+57 # pop # (ignore result)
+13 00 04 # ildc 4 # c[4] = -251
+36 05 # vstore 5 # constant = -(251);
+15 05 # vload 5 # constant
+B7 00 00 # invokenative 0 # printint(constant)
+57 # pop # (ignore result)
+14 00 59 # aldc 89 # s[89] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+14 00 5D # aldc 93 # s[93] = "Testing inequalities "
+B7 00 02 # invokenative 2 # println("Testing inequalities ")
+57 # pop # (ignore result)
+10 05 # bipush 5 # 5
+10 04 # bipush 4 # 4
+A3 00 06 # if_icmpgt +6 # if (5 > 4) goto <00:then>
+A7 00 0D # goto +13 # goto <01:else>
+# <00:then>
+14 00 75 # aldc 117 # s[117] = "y1 "
+B7 00 01 # invokenative 1 # print("y1 ")
+57 # pop # (ignore result)
+A7 00 0A # goto +10 # goto <02:endif>
+# <01:else>
+14 00 7A # aldc 122 # s[122] = "n1 "
+B7 00 01 # invokenative 1 # print("n1 ")
+57 # pop # (ignore result)
+# <02:endif>
+10 01 # bipush 1 # 1
+10 FF # bipush -1 # -1
+A3 00 06 # if_icmpgt +6 # if (1 > -(1)) goto <03:then>
+A7 00 0D # goto +13 # goto <04:else>
+# <03:then>
+14 00 7F # aldc 127 # s[127] = "y2 "
+B7 00 01 # invokenative 1 # print("y2 ")
+57 # pop # (ignore result)
+A7 00 0A # goto +10 # goto <05:endif>
+# <04:else>
+14 00 84 # aldc 132 # s[132] = "n2 "
+B7 00 01 # invokenative 1 # print("n2 ")
+57 # pop # (ignore result)
+# <05:endif>
+10 00 # bipush 0 # 0
+10 00 # bipush 0 # 0
+A2 00 06 # if_icmpge +6 # if (0 >= 0) goto <06:then>
+A7 00 0D # goto +13 # goto <07:else>
+# <06:then>
+14 00 89 # aldc 137 # s[137] = "y3 "
+B7 00 01 # invokenative 1 # print("y3 ")
+57 # pop # (ignore result)
+A7 00 0A # goto +10 # goto <08:endif>
+# <07:else>
+14 00 8E # aldc 142 # s[142] = "n3 "
+B7 00 01 # invokenative 1 # print("n3 ")
+57 # pop # (ignore result)
+# <08:endif>
+13 00 05 # ildc 5 # c[5] = 12945
+13 00 06 # ildc 6 # c[6] = -235
+A1 00 06 # if_icmplt +6 # if (12945 < -(235)) goto <09:then>
+A7 00 0D # goto +13 # goto <10:else>
+# <09:then>
+14 00 93 # aldc 147 # s[147] = "y4 "
+B7 00 01 # invokenative 1 # print("y4 ")
+57 # pop # (ignore result)
+A7 00 0A # goto +10 # goto <11:endif>
+# <10:else>
+14 00 98 # aldc 152 # s[152] = "n4 "
+B7 00 01 # invokenative 1 # print("n4 ")
+57 # pop # (ignore result)
+# <11:endif>
+10 05 # bipush 5 # 5
+10 05 # bipush 5 # 5
+A1 00 06 # if_icmplt +6 # if (5 < 5) goto <12:then>
+A7 00 0D # goto +13 # goto <13:else>
+# <12:then>
+14 00 9D # aldc 157 # s[157] = "y5 "
+B7 00 01 # invokenative 1 # print("y5 ")
+57 # pop # (ignore result)
+A7 00 0A # goto +10 # goto <14:endif>
+# <13:else>
+14 00 A2 # aldc 162 # s[162] = "n5 "
+B7 00 01 # invokenative 1 # print("n5 ")
+57 # pop # (ignore result)
+# <14:endif>
+10 FB # bipush -5 # -5
+10 05 # bipush 5 # 5
+9F 00 06 # if_cmpeq +6 # if (-(5) == 5) goto <15:then>
+A7 00 0D # goto +13 # goto <16:else>
+# <15:then>
+14 00 A7 # aldc 167 # s[167] = "y6 "
+B7 00 01 # invokenative 1 # print("y6 ")
+57 # pop # (ignore result)
+A7 00 0A # goto +10 # goto <17:endif>
+# <16:else>
+14 00 AC # aldc 172 # s[172] = "n6 "
+B7 00 01 # invokenative 1 # print("n6 ")
+57 # pop # (ignore result)
+# <17:endif>
+10 0F # bipush 15 # 15
+10 F1 # bipush -15 # -15
+A0 00 06 # if_cmpne +6 # if (15 != -(15)) goto <18:then>
+A7 00 0D # goto +13 # goto <19:else>
+# <18:then>
+14 00 B1 # aldc 177 # s[177] = "y7 "
+B7 00 01 # invokenative 1 # print("y7 ")
+57 # pop # (ignore result)
+A7 00 0A # goto +10 # goto <20:endif>
+# <19:else>
+14 00 B6 # aldc 182 # s[182] = "n7 "
+B7 00 01 # invokenative 1 # print("n7 ")
+57 # pop # (ignore result)
+# <20:endif>
+14 00 BB # aldc 187 # s[187] = "Testing bitwise operators "
+B7 00 02 # invokenative 2 # println("Testing bitwise operators ")
+57 # pop # (ignore result)
+13 00 07 # ildc 7 # c[7] = 992044
+13 00 08 # ildc 8 # c[8] = 16720722
+7E # iand # (992044 & 16720722)
+B7 00 00 # invokenative 0 # printint((992044 & 16720722))
+57 # pop # (ignore result)
+14 00 D8 # aldc 216 # s[216] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+13 00 09 # ildc 9 # c[9] = 992044
+13 00 0A # ildc 10 # c[10] = 1045042
+80 # ior # (992044 | 1045042)
+B7 00 00 # invokenative 0 # printint((992044 | 1045042))
+57 # pop # (ignore result)
+14 00 DC # aldc 220 # s[220] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+13 00 0B # ildc 11 # c[11] = 52517
+13 00 0C # ildc 12 # c[12] = 7463
+82 # ixor # (52517 ^ 7463)
+B7 00 00 # invokenative 0 # printint((52517 ^ 7463))
+57 # pop # (ignore result)
+14 00 E0 # aldc 224 # s[224] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+13 00 0D # ildc 13 # c[13] = 12082
+10 FF # bipush -1 #
+82 # ixor # ~(12082)
+B7 00 00 # invokenative 0 # printint(~(12082))
+57 # pop # (ignore result)
+14 00 E4 # aldc 228 # s[228] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+14 00 E8 # aldc 232 # s[232] = "Testing bit shifting"
+B7 00 02 # invokenative 2 # println("Testing bit shifting")
+57 # pop # (ignore result)
+10 01 # bipush 1 # 1
+10 1F # bipush 31 # 31
+78 # ishl # (1 << 31)
+B7 00 00 # invokenative 0 # printint((1 << 31))
+57 # pop # (ignore result)
+14 00 FD # aldc 253 # s[253] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 17 # bipush 23 # 23
+10 05 # bipush 5 # 5
+78 # ishl # (23 << 5)
+B7 00 00 # invokenative 0 # printint((23 << 5))
+57 # pop # (ignore result)
+14 01 01 # aldc 257 # s[257] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 01 # bipush 1 # 1
+10 05 # bipush 5 # 5
+7A # ishr # (1 >> 5)
+10 07 # bipush 7 # 7
+78 # ishl # ((1 >> 5) << 7)
+B7 00 00 # invokenative 0 # printint(((1 >> 5) << 7))
+57 # pop # (ignore result)
+14 01 05 # aldc 261 # s[261] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+13 00 0E # ildc 14 # c[14] = 2352352
+10 02 # bipush 2 # 2
+7A # ishr # (2352352 >> 2)
+B7 00 00 # invokenative 0 # printint((2352352 >> 2))
+57 # pop # (ignore result)
+14 01 09 # aldc 265 # s[265] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 FA # bipush -6 # -6
+10 19 # bipush 25 # 25
+64 # isub # (-(6) - 25)
+B7 00 00 # invokenative 0 # printint((-(6) - 25))
+57 # pop # (ignore result)
+14 01 0D # aldc 269 # s[269] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+10 06 # bipush 6 # 6
+10 19 # bipush 25 # 25
+64 # isub # (6 - 25)
+B7 00 00 # invokenative 0 # printint((6 - 25))
+57 # pop # (ignore result)
+14 01 11 # aldc 273 # s[273] = " "
+B7 00 01 # invokenative 1 # print(" ")
+57 # pop # (ignore result)
+14 01 15 # aldc 277 # s[277] = ""
+B7 00 02 # invokenative 2 # println("")
+57 # pop # (ignore result)
+10 00 # bipush 0 # 0
+B0 # return #
+
+00 03 # native count
+# native pool
+00 01 00 13 # printint
+00 01 00 10 # print
+00 01 00 14 # println
+
diff --git a/test/arith.c0.bc0out b/test/arith.c0.bc0out
new file mode 100644
index 0000000..673192c
--- /dev/null
+++ b/test/arith.c0.bc0out
@@ -0,0 +1,6 @@
+-2147483648 2147483647 -375 -2147483648 -9 -1 12
+-12 12 Modulus testing 11-1 5 1 Testing constants -251 Testing inequalities
+y1 y2 y3 n4 n5 n6 y7 Testing bitwise operators
+992000 1045310 53250 -12083 Testing bit shifting
+-2147483648 736 0 588088 -31 -19
+0
diff --git a/test/arith.c0.c0out b/test/arith.c0.c0out
new file mode 100644
index 0000000..673192c
--- /dev/null
+++ b/test/arith.c0.c0out
@@ -0,0 +1,6 @@
+-2147483648 2147483647 -375 -2147483648 -9 -1 12
+-12 12 Modulus testing 11-1 5 1 Testing constants -251 Testing inequalities
+y1 y2 y3 n4 n5 n6 y7 Testing bitwise operators
+992000 1045310 53250 -12083 Testing bit shifting
+-2147483648 736 0 588088 -31 -19
+0
diff --git a/test/arith.c0.ex b/test/arith.c0.ex
new file mode 100755
index 0000000..9f16997
Binary files /dev/null and b/test/arith.c0.ex differ
diff --git a/test/arrays.c0.bc0 b/test/arrays.c0.bc0
index 380b6e0..9dd5a59 100644
--- a/test/arrays.c0.bc0
+++ b/test/arrays.c0.bc0
@@ -48,5 +48,5 @@ B0 # return #
00 01 # native count
# native pool
-00 01 00 09 # printint
+00 01 00 10 # printint
diff --git a/test/chararrays.c0 b/test/chararrays.c0
new file mode 100644
index 0000000..6d6f169
--- /dev/null
+++ b/test/chararrays.c0
@@ -0,0 +1,7 @@
+#use
+
+int main() {
+ char[] A = alloc_array(char, 5);
+ printchar(A[3]);
+ return 0;
+}
diff --git a/test/easyMath.c0 b/test/easyMath.c0
new file mode 100644
index 0000000..cc82bcb
--- /dev/null
+++ b/test/easyMath.c0
@@ -0,0 +1,3 @@
+int main() {
+ return (23 * 19)<<2;
+}
diff --git a/test/easyMath.c0.bc0 b/test/easyMath.c0.bc0
new file mode 100644
index 0000000..8b21ff7
--- /dev/null
+++ b/test/easyMath.c0.bc0
@@ -0,0 +1,26 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 00 # string pool total size
+# string pool
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 00 # number of local variables = 0
+00 09 # code length = 9 bytes
+10 17 # bipush 23 # 23
+10 13 # bipush 19 # 19
+68 # imul # (23 * 19)
+10 02 # bipush 2 # 2
+78 # ishl # ((23 * 19) << 2)
+B0 # return #
+
+00 00 # native count
+# native pool
+
diff --git a/test/easyMath.c0.bc0out b/test/easyMath.c0.bc0out
new file mode 100644
index 0000000..461033f
--- /dev/null
+++ b/test/easyMath.c0.bc0out
@@ -0,0 +1 @@
+1748
diff --git a/test/easyMath.c0.c0out b/test/easyMath.c0.c0out
new file mode 100644
index 0000000..461033f
--- /dev/null
+++ b/test/easyMath.c0.c0out
@@ -0,0 +1 @@
+1748
diff --git a/test/easyMath.c0.ex b/test/easyMath.c0.ex
new file mode 100755
index 0000000..9973be0
Binary files /dev/null and b/test/easyMath.c0.ex differ
diff --git a/test/hellosir.c0 b/test/hellosir.c0
new file mode 100644
index 0000000..75b6fdb
--- /dev/null
+++ b/test/hellosir.c0
@@ -0,0 +1,9 @@
+#use
+#use
+
+int main () {
+ print("What's your name? ");
+ string name = readline();
+ print(string_join("Hello, ", string_join(name, "!\n")));
+ return 0;
+}
diff --git a/test/hellosir.c0.bc0 b/test/hellosir.c0.bc0
new file mode 100644
index 0000000..2b5b9da
--- /dev/null
+++ b/test/hellosir.c0.bc0
@@ -0,0 +1,40 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 1E # string pool total size
+# string pool
+57 68 61 74 27 73 20 79 6F 75 72 20 6E 61 6D 65 3F 20 00 # "What\'s your name\? "
+48 65 6C 6C 6F 2C 20 00 # "Hello, "
+21 0A 00 # "!\n"
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 01 # number of local variables = 1
+00 21 # code length = 33 bytes
+14 00 00 # aldc 0 # s[0] = "What\'s your name\? "
+B7 00 00 # invokenative 0 # print("What\'s your name\? ")
+57 # pop # (ignore result)
+B7 00 01 # invokenative 1 # readline()
+36 00 # vstore 0 # name = readline();
+14 00 13 # aldc 19 # s[19] = "Hello, "
+15 00 # vload 0 # name
+14 00 1B # aldc 27 # s[27] = "!\n"
+B7 00 02 # invokenative 2 # string_join(name, "!\n")
+B7 00 02 # invokenative 2 # string_join("Hello, ", string_join(name, "!\n"))
+B7 00 00 # invokenative 0 # print(string_join("Hello, ", string_join(name, "!\n")))
+57 # pop # (ignore result)
+10 00 # bipush 0 # 0
+B0 # return #
+
+00 03 # native count
+# native pool
+00 01 00 06 # print
+00 00 00 0B # readline
+00 02 00 4F # string_join
+
diff --git a/test/hellosir.c0.bc0out b/test/hellosir.c0.bc0out
new file mode 100644
index 0000000..23f1147
--- /dev/null
+++ b/test/hellosir.c0.bc0out
@@ -0,0 +1,2 @@
+What's your name? Hello, uo!
+0
diff --git a/test/hellosir.c0.c0out b/test/hellosir.c0.c0out
new file mode 100644
index 0000000..10f58e0
--- /dev/null
+++ b/test/hellosir.c0.c0out
@@ -0,0 +1,2 @@
+What's your name? Hello, hi!
+0
diff --git a/test/hellosir.c0.ex b/test/hellosir.c0.ex
new file mode 100755
index 0000000..6dc82c9
Binary files /dev/null and b/test/hellosir.c0.ex differ
diff --git a/test/iadd.c0.bc0out b/test/iadd.c0.bc0out
new file mode 100644
index 0000000..3fbedf6
--- /dev/null
+++ b/test/iadd.c0.bc0out
@@ -0,0 +1 @@
+-2
diff --git a/test/iadd.c0.c0out b/test/iadd.c0.c0out
new file mode 100644
index 0000000..3fbedf6
--- /dev/null
+++ b/test/iadd.c0.c0out
@@ -0,0 +1 @@
+-2
diff --git a/test/iadd.c0.ex b/test/iadd.c0.ex
new file mode 100755
index 0000000..7ab57f9
Binary files /dev/null and b/test/iadd.c0.ex differ
diff --git a/test/moreArrays.c0 b/test/moreArrays.c0
new file mode 100644
index 0000000..c9c0fe0
--- /dev/null
+++ b/test/moreArrays.c0
@@ -0,0 +1,10 @@
+#use
+
+int main() {
+ int[] A = alloc_array(int, 50);
+ A[3] = 23;
+ A[2] = 12;
+ printint(A[3]);
+ printint(A[2]);
+ return 0;
+}
diff --git a/test/moreArrays.c0.bc0 b/test/moreArrays.c0.bc0
new file mode 100644
index 0000000..595e47a
--- /dev/null
+++ b/test/moreArrays.c0.bc0
@@ -0,0 +1,48 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 00 # string pool total size
+# string pool
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 01 # number of local variables = 1
+00 2D # code length = 45 bytes
+10 32 # bipush 50 # 50
+BC 04 # newarray 4 # alloc_array(int, 50)
+36 00 # vstore 0 # A = alloc_array(int, 50);
+15 00 # vload 0 # A
+10 03 # bipush 3 # 3
+63 # aadds # &A[3]
+10 17 # bipush 23 # 23
+4E # imstore # A[3] = 23;
+15 00 # vload 0 # A
+10 02 # bipush 2 # 2
+63 # aadds # &A[2]
+10 0C # bipush 12 # 12
+4E # imstore # A[2] = 12;
+15 00 # vload 0 # A
+10 03 # bipush 3 # 3
+63 # aadds # &A[3]
+2E # imload # A[3]
+B7 00 00 # invokenative 0 # printint(A[3])
+57 # pop # (ignore result)
+15 00 # vload 0 # A
+10 02 # bipush 2 # 2
+63 # aadds # &A[2]
+2E # imload # A[2]
+B7 00 00 # invokenative 0 # printint(A[2])
+57 # pop # (ignore result)
+10 00 # bipush 0 # 0
+B0 # return #
+
+00 01 # native count
+# native pool
+00 01 00 13 # printint
+
diff --git a/test/moreArrays.c0.bc0out b/test/moreArrays.c0.bc0out
new file mode 100644
index 0000000..9bd1d36
--- /dev/null
+++ b/test/moreArrays.c0.bc0out
@@ -0,0 +1 @@
+23120
diff --git a/test/moreArrays.c0.c0out b/test/moreArrays.c0.c0out
new file mode 100644
index 0000000..9bd1d36
--- /dev/null
+++ b/test/moreArrays.c0.c0out
@@ -0,0 +1 @@
+23120
diff --git a/test/moreArrays.c0.ex b/test/moreArrays.c0.ex
new file mode 100755
index 0000000..dca9ddf
Binary files /dev/null and b/test/moreArrays.c0.ex differ
diff --git a/test/piazza1.c0 b/test/piazza1.c0
new file mode 100644
index 0000000..f913ca6
--- /dev/null
+++ b/test/piazza1.c0
@@ -0,0 +1,22 @@
+struct s
+{
+
+ int x;
+ int y;
+ int[] a;
+
+};
+
+int main()
+{
+ struct s* example=alloc(struct s);
+ example->y=5;
+ example->x=6;
+ int x = example->x + 1;
+ example->a=alloc_array(int,4);
+ example->a[0] = 5;
+ int y = example->a[0];
+ example->a[0]=3;
+ //@assert(\length(example->a)==4);
+ return example->x + x +y;
+}
diff --git a/test/piazza1.c0.bc0 b/test/piazza1.c0.bc0
new file mode 100644
index 0000000..d05e12a
--- /dev/null
+++ b/test/piazza1.c0.bc0
@@ -0,0 +1,70 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 00 # string pool total size
+# string pool
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 03 # number of local variables = 3
+00 52 # code length = 82 bytes
+BB 10 # new 16 # alloc(struct s)
+36 00 # vstore 0 # example = alloc(struct s);
+15 00 # vload 0 # example
+62 04 # aaddf 4 # &example->y
+10 05 # bipush 5 # 5
+4E # imstore # example->y = 5;
+15 00 # vload 0 # example
+62 00 # aaddf 0 # &example->x
+10 06 # bipush 6 # 6
+4E # imstore # example->x = 6;
+15 00 # vload 0 # example
+62 00 # aaddf 0 # &example->x
+2E # imload # example->x
+10 01 # bipush 1 # 1
+60 # iadd # (example->x + 1)
+36 01 # vstore 1 # x = (example->x + 1);
+15 00 # vload 0 # example
+62 08 # aaddf 8 # &example->a
+10 04 # bipush 4 # 4
+BC 04 # newarray 4 # alloc_array(int, 4)
+4F # amstore # example->a = alloc_array(int, 4);
+15 00 # vload 0 # example
+62 08 # aaddf 8 # &example->a
+2F # amload # example->a
+10 00 # bipush 0 # 0
+63 # aadds # &example->a[0]
+10 05 # bipush 5 # 5
+4E # imstore # example->a[0] = 5;
+15 00 # vload 0 # example
+62 08 # aaddf 8 # &example->a
+2F # amload # example->a
+10 00 # bipush 0 # 0
+63 # aadds # &example->a[0]
+2E # imload # example->a[0]
+36 02 # vstore 2 # y = example->a[0];
+15 00 # vload 0 # example
+62 08 # aaddf 8 # &example->a
+2F # amload # example->a
+10 00 # bipush 0 # 0
+63 # aadds # &example->a[0]
+10 03 # bipush 3 # 3
+4E # imstore # example->a[0] = 3;
+15 00 # vload 0 # example
+62 00 # aaddf 0 # &example->x
+2E # imload # example->x
+15 01 # vload 1 # x
+60 # iadd # (example->x + x)
+15 02 # vload 2 # y
+60 # iadd # ((example->x + x) + y)
+B0 # return #
+
+00 00 # native count
+# native pool
+
diff --git a/test/piazza1.c0.bc0out b/test/piazza1.c0.bc0out
new file mode 100644
index 0000000..3c03207
--- /dev/null
+++ b/test/piazza1.c0.bc0out
@@ -0,0 +1 @@
+18
diff --git a/test/piazza1.c0.c0out b/test/piazza1.c0.c0out
new file mode 100644
index 0000000..3c03207
--- /dev/null
+++ b/test/piazza1.c0.c0out
@@ -0,0 +1 @@
+18
diff --git a/test/piazza1.c0.ex b/test/piazza1.c0.ex
new file mode 100755
index 0000000..f4b1ffe
Binary files /dev/null and b/test/piazza1.c0.ex differ
diff --git a/test/strings.c0 b/test/strings.c0
new file mode 100644
index 0000000..ee28a66
--- /dev/null
+++ b/test/strings.c0
@@ -0,0 +1,29 @@
+#use
+#use
+
+char char_tolower(char c) {
+ int ccode = char_ord(c);
+ if (char_ord('A') <= ccode && ccode <= char_ord('Z')) {
+ int shift = char_ord('a') - char_ord('A');
+ return char_chr(ccode + shift);
+ } else {
+ return c;
+ }
+}
+
+string string_lower(string s)
+//@ensures string_length(s) == string_length(\result);
+{
+ int len = string_length(s);
+ char[] A = string_to_chararray(s);
+ char[] B = alloc_array(char, len+1);
+ for (int i = 0; i < len; i++)
+ B[i] = char_tolower(A[i]);
+ B[len] = '\0'; /* redundant */
+ return string_from_chararray(B);
+}
+
+int main() {
+ print (string_lower("HEllo There!?"));
+ return 0;
+}
diff --git a/test/strings.c0.bc0 b/test/strings.c0.bc0
new file mode 100644
index 0000000..0b7b6c7
--- /dev/null
+++ b/test/strings.c0.bc0
@@ -0,0 +1,118 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 0E # string pool total size
+# string pool
+48 45 6C 6C 6F 20 54 68 65 72 65 21 3F 00 # "HEllo There!\?"
+
+00 03 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 05 # number of local variables = 5
+00 0D # code length = 13 bytes
+14 00 00 # aldc 0 # s[0] = "HEllo There!\?"
+B8 00 02 # invokestatic 2 # string_lower("HEllo There!\?")
+B7 00 05 # invokenative 5 # print(string_lower("HEllo There!\?"))
+57 # pop # (ignore result)
+10 00 # bipush 0 # 0
+B0 # return #
+
+
+#
+00 01 # number of arguments = 1
+00 03 # number of local variables = 3
+00 3D # code length = 61 bytes
+15 00 # vload 0 # c
+B7 00 00 # invokenative 0 # char_ord(c)
+36 01 # vstore 1 # ccode = char_ord(c);
+10 41 # bipush 65 # 'A'
+B7 00 00 # invokenative 0 # char_ord('A')
+15 01 # vload 1 # ccode
+A4 00 06 # if_icmple +6 # if (char_ord('A') <= ccode) goto <03:and>
+A7 00 29 # goto +41 # goto <01:else>
+# <03:and>
+15 01 # vload 1 # ccode
+10 5A # bipush 90 # 'Z'
+B7 00 00 # invokenative 0 # char_ord('Z')
+A4 00 06 # if_icmple +6 # if (ccode <= char_ord('Z')) goto <00:then>
+A7 00 1C # goto +28 # goto <01:else>
+# <00:then>
+10 61 # bipush 97 # 'a'
+B7 00 00 # invokenative 0 # char_ord('a')
+10 41 # bipush 65 # 'A'
+B7 00 00 # invokenative 0 # char_ord('A')
+64 # isub # (char_ord('a') - char_ord('A'))
+36 02 # vstore 2 # shift = (char_ord('a') - char_ord('A'));
+15 01 # vload 1 # ccode
+15 02 # vload 2 # shift
+60 # iadd # (ccode + shift)
+B7 00 01 # invokenative 1 # char_chr((ccode + shift))
+B0 # return #
+A7 00 06 # goto +6 # goto <02:endif>
+# <01:else>
+15 00 # vload 0 # c
+B0 # return #
+# <02:endif>
+
+
+#
+00 01 # number of arguments = 1
+00 05 # number of local variables = 5
+00 4C # code length = 76 bytes
+15 00 # vload 0 # s
+B7 00 02 # invokenative 2 # string_length(s)
+36 01 # vstore 1 # len = string_length(s);
+15 00 # vload 0 # s
+B7 00 03 # invokenative 3 # string_to_chararray(s)
+36 02 # vstore 2 # A = string_to_chararray(s);
+15 01 # vload 1 # len
+10 01 # bipush 1 # 1
+60 # iadd # (len + 1)
+BC 01 # newarray 1 # alloc_array(char, (len + 1))
+36 03 # vstore 3 # B = alloc_array(char, (len + 1));
+10 00 # bipush 0 # 0
+36 04 # vstore 4 # i = 0;
+# <04:loop>
+15 04 # vload 4 # i
+15 01 # vload 1 # len
+A1 00 06 # if_icmplt +6 # if (i < len) goto <05:body>
+A7 00 1C # goto +28 # goto <06:exit>
+# <05:body>
+15 03 # vload 3 # B
+15 04 # vload 4 # i
+63 # aadds # &B[i]
+15 02 # vload 2 # A
+15 04 # vload 4 # i
+63 # aadds # &A[i]
+34 # cmload # A[i]
+B8 00 01 # invokestatic 1 # char_tolower(A[i])
+55 # cmstore # B[i] = char_tolower(A[i]);
+15 04 # vload 4 # i
+10 01 # bipush 1 # 1
+60 # iadd #
+36 04 # vstore 4 # i += 1;
+A7 FF E0 # goto -32 # goto <04:loop>
+# <06:exit>
+15 03 # vload 3 # B
+15 01 # vload 1 # len
+63 # aadds # &B[len]
+10 00 # bipush 0 # '\000'
+55 # cmstore # B[len] = '\0';
+15 03 # vload 3 # B
+B7 00 04 # invokenative 4 # string_from_chararray(B)
+B0 # return #
+
+00 06 # native count
+# native pool
+00 01 00 51 # char_ord
+00 01 00 50 # char_chr
+00 01 00 5A # string_length
+00 01 00 5D # string_to_chararray
+00 01 00 55 # string_from_chararray
+00 01 00 10 # print
+
diff --git a/test/strings.c0.bc0out b/test/strings.c0.bc0out
new file mode 100644
index 0000000..ea4ae23
--- /dev/null
+++ b/test/strings.c0.bc0out
@@ -0,0 +1 @@
+hello there!?0
diff --git a/test/strings.c0.c0out b/test/strings.c0.c0out
new file mode 100644
index 0000000..ea4ae23
--- /dev/null
+++ b/test/strings.c0.c0out
@@ -0,0 +1 @@
+hello there!?0
diff --git a/test/strings.c0.ex b/test/strings.c0.ex
new file mode 100755
index 0000000..2ebe489
Binary files /dev/null and b/test/strings.c0.ex differ
diff --git a/test/swapTest.c0.bc0 b/test/swapTest.c0.bc0
new file mode 100644
index 0000000..de2932c
--- /dev/null
+++ b/test/swapTest.c0.bc0
@@ -0,0 +1,25 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 00 # string pool total size
+# string pool
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 00 # number of local variables = 0
+00 07 # code length = 6 bytes
+10 FF # bipush -1 # -1
+10 23
+5F
+57
+B0 # return #
+
+00 00 # native count
+# native pool
+
diff --git a/test/testError.c0 b/test/testError.c0
new file mode 100644
index 0000000..6927ce5
--- /dev/null
+++ b/test/testError.c0
@@ -0,0 +1,7 @@
+#use
+
+int main() {
+ assert(2==2);
+ print("yolomode");
+ return 1;
+}
diff --git a/test/testError.c0.bc0 b/test/testError.c0.bc0
new file mode 100644
index 0000000..3a5125e
--- /dev/null
+++ b/test/testError.c0.bc0
@@ -0,0 +1,40 @@
+C0 C0 FF EE # magic number
+00 09 # version 4, arch = 1 (64 bits)
+
+00 00 # int pool count
+# int pool
+
+00 2E # string pool total size
+# string pool
+74 65 73 74 45 72 72 6F 72 2E 63 30 3A 34 2E 33 2D 34 2E 31 36 3A 20 61 73 73 65 72 74 20 66 61 69 6C 65 64 00 # "testError.c0:4.3-4.16: assert failed"
+79 6F 6C 6F 6D 6F 64 65 00 # "yolomode"
+
+00 01 # function count
+# function_pool
+
+#
+00 00 # number of arguments = 0
+00 00 # number of local variables = 0
+00 1F # code length = 31 bytes
+10 02 # bipush 2 # 2
+10 02 # bipush 2 # 2
+9F 00 06 # if_cmpeq +6 # if (2 == 2) goto <00:cond_true>
+A7 00 08 # goto +8 # goto <01:cond_false>
+# <00:cond_true>
+10 01 # bipush 1 # true
+A7 00 05 # goto +5 # goto <02:cond_end>
+# <01:cond_false>
+10 00 # bipush 0 # false
+# <02:cond_end>
+14 00 00 # aldc 0 # s[0] = "testError.c0:4.3-4.16: assert failed"
+CF # assert # assert(2 == 2) [failure message on stack]
+14 00 25 # aldc 37 # s[37] = "yolomode"
+B7 00 00 # invokenative 0 # print("yolomode")
+57 # pop # (ignore result)
+10 01 # bipush 1 # 1
+B0 # return #
+
+00 01 # native count
+# native pool
+00 01 00 06 # print
+
diff --git a/test/testError.c0.bc0out b/test/testError.c0.bc0out
new file mode 100644
index 0000000..46662a4
--- /dev/null
+++ b/test/testError.c0.bc0out
@@ -0,0 +1 @@
+yolomode1
diff --git a/test/testError.c0.c0out b/test/testError.c0.c0out
new file mode 100644
index 0000000..46662a4
--- /dev/null
+++ b/test/testError.c0.c0out
@@ -0,0 +1 @@
+yolomode1
diff --git a/test/testError.c0.ex b/test/testError.c0.ex
new file mode 100755
index 0000000..590ccef
Binary files /dev/null and b/test/testError.c0.ex differ
diff --git a/test/tests.js b/test/tests.js
index c77ee49..9d6a198 100644
--- a/test/tests.js
+++ b/test/tests.js
@@ -7,14 +7,41 @@ var printout = "";
callbacks[c0ffi.NATIVE_PRINT] = function(args) {
printout += args[0];
+ return 0;
}
callbacks[c0ffi.NATIVE_PRINTINT] = function(args) {
printout += args[0];
+ return 0;
}
callbacks[c0ffi.NATIVE_PRINTLN] = function(args) {
printout += (args[0] + "\n");
+ return 0;
+}
+
+callbacks[c0ffi.NATIVE_STRING_LENGTH] = function(args) {
+ return args[0].length;
+}
+
+callbacks[c0ffi.NATIVE_STRING_TO_CHARARRAY] = function(args) {
+ return args[0];
+}
+
+callbacks[c0ffi.NATIVE_STRING_FROM_CHARARRAY] = function(args) {
+ console.log("string_from_chararray: " + args);
+ return args[0];
+}
+
+callbacks[c0ffi.NATIVE_CHAR_CHR] = function(args) {
+ return String.fromCharCode(args[0]);
+}
+
+callbacks[c0ffi.NATIVE_CHAR_ORD] = function(args) {
+ console.log("native_car_ord: " + args);
+ if (typeof args[0] == "string")
+ return args[0].charCodeAt(0);
+ return args[0];
}
function doTest(filename, expected_result) {
@@ -57,11 +84,20 @@ exports.testDSQUARED = doTest("dsquared.c0.bc0", 17068);
exports.testArrays = function(test) {
test.throws(function () {
- c0vm.execute(parser.parse("arrays.c0.bc0"), callbacks, true)
+ c0vm.execute(parser.parse("arrays.c0.bc0"), callbacks, false)
});
test.done();
}
+exports.testMoreArray = function(test) {
+ printout = "";
+ var result = c0vm.execute(parser.parse("moreArrays.c0.bc0"), callbacks, false);
+ test.ok(printout == "2312",
+ "moreArrays.c0.bc0 - Did not print to screen correctly, result was " +
+ printout);
+ test.done();
+}
+
exports.testStructs = function(test) {
printout = "";
var result = c0vm.execute(parser.parse("structs.c0.bc0"), callbacks, false);
@@ -71,3 +107,29 @@ exports.testStructs = function(test) {
test.done();
}
+exports.testAbort = function(test) {
+ test.throws(function () {
+ c0vm.execute(parser.parse("abort.c0.bc0"), callbacks, false);
+ });
+ test.done();
+}
+
+exports.testArith = function(test) {
+ printout = "";
+ var result = c0vm.execute(parser.parse("arith.c0.bc0"), callbacks, false);
+ test.ok(printout == "-2147483648 2147483647 -375 -2147483648 -9 -1 12 \n-12 12 Modulus testing 11-1 5 1 Testing constants -251 Testing inequalities \ny1 y2 y3 n4 n5 n6 y7 Testing bitwise operators \n992000 1045310 53250 -12083 Testing bit shifting\n-2147483648 7360588088-31-19\n",
+ "arith.c0.bc0 - Did not print to screen correctly, result was " +
+ printout);
+ test.done();
+}
+
+exports.testPIAZZA1 = doTest("piazza1.c0.bc0", 18);
+
+exports.testSTRINGS = function(test) {
+ printout = "";
+ var result = c0vm.execute(parser.parse("strings.c0.bc0"), callbacks, false);
+ test.ok(printout == "hello there!?",
+ "strings.c0.bc0 - Did not print to screen correctly, result was " +
+ printout);
+ test.done();
+}