From af86f568732564b01e4b3896b3bcd9f07290980c Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sat, 28 Mar 2015 18:35:26 -0400 Subject: [PATCH 01/14] Watch out for operator precedence --- src/byte-stream.js | 1 - src/c0vm.js | 251 ++++++++++++++++++++++++--------------------- 2 files changed, 136 insertions(+), 116 deletions(-) diff --git a/src/byte-stream.js b/src/byte-stream.js index fca2fa7..fbf989e 100755 --- a/src/byte-stream.js +++ b/src/byte-stream.js @@ -1,5 +1,4 @@ var ByteStream = function (byte_array) { - console.log("Instance created."); this.byte_array = byte_array; this.index = 0; }; diff --git a/src/c0vm.js b/src/c0vm.js index 5344309..02d8535 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -1,225 +1,246 @@ op = require("./opcodes"); -var ProgramState = function(parsed_file) { - var main_function = parsed_file.function_pool[0]; - - this.stack = [] +var verbose = false; +function log(message) { + if (verbose) console.log(message); +} + +var StackFrame = function(file, f) { + log("Creating stack frame"); + this.stack = []; this.pc = 0; - this.program = main_function.code; + this.program = f.code; this.variables = []; - for (var i = 0; i < main_function.num_vars; i++) + for (var i = 0; i < f.num_vars; i++) variables.push(0); + this.file = file; +} + +var ProgramState = function(parsed_file) { + log("Creating program state with file " + parsed_file); + var main_function = parsed_file.function_pool[0]; + + this.frame = new StackFrame(parsed_file, parsed_file.function_pool[0]); + this.call_stack = [this.frame]; this.file = parsed_file; } +ProgramState.prototype.push = function(val) { + this.frame.stack.push(val); +} -ProgramState.prototype.doIf = function(shouldJump) { - if (shouldJump) { - var address_offset = (this.program[this.pc+1] * 0x1000) + - this.program[this.pc+2]; - this.pc += address_offset; +ProgramState.prototype.pop = function() { + return this.frame.stack.pop(); +} + +ProgramState.prototype.doIf = function(f) { + var y = this.pop(); + var x = this.pop(); + if (f(x,y)) { + var address_offset = (this.frame.program[this.frame.pc+1] * 0x1000) + + this.frame.program[this.frame.pc+2]; + this.frame.pc += address_offset; } else { - this.pc += 3; + this.frame.pc += 3; } } ProgramState.prototype.step = function() { - console.log("Running opcode " + op.lookup_table[this.program[this.pc]]); - switch (this.program[this.pc]) { + var opcode = this.frame.program[this.frame.pc] + log("Running opcode " + + op.lookup_table[opcode]); + switch (opcode) { // Stack manipulation case op.POP: - this.pc++; - this.stack.pop(); + this.frame.pc++; + this.pop(); break; case op.DUP: - this.pc++; - var v = this.stack.pop(); - this.stack.push(v); - this.stack.push(v); + this.frame.pc++; + var v = this.pop(); + this.push(v); + this.push(v); break; case op.SWAP: - this.pc++; - var v1 = this.stack.pop(); - var v2 = this.stack.pop(); - this.stack.push(v1); - this.stack.push(v2); + this.frame.pc++; + var v1 = this.pop(); + var v2 = this.pop(); + this.push(v1); + this.push(v2); break; case op.BIPUSH: - this.pc += 2; - var val = this.program[this.pc-1]; - + this.frame.pc += 2; + var val = this.frame.program[this.frame.pc-1]; + // Do sign extension if necessary - if (val & 0x80 != 0) + if ((val & 0x80) != 0) val = -0x80 + (val & 0x7F); - this.stack.push(val); + this.push(val); break; // Returning from a function case op.RETURN: - var retVal = this.stack.pop(); + var retVal = this.pop(); throw retVal; // Arithmetic case op.IADD: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); - console.log("Adding " + x + " and " + y); - this.stack.push((x+y) % 0x100000000); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); + log("Adding " + x + " and " + y); + this.push((x+y) % 0x100000000); break; case op.ISUB: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); - this.stack.push((x-y) % 0x100000000); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); + this.push((x-y) % 0x100000000); break; case op.IMUL: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); - this.stack.push((x*y) % 0x100000000); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); + this.push((x*y) % 0x100000000); break; case op.IDIV: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); if (y == 0) c0_arith_error("Divide by zero"); if (x == INT_MIN && y == -1) c0_arith_error("Arithmetic overflow"); // This does int division. // As I understand it, the ~~ is treated as the identity on integers // which forces the type to int, not float - this.stack.push(~~(x/y)); + this.push(~~(x/y)); break; case op.IREM: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); if (y == 0) c0_arith_error("Divide by zero"); if (x == INT_MIN && y == -1) c0_arith_error("Arithmetic overflow"); - this.stack.push(x%y); + this.push(x%y); break; case op.IAND: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); - this.stack.push(x&y); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); + this.push(x&y); break; case op.IOR: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); - this.stack.push(x|y); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); + this.push(x|y); break; case op.IXOR: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); - this.stack.push(x^y); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); + this.push(x^y); break; case op.ISHL: - this.pc++; - var y = this.stack.pop(); - var x = this.stack.pop(); + this.frame.pc++; + var y = this.pop(); + var x = this.pop(); if (y < 0 || y > 31) c0_arith_error("Shifting by too many bits"); - this.stack.push(x<>y); + this.push(x>>y); break; // Operations on local variables case op.VLOAD: - this.pc += 2; - var index = this.program[this.pc-1]; - this.stack.push(this.variables[index]); + this.frame.pc += 2; + var index = this.frame.program[this.frame.pc-1]; + this.push(this.frame.variables[index]); break; case op.VSTORE: - this.pc += 2; - var index = this.program[this.pc-1]; - this.variables[index] = this.stack.pop(); + this.frame.pc += 2; + var index = this.frame.program[this.frame.pc-1]; + this.frame.variables[index] = this.pop(); break; case op.ACONST_NULL: - this.pc++; - this.stack.push(0); + this.frame.pc++; + this.push(0); break; case op.ILDC: - this.pc += 3; - var c1 = this.program[this.pc-2]; - var c2 = this.program[this.pc-1]; + this.frame.pc += 3; + var c1 = this.frame.program[this.frame.pc-2]; + var c2 = this.frame.program[this.frame.pc-1]; var index = (c1 * 0x1000) + c2; - this.stack.push(this.file.int_pool[index]); + this.push(this.file.int_pool[index]); break; case op.ALDC: - console.log("Error: I don't know how to handle ALDC yet"); - throw "Error - can't handle ALDC"; + this.frame.pc += 3; + var c1 = this.frame.program[this.frame.pc-2]; + var c2 = this.frame.program[this.frame.pc-1]; + var index = (c1 * 0x1000) + c2; + + this.push(this.file.string_pool[index]); + break; // Control flow case op.NOP: - this.pc++; + this.frame.pc++; break; case op.IF_CMPEQ: - var y = this.stack.pop(); - var x = this.stack.pop(); - this.doIf(y == x); + this.doIf(function (x,y) {return y == x;}); break; case op.IF_CMPNE: - var y = this.stack.pop(); - var x = this.stack.pop(); - this.doIf(y != x); + this.doIf(function (x,y) {return y != x;}); break; case op.IF_CMPLT: - var y = this.stack.pop(); - var x = this.stack.pop(); - this.doIf(y > x); + this.doIf(function (x,y) {return y > x;}); break; case op.IF_CMPGE: - var y = this.stack.pop(); - var x = this.stack.pop(); - this.doIf(y <= x); + this.doIf(function (x,y) {return y <= x;}); break; case op.IF_CMPGT: - var y = this.stack.pop(); - var x = this.stack.pop(); - this.doIf(y < x); + this.doIf(function (x,y) {return y < x;}); break; case op.IF_CMPLE: - var y = this.stack.pop(); - var x = this.stack.pop(); - this.doIf(y >= x); + this.doIf(function (x,y) {return y >= x;}); break; case op.GOTO: - this.doIf(true); + this.doIf(function (x,y) {return true;}); break; case op.ATHROW: - this.pc++; - c0_user_error(this.stack.pop()); + this.frame.pc++; + c0_user_error(this.pop()); break; case op.ASSERT: - this.pc++; - var a = this.stack.pop(); - if (this.stack.pop() == 0) + this.frame.pc++; + var a = this.pop(); + if (this.pop() == 0) c0_assertion_failure(a); break; default: - console.log("Error: Unknown opcode\n"); + console.log("Error: Unknown opcode: 0x" + opcode.toString(16) + "\n"); throw "Error - unknown opcode"; } return false; } // Takes in a parsed .bc0 file and runs it -function execute(f) { - console.log("Beginning execution of file " + f); +function execute(file, callbacks, v) { + verbose = typeof v !== 'undefined' ? v : true; + log("Initializing with file " + file); - var state = new ProgramState(f); + var state = new ProgramState(file); + + log("Beginning execution"); while (true) { // I'm not sure how to structure this control flow yet, From 6774610569ba2145ae44c0e592a3fb4f39e9a171 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sat, 28 Mar 2015 18:35:43 -0400 Subject: [PATCH 02/14] Added unit tests. Meant to be run with nodeunit --- test/ishr.c0 | 3 +++ test/ishr.c0.bc0 | 24 ++++++++++++++++++++++++ test/ishr.c0.bc0out | 1 + test/ishr.c0.c0out | 1 + test/ishr.c0.ex | Bin 0 -> 13263 bytes test/tests.js | 23 +++++++++++++++++++++++ 6 files changed, 52 insertions(+) create mode 100644 test/ishr.c0 create mode 100644 test/ishr.c0.bc0 create mode 100644 test/ishr.c0.bc0out create mode 100644 test/ishr.c0.c0out create mode 100755 test/ishr.c0.ex create mode 100644 test/tests.js diff --git a/test/ishr.c0 b/test/ishr.c0 new file mode 100644 index 0000000..884a533 --- /dev/null +++ b/test/ishr.c0 @@ -0,0 +1,3 @@ +int main () { + return -1 >> 1; /* should return -1 */ +} diff --git a/test/ishr.c0.bc0 b/test/ishr.c0.bc0 new file mode 100644 index 0000000..34f85f9 --- /dev/null +++ b/test/ishr.c0.bc0 @@ -0,0 +1,24 @@ +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 06 # code length = 6 bytes +10 FF # bipush -1 # -1 +10 01 # bipush 1 # 1 +7A # ishr # (-(1) >> 1) +B0 # return # + +00 00 # native count +# native pool + diff --git a/test/ishr.c0.bc0out b/test/ishr.c0.bc0out new file mode 100644 index 0000000..3a2e3f4 --- /dev/null +++ b/test/ishr.c0.bc0out @@ -0,0 +1 @@ +-1 diff --git a/test/ishr.c0.c0out b/test/ishr.c0.c0out new file mode 100644 index 0000000..3a2e3f4 --- /dev/null +++ b/test/ishr.c0.c0out @@ -0,0 +1 @@ +-1 diff --git a/test/ishr.c0.ex b/test/ishr.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..a8e8013efbe76f579332b956c4a8936fb19d0f63 GIT binary patch literal 13263 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 1 gave " + result + ", not -1"); + test.done(); +} From 9159cf1389d5d71b17dd9bf64f93b0fa7183527d Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sat, 28 Mar 2015 19:14:10 -0400 Subject: [PATCH 03/14] Added more tests, function calls work Fixed a bunch of bugs in other opcodes, too --- src/c0vm.js | 74 ++++++++++++++++++++++++++++++------- src/opcodes.js | 12 +++--- test/dsquared.c0 | 23 ++++++++++++ test/dsquared.c0.bc0 | 78 +++++++++++++++++++++++++++++++++++++++ test/dsquared.c0.bc0out | 1 + test/dsquared.c0.c0out | 1 + test/dsquared.c0.ex | Bin 0 -> 13920 bytes test/isqrt.c0 | 10 +++++ test/isqrt.c0.bc0 | 51 +++++++++++++++++++++++++ test/isqrt.c0.bc0out | 0 test/isqrt.c0.c0out | 1 + test/isqrt.c0.ex | Bin 0 -> 13360 bytes test/mid.c0 | 10 +++++ test/mid.c0.bc0 | 35 ++++++++++++++++++ test/mid.c0.bc0out | 1 + test/mid.c0.c0out | 1 + test/mid.c0.ex | Bin 0 -> 13350 bytes test/sample2.5.c0 | 7 ++++ test/sample2.5.c0.bc0 | 55 +++++++++++++++++++++++++++ test/sample2.5.c0.bc0out | 0 test/sample2.5.c0.c0out | 0 test/sample2.5.c0.ex | Bin 0 -> 13606 bytes test/testif.c0 | 8 ++++ test/testif.c0.bc0 | 36 ++++++++++++++++++ test/testif.c0.bc0out | 1 + test/testif.c0.c0out | 1 + test/testif.c0.ex | Bin 0 -> 13313 bytes test/tests.js | 34 ++++++++++++----- 28 files changed, 412 insertions(+), 28 deletions(-) create mode 100644 test/dsquared.c0 create mode 100644 test/dsquared.c0.bc0 create mode 100644 test/dsquared.c0.bc0out create mode 100644 test/dsquared.c0.c0out create mode 100755 test/dsquared.c0.ex create mode 100644 test/isqrt.c0 create mode 100644 test/isqrt.c0.bc0 create mode 100644 test/isqrt.c0.bc0out create mode 100644 test/isqrt.c0.c0out create mode 100755 test/isqrt.c0.ex create mode 100644 test/mid.c0 create mode 100644 test/mid.c0.bc0 create mode 100644 test/mid.c0.bc0out create mode 100644 test/mid.c0.c0out create mode 100755 test/mid.c0.ex create mode 100644 test/sample2.5.c0 create mode 100644 test/sample2.5.c0.bc0 create mode 100644 test/sample2.5.c0.bc0out create mode 100644 test/sample2.5.c0.c0out create mode 100755 test/sample2.5.c0.ex create mode 100644 test/testif.c0 create mode 100644 test/testif.c0.bc0 create mode 100644 test/testif.c0.bc0out create mode 100644 test/testif.c0.c0out create mode 100755 test/testif.c0.ex diff --git a/src/c0vm.js b/src/c0vm.js index 02d8535..13338a9 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -1,10 +1,17 @@ op = require("./opcodes"); +var INT_MIN = 0x80000000; +var INT_MAX = 0x7FFFFFFF; + var verbose = false; function log(message) { if (verbose) console.log(message); } +function c0_assertion_failure(val) { + throw "c0 assertion failure: " + val; +} + var StackFrame = function(file, f) { log("Creating stack frame"); this.stack = []; @@ -12,7 +19,7 @@ var StackFrame = function(file, f) { this.program = f.code; this.variables = []; for (var i = 0; i < f.num_vars; i++) - variables.push(0); + this.variables.push(0); this.file = file; } @@ -21,7 +28,7 @@ var ProgramState = function(parsed_file) { var main_function = parsed_file.function_pool[0]; this.frame = new StackFrame(parsed_file, parsed_file.function_pool[0]); - this.call_stack = [this.frame]; + this.call_stack = []; this.file = parsed_file; } @@ -33,13 +40,23 @@ ProgramState.prototype.pop = function() { return this.frame.stack.pop(); } +ProgramState.prototype.goto_offset = function() { + var c1 = this.frame.program[this.frame.pc+1]; + var c2 = this.frame.program[this.frame.pc+2] + + var address_offset = (c1 << 8) + c2; + // Handle negative values + if ((address_offset & 0x8000) != 0) + address_offset = -0x8000 + (address_offset & 0x7FFF); + + this.frame.pc += address_offset; +} + ProgramState.prototype.doIf = function(f) { var y = this.pop(); var x = this.pop(); if (f(x,y)) { - var address_offset = (this.frame.program[this.frame.pc+1] * 0x1000) + - this.frame.program[this.frame.pc+2]; - this.frame.pc += address_offset; + this.goto_offset(); } else { this.frame.pc += 3; } @@ -47,7 +64,7 @@ ProgramState.prototype.doIf = function(f) { ProgramState.prototype.step = function() { var opcode = this.frame.program[this.frame.pc] - log("Running opcode " + + log("0x" + this.frame.pc.toString(16) + " Running opcode " + op.lookup_table[opcode]); switch (opcode) { // Stack manipulation @@ -81,8 +98,13 @@ ProgramState.prototype.step = function() { // Returning from a function case op.RETURN: var retVal = this.pop(); - throw retVal; + if (this.call_stack.length == 0) + throw retVal; + this.frame = this.call_stack.pop(); + this.push(retVal); + + break; // Arithmetic case op.IADD: this.frame.pc++; @@ -200,20 +222,20 @@ ProgramState.prototype.step = function() { case op.IF_CMPNE: this.doIf(function (x,y) {return y != x;}); break; - case op.IF_CMPLT: + case op.IF_ICMPLT: this.doIf(function (x,y) {return y > x;}); break; - case op.IF_CMPGE: + case op.IF_ICMPGE: this.doIf(function (x,y) {return y <= x;}); break; - case op.IF_CMPGT: + case op.IF_ICMPGT: this.doIf(function (x,y) {return y < x;}); break; - case op.IF_CMPLE: + case op.IF_ICMPLE: this.doIf(function (x,y) {return y >= x;}); break; case op.GOTO: - this.doIf(function (x,y) {return true;}); + this.goto_offset(); break; case op.ATHROW: this.frame.pc++; @@ -226,8 +248,34 @@ ProgramState.prototype.step = function() { c0_assertion_failure(a); break; + // Function call operations + + case op.INVOKESTATIC: + var c1 = this.frame.program[this.frame.pc+1]; + var c2 = this.frame.program[this.frame.pc+2]; + this.frame.pc += 3; + + var index = (c1 << 8) + c2; + + var f = this.file.function_pool[index]; + var newFrame = new StackFrame(this.file, f); + for (var i = f.num_args - 1; i >= 0; i--) { + newFrame.variables[i] = this.pop(); + } + + this.call_stack.push(this.frame); + this.frame = newFrame; + break; + default: - console.log("Error: Unknown opcode: 0x" + opcode.toString(16) + "\n"); + var opcode_name; + try { + opcode_name = op.lookup_table[opcode]; + } catch (ignored) { + opcode_name = "UNKNOWN"; + } + console.log("Error: Unknown opcode: 0x" + opcode.toString(16) + + " (" + opcode_name + ")\n"); throw "Error - unknown opcode"; } return false; diff --git a/src/opcodes.js b/src/opcodes.js index b0ed6eb..98ec086 100644 --- a/src/opcodes.js +++ b/src/opcodes.js @@ -90,12 +90,12 @@ exports.lookup_table = { 0x13: "ILDC", 0x14: "ALDC", 0x00: "NOP", - 0x9F: "IF", - 0xA0: "IF", - 0xA1: "IF", - 0xA2: "IF", - 0xA3: "IF", - 0xA4: "IF", + 0x9F: "IF_CMPEQ", + 0xA0: "IF_CMPNE", + 0xA1: "IF_ICMPLT", + 0xA2: "IF_ICMPGE", + 0xA3: "IF_ICMPGT", + 0xA4: "IF_ICMPLE", 0xA7: "GOTO", 0xBF: "ATHROW", 0xCF: "ASSERT", diff --git a/test/dsquared.c0 b/test/dsquared.c0 new file mode 100644 index 0000000..860baae --- /dev/null +++ b/test/dsquared.c0 @@ -0,0 +1,23 @@ +int dsquared(int x, int y) +{ + return x*x + y*y; +} + +int main () +{ + int a1 = 15; + int b1 = 122; + int a2 = 42; + int b2 = 0; + int a3 = -7; + int b3 = -11; + int a4 = -4; + int b4 = 3; + int sum = 0; + sum = sum + dsquared(a1,b1); + sum = sum + dsquared(a2,b2); + sum = sum + dsquared(a3,b3); + sum = sum + dsquared(a4,b4); + return sum; +} + diff --git a/test/dsquared.c0.bc0 b/test/dsquared.c0.bc0 new file mode 100644 index 0000000..d95b37a --- /dev/null +++ b/test/dsquared.c0.bc0 @@ -0,0 +1,78 @@ +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 02 # function count +# function_pool + +#
+00 00 # number of arguments = 0 +00 09 # number of local variables = 9 +00 57 # code length = 87 bytes +10 0F # bipush 15 # 15 +36 00 # vstore 0 # a1 = 15; +10 7A # bipush 122 # 122 +36 01 # vstore 1 # b1 = 122; +10 2A # bipush 42 # 42 +36 02 # vstore 2 # a2 = 42; +10 00 # bipush 0 # 0 +36 03 # vstore 3 # b2 = 0; +10 F9 # bipush -7 # -7 +36 04 # vstore 4 # a3 = -(7); +10 F5 # bipush -11 # -11 +36 05 # vstore 5 # b3 = -(11); +10 FC # bipush -4 # -4 +36 06 # vstore 6 # a4 = -(4); +10 03 # bipush 3 # 3 +36 07 # vstore 7 # b4 = 3; +10 00 # bipush 0 # 0 +36 08 # vstore 8 # sum = 0; +15 08 # vload 8 # sum +15 00 # vload 0 # a1 +15 01 # vload 1 # b1 +B8 00 01 # invokestatic 1 # dsquared(a1, b1) +60 # iadd # (sum + dsquared(a1, b1)) +36 08 # vstore 8 # sum = (sum + dsquared(a1, b1)); +15 08 # vload 8 # sum +15 02 # vload 2 # a2 +15 03 # vload 3 # b2 +B8 00 01 # invokestatic 1 # dsquared(a2, b2) +60 # iadd # (sum + dsquared(a2, b2)) +36 08 # vstore 8 # sum = (sum + dsquared(a2, b2)); +15 08 # vload 8 # sum +15 04 # vload 4 # a3 +15 05 # vload 5 # b3 +B8 00 01 # invokestatic 1 # dsquared(a3, b3) +60 # iadd # (sum + dsquared(a3, b3)) +36 08 # vstore 8 # sum = (sum + dsquared(a3, b3)); +15 08 # vload 8 # sum +15 06 # vload 6 # a4 +15 07 # vload 7 # b4 +B8 00 01 # invokestatic 1 # dsquared(a4, b4) +60 # iadd # (sum + dsquared(a4, b4)) +36 08 # vstore 8 # sum = (sum + dsquared(a4, b4)); +15 08 # vload 8 # sum +B0 # return # + + +# +00 02 # number of arguments = 2 +00 02 # number of local variables = 2 +00 0C # code length = 12 bytes +15 00 # vload 0 # x +15 00 # vload 0 # x +68 # imul # (x * x) +15 01 # vload 1 # y +15 01 # vload 1 # y +68 # imul # (y * y) +60 # iadd # ((x * x) + (y * y)) +B0 # return # + +00 00 # native count +# native pool + diff --git a/test/dsquared.c0.bc0out b/test/dsquared.c0.bc0out new file mode 100644 index 0000000..52d2ba8 --- /dev/null +++ b/test/dsquared.c0.bc0out @@ -0,0 +1 @@ +17068 diff --git a/test/dsquared.c0.c0out b/test/dsquared.c0.c0out new file mode 100644 index 0000000..52d2ba8 --- /dev/null +++ b/test/dsquared.c0.c0out @@ -0,0 +1 @@ +17068 diff --git a/test/dsquared.c0.ex b/test/dsquared.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..60c7863dc4dafdb244fff984fe7a827024fa1122 GIT binary patch literal 13920 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 literal 0 HcmV?d00001 diff --git a/test/isqrt.c0 b/test/isqrt.c0 new file mode 100644 index 0000000..b628688 --- /dev/null +++ b/test/isqrt.c0 @@ -0,0 +1,10 @@ +int main () { + int n = 15122; + int i = 0; int k = 0; + while (k <= n) { + k += 2*i + 1; + i++; + } + return i-1; +} + diff --git a/test/isqrt.c0.bc0 b/test/isqrt.c0.bc0 new file mode 100644 index 0000000..2a42549 --- /dev/null +++ b/test/isqrt.c0.bc0 @@ -0,0 +1,51 @@ +C0 C0 FF EE # magic number +00 09 # version 4, arch = 1 (64 bits) + +00 01 # int pool count +# int pool +00 00 3B 12 + +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 34 # code length = 52 bytes +13 00 00 # ildc 0 # c[0] = 15122 +36 00 # vstore 0 # n = 15122; +10 00 # bipush 0 # 0 +36 01 # vstore 1 # i = 0; +10 00 # bipush 0 # 0 +36 02 # vstore 2 # k = 0; +# <00:loop> +15 02 # vload 2 # k +15 00 # vload 0 # n +A4 00 06 # if_icmple +6 # if (k <= n) goto <01:body> +A7 00 1A # goto +26 # goto <02:exit> +# <01:body> +15 02 # vload 2 # k +10 02 # bipush 2 # 2 +15 01 # vload 1 # i +68 # imul # (2 * i) +10 01 # bipush 1 # 1 +60 # iadd # ((2 * i) + 1) +60 # iadd # +36 02 # vstore 2 # k += ((2 * i) + 1); +15 01 # vload 1 # i +10 01 # bipush 1 # 1 +60 # iadd # +36 01 # vstore 1 # i += 1; +A7 FF E2 # goto -30 # goto <00:loop> +# <02:exit> +15 01 # vload 1 # i +10 01 # bipush 1 # 1 +64 # isub # (i - 1) +B0 # return # + +00 00 # native count +# native pool + diff --git a/test/isqrt.c0.bc0out b/test/isqrt.c0.bc0out new file mode 100644 index 0000000..e69de29 diff --git a/test/isqrt.c0.c0out b/test/isqrt.c0.c0out new file mode 100644 index 0000000..9f54fe3 --- /dev/null +++ b/test/isqrt.c0.c0out @@ -0,0 +1 @@ +122 diff --git a/test/isqrt.c0.ex b/test/isqrt.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..40a9a81e7072f1cf7d2ac705c92dff552f4b7e41 GIT binary patch literal 13360 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 MsGa8`rO)I3AA@s%vH$=8 literal 0 HcmV?d00001 diff --git a/test/mid.c0 b/test/mid.c0 new file mode 100644 index 0000000..c3efe9a --- /dev/null +++ b/test/mid.c0 @@ -0,0 +1,10 @@ +int main() +{ + int low = 0x15; + int high = 0x122; + int mid; + + mid = low + (high - low)/2; + return mid; +} + diff --git a/test/mid.c0.bc0 b/test/mid.c0.bc0 new file mode 100644 index 0000000..0d2323d --- /dev/null +++ b/test/mid.c0.bc0 @@ -0,0 +1,35 @@ +C0 C0 FF EE # magic number +00 09 # version 4, arch = 1 (64 bits) + +00 01 # int pool count +# int pool +00 00 01 22 + +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 19 # code length = 25 bytes +10 15 # bipush 21 # 21 +36 00 # vstore 0 # low = 21; +13 00 00 # ildc 0 # c[0] = 290 +36 01 # vstore 1 # high = 290; +15 00 # vload 0 # low +15 01 # vload 1 # high +15 00 # vload 0 # low +64 # isub # (high - low) +10 02 # bipush 2 # 2 +6C # idiv # ((high - low) / 2) +60 # iadd # (low + ((high - low) / 2)) +36 02 # vstore 2 # mid = (low + ((high - low) / 2)); +15 02 # vload 2 # mid +B0 # return # + +00 00 # native count +# native pool + diff --git a/test/mid.c0.bc0out b/test/mid.c0.bc0out new file mode 100644 index 0000000..bb79365 --- /dev/null +++ b/test/mid.c0.bc0out @@ -0,0 +1 @@ +155 diff --git a/test/mid.c0.c0out b/test/mid.c0.c0out new file mode 100644 index 0000000..bb79365 --- /dev/null +++ b/test/mid.c0.c0out @@ -0,0 +1 @@ +155 diff --git a/test/mid.c0.ex b/test/mid.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..07c414a312fe282b10a1c461f0421045426ca6b8 GIT binary patch literal 13350 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 +00 00 # number of arguments = 0 +00 02 # number of local variables = 2 +00 3B # code length = 59 bytes +10 00 # bipush 0 # 0 +36 01 # vstore 1 # sum = 0; +10 0F # bipush 15 # 15 +36 00 # vstore 0 # i = 15; +# <00:loop> +15 00 # vload 0 # i +10 7A # bipush 122 # 122 +A4 00 06 # if_icmple +6 # if (i <= 122) goto <01:body> +A7 00 14 # goto +20 # goto <02:exit> +# <01:body> +15 01 # vload 1 # sum +15 00 # vload 0 # i +60 # iadd # +36 01 # vstore 1 # sum += i; +15 00 # vload 0 # i +10 01 # bipush 1 # 1 +60 # iadd # +36 00 # vstore 0 # i += 1; +A7 FF E8 # goto -24 # goto <00:loop> +# <02:exit> +15 01 # vload 1 # sum +10 00 # bipush 0 # 0 +9F 00 06 # if_cmpeq +6 # if (sum == 0) goto <03:cond_true> +A7 00 08 # goto +8 # goto <04:cond_false> +# <03:cond_true> +10 01 # bipush 1 # true +A7 00 05 # goto +5 # goto <05:cond_end> +# <04:cond_false> +10 00 # bipush 0 # false +# <05:cond_end> +14 00 00 # aldc 0 # s[0] = "sample2.5.c0:5.2-5.19: assert failed" +CF # assert # assert(sum == 0) [failure message on stack] +15 01 # vload 1 # sum +B0 # return # + +00 00 # native count +# native pool + diff --git a/test/sample2.5.c0.bc0out b/test/sample2.5.c0.bc0out new file mode 100644 index 0000000..e69de29 diff --git a/test/sample2.5.c0.c0out b/test/sample2.5.c0.c0out new file mode 100644 index 0000000..e69de29 diff --git a/test/sample2.5.c0.ex b/test/sample2.5.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..f3055ed7519dae3173d756f26fde35ef3eb3090e GIT binary patch literal 13606 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 D5zM_e literal 0 HcmV?d00001 diff --git a/test/testif.c0 b/test/testif.c0 new file mode 100644 index 0000000..173b796 --- /dev/null +++ b/test/testif.c0 @@ -0,0 +1,8 @@ +int main() { + int x = 4; + if (x < 3) + x = 23; + else + x = 32; + return x; +} diff --git a/test/testif.c0.bc0 b/test/testif.c0.bc0 new file mode 100644 index 0000000..578e4be --- /dev/null +++ b/test/testif.c0.bc0 @@ -0,0 +1,36 @@ +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 1C # code length = 28 bytes +10 04 # bipush 4 # 4 +36 00 # vstore 0 # x = 4; +15 00 # vload 0 # x +10 03 # bipush 3 # 3 +A1 00 06 # if_icmplt +6 # if (x < 3) goto <00:then> +A7 00 0A # goto +10 # goto <01:else> +# <00:then> +10 17 # bipush 23 # 23 +36 00 # vstore 0 # x = 23; +A7 00 07 # goto +7 # goto <02:endif> +# <01:else> +10 20 # bipush 32 # 32 +36 00 # vstore 0 # x = 32; +# <02:endif> +15 00 # vload 0 # x +B0 # return # + +00 00 # native count +# native pool + diff --git a/test/testif.c0.bc0out b/test/testif.c0.bc0out new file mode 100644 index 0000000..f5c8955 --- /dev/null +++ b/test/testif.c0.bc0out @@ -0,0 +1 @@ +32 diff --git a/test/testif.c0.c0out b/test/testif.c0.c0out new file mode 100644 index 0000000..f5c8955 --- /dev/null +++ b/test/testif.c0.c0out @@ -0,0 +1 @@ +32 diff --git a/test/testif.c0.ex b/test/testif.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..10fa75d0b68a6009e2565ab8d95390b381ee8320 GIT binary patch literal 13313 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 G`@aB&1!If= literal 0 HcmV?d00001 diff --git a/test/tests.js b/test/tests.js index 334bf81..6229ddb 100644 --- a/test/tests.js +++ b/test/tests.js @@ -3,12 +3,17 @@ c0vm = require("../src/c0vm.js") var callbacks = {} -// Tests that IADD, BIPUSH, and RETURN (from main) work -exports.testIADD = function(test) { - var result = c0vm.execute(parser.parse("iadd.c0.bc0"), callbacks, false); - test.ok(result == -2, "iadd.c0.bc0 - Error in IADD, BIPUSH, or RETURN"); - test.done(); -}; +function doTest(filename, expected_result) { + return function(test) { + var result = c0vm.execute(parser.parse(filename), callbacks, false); + test.ok(result == expected_result, + filename + " - did not get expected result " + expected_result + + ", instead got " + result); + test.done(); + } +} + +exports.testIADD = doTest("iadd.c0.bc0", -2); exports.testPrint = function(test) { var result = c0vm.execute(parser.parse("test.bc0"), callbacks, false); @@ -16,8 +21,19 @@ exports.testPrint = function(test) { test.done(); } -exports.testISHR = function(test) { - var result = c0vm.execute(parser.parse("ishr.c0.bc0"), callbacks, false); - test.ok(result == -1, "ishr.c0.bc0 - -1 >> 1 gave " + result + ", not -1"); +exports.testISHR = doTest("ishr.c0.bc0", -1); + +exports.testISQRT = doTest("isqrt.c0.bc0", 122); + +exports.testMID = doTest("mid.c0.bc0", 155); + +// This one should throw an exception because an assertion fails +exports.testSample25 = function(test) { + test.throws(c0vm.execute(parser.parse("sample2.5.c0.bc0"), callbacks, false)); test.done(); } + +exports.testIF = doTest("testif.c0.bc0", 32); + +exports.testDSQUARED = doTest("dsquared.c0.bc0", 17068); + From e9285d5e9d1751ac7bb669bf341a15f7d7d1802a Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sat, 28 Mar 2015 19:39:01 -0400 Subject: [PATCH 04/14] cleanup --- src/c0vm.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/c0vm.js b/src/c0vm.js index 13338a9..bf104dc 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -307,6 +307,3 @@ function execute(file, callbacks, v) { } exports.execute = execute; - -// opcode definitions - From decf25ed29f99f91018011fdfa2ff462bdb1e2b4 Mon Sep 17 00:00:00 2001 From: Aaron Gutierrez Date: Fri, 3 Apr 2015 01:42:04 -0400 Subject: [PATCH 05/14] started working to integrate vm and site --- public/site.css | 3 + public/vm/Makefile | 4 + {src => public/vm}/byte-stream.js | 0 {src => public/vm}/bytecode-parser.js | 6 +- {src => public/vm}/c0vm.js | 0 {src => public/vm}/cc0.cgi | 0 {src => public/vm}/index.js | 6 +- {src => public/vm}/opcodes.js | 0 public/vm/vm.js | 520 ++++++++++++++++++++++++++ views/.index.jade.swp | Bin 12288 -> 0 bytes views/index.jade | 35 +- 11 files changed, 558 insertions(+), 16 deletions(-) create mode 100644 public/vm/Makefile rename {src => public/vm}/byte-stream.js (100%) rename {src => public/vm}/bytecode-parser.js (96%) rename {src => public/vm}/c0vm.js (100%) rename {src => public/vm}/cc0.cgi (100%) rename {src => public/vm}/index.js (77%) rename {src => public/vm}/opcodes.js (100%) create mode 100644 public/vm/vm.js delete mode 100644 views/.index.jade.swp diff --git a/public/site.css b/public/site.css index 72d0847..eff7c84 100644 --- a/public/site.css +++ b/public/site.css @@ -4,6 +4,8 @@ border-radius: 4px; padding: 4px; border-color: #ddd; + max-height: 300px; + overflow-y: auto; } .brad { @@ -29,4 +31,5 @@ nav { .btm-btn { margin-bottom: 4px; + margin-top: -14px; } diff --git a/public/vm/Makefile b/public/vm/Makefile new file mode 100644 index 0000000..ea1e733 --- /dev/null +++ b/public/vm/Makefile @@ -0,0 +1,4 @@ +FILES = c0vm.js bytecode-parser.js byte-stream.js opcodes.js index.js + +all: $(FILES) + browserify $(FILES) -o vm.js diff --git a/src/byte-stream.js b/public/vm/byte-stream.js similarity index 100% rename from src/byte-stream.js rename to public/vm/byte-stream.js diff --git a/src/bytecode-parser.js b/public/vm/bytecode-parser.js similarity index 96% rename from src/bytecode-parser.js rename to public/vm/bytecode-parser.js index 35c82de..dd8240b 100644 --- a/src/bytecode-parser.js +++ b/public/vm/bytecode-parser.js @@ -2,7 +2,9 @@ fs = require("fs"); byte_stream = require("./byte-stream"); // This is a simple, kinda hacky bytecode parser for .bc0 files -function getBytes(filename) { +// Now takes in raw bytecode +function getBytes(data) { + /* var data = fs.readFileSync(filename); if (data == null) { @@ -12,6 +14,7 @@ function getBytes(filename) { console.log("Error: " + err); return; } + */ // Data contains our file, but we want it as a string var string_data = data.toString(); @@ -29,6 +32,7 @@ function getBytes(filename) { }); // We now have an array of bytes. That's probably everything we need, right? + console.log(bytes); return bytes; } diff --git a/src/c0vm.js b/public/vm/c0vm.js similarity index 100% rename from src/c0vm.js rename to public/vm/c0vm.js diff --git a/src/cc0.cgi b/public/vm/cc0.cgi similarity index 100% rename from src/cc0.cgi rename to public/vm/cc0.cgi diff --git a/src/index.js b/public/vm/index.js similarity index 77% rename from src/index.js rename to public/vm/index.js index dd3b7a5..b242194 100644 --- a/src/index.js +++ b/public/vm/index.js @@ -9,5 +9,7 @@ c0vm = require("./c0vm.js"); // console.log(file); // console.log(file.function_pool[0].code); -var file = parser.parse("../test/iadd.c0.bc0"); -console.log("Result is " + c0vm.execute(file)); +$("#run").click(function() { + var file = parser.parse($("#bytecode").text); + $("#output").text(c0vm.execute(file)); +}); diff --git a/src/opcodes.js b/public/vm/opcodes.js similarity index 100% rename from src/opcodes.js rename to public/vm/opcodes.js diff --git a/public/vm/vm.js b/public/vm/vm.js new file mode 100644 index 0000000..fee13b5 --- /dev/null +++ b/public/vm/vm.js @@ -0,0 +1,520 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 31) c0_arith_error("Shifting by too many bits"); + this.stack.push(x< 31) c0_arith_error("Shifting by too many bits"); + this.stack.push(x>>y); + break; + + // Operations on local variables + + case op.VLOAD: + this.pc += 2; + var index = this.program[this.pc-1]; + this.stack.push(this.variables[index]); + break; + case op.VSTORE: + this.pc += 2; + var index = this.program[this.pc-1]; + this.variables[index] = this.stack.pop(); + break; + case op.ACONST_NULL: + this.pc++; + this.stack.push(0); + break; + case op.ILDC: + this.pc += 3; + var c1 = this.program[this.pc-2]; + var c2 = this.program[this.pc-1]; + var index = (c1 * 0x1000) + c2; + + this.stack.push(this.file.int_pool[index]); + break; + case op.ALDC: + console.log("Error: I don't know how to handle ALDC yet"); + throw "Error - can't handle ALDC"; + + // Control flow + case op.NOP: + this.pc++; + break; + case op.IF_CMPEQ: + var y = this.stack.pop(); + var x = this.stack.pop(); + this.doIf(y == x); + break; + case op.IF_CMPNE: + var y = this.stack.pop(); + var x = this.stack.pop(); + this.doIf(y != x); + break; + case op.IF_CMPLT: + var y = this.stack.pop(); + var x = this.stack.pop(); + this.doIf(y > x); + break; + case op.IF_CMPGE: + var y = this.stack.pop(); + var x = this.stack.pop(); + this.doIf(y <= x); + break; + case op.IF_CMPGT: + var y = this.stack.pop(); + var x = this.stack.pop(); + this.doIf(y < x); + break; + case op.IF_CMPLE: + var y = this.stack.pop(); + var x = this.stack.pop(); + this.doIf(y >= x); + break; + case op.GOTO: + this.doIf(true); + break; + case op.ATHROW: + this.pc++; + c0_user_error(this.stack.pop()); + break; + case op.ASSERT: + this.pc++; + var a = this.stack.pop(); + if (this.stack.pop() == 0) + c0_assertion_failure(a); + break; + + default: + console.log("Error: Unknown opcode\n"); + throw "Error - unknown opcode"; + } + return false; +} + +// Takes in a parsed .bc0 file and runs it +function execute(f) { + console.log("Beginning execution of file " + f); + + var state = new ProgramState(f); + + while (true) { + // I'm not sure how to structure this control flow yet, + // so if anyone has a better idea, let me know + try { + state.step(); + } catch (val) { + return val; + } + + // if (at_breakpoint) { + // save state (maybe in a global in this file?) + // return; + // } + } +} + +exports.execute = execute; + +// opcode definitions + + +},{"./opcodes":5}],4:[function(require,module,exports){ +parser = require("./bytecode-parser"); +c0vm = require("./c0vm.js"); + +// console.log("Reading in sample bytecode file:"); +// console.log(parser.getBytes("../test/test.bc0")); +// console.log("That was the sample bytecode file" + +// " -- it probably took up your whole terminal screen."); +// var file = parser.parse("../test/test.bc0"); +// console.log(file); +// console.log(file.function_pool[0].code); + +$("#run").click(function() { + var file = parser.parse($("#bytecode").text); + $("#output").text(c0vm.execute(file)); +}); + +},{"./bytecode-parser":2,"./c0vm.js":3}],5:[function(require,module,exports){ +/* arithmetic operations */ +exports.IADD = 0x60; +exports.IAND = 0x7E; +exports.IDIV = 0x6C; +exports.IMUL = 0x68; +exports.IOR = 0x80; +exports.IREM = 0x70; +exports.ISHL = 0x78; +exports.ISHR = 0x7A; +exports.ISUB = 0x64; +exports.IXOR = 0x82; + +/* stack operations */ +exports.DUP = 0x59; +exports.POP = 0x57; +exports.SWAP = 0x5F; + +/* memory allocation */ +exports.NEWARRAY = 0xBC; +exports.ARRAYLENGTH = 0xBE; +exports.NEW = 0xBB; + +/* memory access */ +exports.AADDF = 0x62; +exports.AADDS = 0x63; +exports.IMLOAD = 0x2E; +exports.AMLOAD = 0x2F; +exports.IMSTORE = 0x4E; +exports.AMSTORE = 0x4F; +exports.CMLOAD = 0x34; +exports.CMSTORE = 0x55; + +/* local variables */ +exports.VLOAD = 0x15; +exports.VSTORE = 0x36; + +/* constants */ +exports.ACONST_NULL = 0x01; +exports.BIPUSH = 0x10; +exports.ILDC = 0x13; +exports.ALDC = 0x14; + +/* control flow */ +exports.NOP = 0x00; +exports.IF_CMPEQ = 0x9F; +exports.IF_CMPNE = 0xA0; +exports.IF_ICMPLT = 0xA1; +exports.IF_ICMPGE = 0xA2; +exports.IF_ICMPGT = 0xA3; +exports.IF_ICMPLE = 0xA4; +exports.GOTO = 0xA7; +exports.ATHROW = 0xBF; +exports.ASSERT = 0xCF; + +/* function calls and returns */ +exports.INVOKESTATIC = 0xB8; +exports.INVOKENATIVE = 0xB7; +exports.RETURN = 0xB0 + + +exports.lookup_table = { + 0x60: "IADD", + 0x7E: "IAND", + 0x6C: "IDIV", + 0x68: "IMUL", + 0x80: "IOR", + 0x70: "IREM", + 0x78: "ISHL", + 0x7A: "ISHR", + 0x64: "ISUB", + 0x82: "IXOR", + 0x59: "DUP", + 0x57: "POP", + 0x5F: "SWAP", + 0xBC: "NEWARRAY", + 0xBE: "ARRAYLENGTH", + 0xBB: "NEW", + 0x62: "AADDF", + 0x63: "AADDS", + 0x2E: "IMLOAD", + 0x2F: "AMLOAD", + 0x4E: "IMSTORE", + 0x4F: "AMSTORE", + 0x34: "CMLOAD", + 0x55: "CMSTORE", + 0x15: "VLOAD", + 0x36: "VSTORE", + 0x01: "ACONST", + 0x10: "BIPUSH", + 0x13: "ILDC", + 0x14: "ALDC", + 0x00: "NOP", + 0x9F: "IF", + 0xA0: "IF", + 0xA1: "IF", + 0xA2: "IF", + 0xA3: "IF", + 0xA4: "IF", + 0xA7: "GOTO", + 0xBF: "ATHROW", + 0xCF: "ASSERT", + 0xB8: "INVOKESTATIC", + 0xB7: "INVOKENATIVE", + 0xB0: "RETURN" +}; + +},{}],6:[function(require,module,exports){ + +},{}]},{},[3,2,1,5,4]); diff --git a/views/.index.jade.swp b/views/.index.jade.swp deleted file mode 100644 index 8f5d6252ed9757287857ab77ec654c3233811bc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2y^kC<7>6As3O)jeG|)M|h|CJsdr6cJU9>`Q1-c>vk=v^f$m8+e&Ys5}c|7}} zC?F8DNK^R zyFst=O9a<*gxH_X4DS5%1o`X=A)+{}eXd++de|j|v*uwP+P3$X0ejQwv?sH)H_6qs z>g6U=Gd>oX`X51JmuMgwcyt4`A9k;u9$dP3VLJ@oVrS`@=Le4-Cys~)qJd~28i)p> zfoLEahz6p86KlYir^pA${;_rim)qy5jc5BBAJITG5Di2F(Lgj14MYRcKr|2yL<7-4 zG;jh9h>Q^RBq4*RkUakXzx@6G*RzED3GRWr;12i>d<(t-UxUxVC*Wf+2O7K!Zh}|A zi{Nqa<1>Uvkb-^i2Dl9VK26B);2yXOz64)@DYy!*fEU1TPZRPh_yzm`J^~*C2M)k> z@CWk$8GH}E0-u5*cn2JSW_>4ce`3nfKr|2yL<7-4G!P9$11G@%#dVv6JD#2Eq$#X! zRB8-|bg6Dk#l_7dup1d@8#N*Ax~FxBjDce_kp~(oD)WBi2r% zZRCBq(+gkaa%qisdCG;!oWg5SbCuP-^{2a1ZgY8<>&=_{ zt6}H37>ikQi?kU}glm>X`&5~*zQNmjyS6B;QN}0d61J6_vi7@ZVI4jZI_b1thqaMD zw+6$DGS@2U&^GFF2g2xd?o|kj!CuXLk~MGlO%fFHaCT!f7FLTbo7 zlyBtDS;vRY7Wq13ST$`X2W#dI|@J;< Date: Mon, 6 Apr 2015 01:21:21 -0400 Subject: [PATCH 06/14] Started working on array/struct impl --- src/c0vm.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/c0vm.js b/src/c0vm.js index bf104dc..c3f50f6 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -30,6 +30,15 @@ var ProgramState = function(parsed_file) { this.frame = new StackFrame(parsed_file, parsed_file.function_pool[0]); this.call_stack = []; this.file = parsed_file; + + // Memory is just a big array of bytes, right? + // "Allocation" is appending onto this array + // A pointer to memory is an index into this array. + + // Structs are stored as themselves + // Arrays are stored as an entry for the number of elements + // and then the array, byte-by-byte + this.heap = []; } ProgramState.prototype.push = function(val) { @@ -267,6 +276,73 @@ ProgramState.prototype.step = function() { this.frame = newFrame; break; + // Memory allocation operations: + + case op.NEW: + var size = this.frame.program[this.frame.pc+1]; + var address = this.heap.length; + + for (var i = 0; i < size; i++) this.heap.push(0); + + this.push(address); + this.frame.pc += 2; + break; + + case op.NEWARRAY: + var size = this.frame.program[this.frame.pc+1]; + var address = this.heap.length; + var num_elements = this.pop(); + if (num_elements < 0) c0_memory_error("Array size must be nonnegative"); + + this.heap.push(num_elements); + this.heap.push(size); + + for (var i = 0; i < num_elements; i++) { + for (var j = 0; j < size; j++) + this.heap.push(0); + } + + this.push(address); + this.frame.pc += 2; + break; + + case op.ARRAYLENGTH: + var pointer = this.pop(); + this.push(this.heap[pointer]); + break; + + // Memory access operations: + + case op.AADDF: + // 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.frame.pc += 2; + break; + + case op.AADDS: + // 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]); + this.frame.pc++; + break; + + case op.IMLOAD: + var addr = this.pop(); + // Get int32 from bytes + var val = this.heapdsfjsldkfjsd + this.push(this.heap[addr]); + this.frame.pc++; + break; + + case op.IMSTORE: + + default: var opcode_name; try { From 30e983e6568d8401c3135ba535611345e855e900 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Mon, 6 Apr 2015 01:21:41 -0400 Subject: [PATCH 07/14] Added tests for array/struct impl, but they in general require printing to screen --- test/arrays.c0 | 12 +++++++++ test/arrays.c0.bc0 | 52 +++++++++++++++++++++++++++++++++++++++ test/arrays.c0.bc0out | 1 + test/arrays.c0.c0out | 0 test/arrays.c0.ex | Bin 0 -> 14303 bytes test/structs.c0 | 18 ++++++++++++++ test/structs.c0.bc0 | 54 +++++++++++++++++++++++++++++++++++++++++ test/structs.c0.bc0out | 1 + test/structs.c0.c0out | 1 + test/structs.c0.ex | Bin 0 -> 14379 bytes test/tests.js | 11 +++++++++ 11 files changed, 150 insertions(+) create mode 100644 test/arrays.c0 create mode 100644 test/arrays.c0.bc0 create mode 100644 test/arrays.c0.bc0out create mode 100644 test/arrays.c0.c0out create mode 100755 test/arrays.c0.ex create mode 100644 test/structs.c0 create mode 100644 test/structs.c0.bc0 create mode 100644 test/structs.c0.bc0out create mode 100644 test/structs.c0.c0out create mode 100755 test/structs.c0.ex diff --git a/test/arrays.c0 b/test/arrays.c0 new file mode 100644 index 0000000..116e811 --- /dev/null +++ b/test/arrays.c0 @@ -0,0 +1,12 @@ +#use + +int main() { + int[] A = alloc_array(int, -2); + A[3] = 0; + A[3] = 1; + A[3] = 2; + A[3] = 3; + + printint(A[3]); + return 0; +} diff --git a/test/arrays.c0.bc0 b/test/arrays.c0.bc0 new file mode 100644 index 0000000..380b6e0 --- /dev/null +++ b/test/arrays.c0.bc0 @@ -0,0 +1,52 @@ +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 33 # code length = 51 bytes +10 FE # bipush -2 # -2 +BC 04 # newarray 4 # alloc_array(int, -(2)) +36 00 # vstore 0 # A = alloc_array(int, -(2)); +15 00 # vload 0 # A +10 03 # bipush 3 # 3 +63 # aadds # &A[3] +10 00 # bipush 0 # 0 +4E # imstore # A[3] = 0; +15 00 # vload 0 # A +10 03 # bipush 3 # 3 +63 # aadds # &A[3] +10 01 # bipush 1 # 1 +4E # imstore # A[3] = 1; +15 00 # vload 0 # A +10 03 # bipush 3 # 3 +63 # aadds # &A[3] +10 02 # bipush 2 # 2 +4E # imstore # A[3] = 2; +15 00 # vload 0 # A +10 03 # bipush 3 # 3 +63 # aadds # &A[3] +10 03 # bipush 3 # 3 +4E # imstore # A[3] = 3; +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) +10 00 # bipush 0 # 0 +B0 # return # + +00 01 # native count +# native pool +00 01 00 09 # printint + diff --git a/test/arrays.c0.bc0out b/test/arrays.c0.bc0out new file mode 100644 index 0000000..64bb6b7 --- /dev/null +++ b/test/arrays.c0.bc0out @@ -0,0 +1 @@ +30 diff --git a/test/arrays.c0.c0out b/test/arrays.c0.c0out new file mode 100644 index 0000000..e69de29 diff --git a/test/arrays.c0.ex b/test/arrays.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..dcc69968e860d64ee75bc072a264955e0a875ccd GIT binary patch literal 14303 zcmcIrd30P?dB1N)%d=%mBgt!G;)zil2hd2C7id)R8gZlaRx4AW*X$a8sup5jZsjas(+=f4{rT zycx~3^z`%|z4zVk_bvCk%e(K*y;qNRcJJ_5mN3a9?h@o~%n3?J-G#WeLb4j$AZ!s7 zE5ve91Ed;PP)bNu&d^Ei+E82Tc|og~_h`TqR2fZ|DNYz_A|z#bg%s3TMXxt1)=(k* z5}+Mp&1reAu~*`T9@BB0HSuUWvb6IxNp;X(nK9JV%TQB4){WOP?QfYU2#$P^M0+n# z*%rWiUQPEiAM#O)G+0FUN=^tvjotmQW1PQlGI6%WhWpm9ZHx7{#)jjWvDUE->s!~a z4Wtr*4jDhgVB6iZYoBy&+Cw*oU~}G#i)AmtwGdY`E|caXGY8jFTsPrbgo{4s;-Zgv zxax8JJ}KWdP-eXu7Zb-)t<0$#$44Em2924zGS&sS7Hhm5`6xg?GbEI^}_!`DOKUog+-c2~ep0QZ$? zhra?|&VQ@|K2rg2MVvnIi6%a>8*2M-p)-l@2G`M|gTtwG zG`TGnPNkwL;S3DNhlSI%cc;@IO={uZo!erGcyw>LFBVm@vXar{a6FAa!7|&EX%-o2 zcaj;PBT)yA(+HtIoDQoHC}bf6%!HH4@DV2*izOljHkIjfdx*rM;do|L`sWm~UPQ;> zb09Gqjf>G}GMPvU8N`4Xh{O`9s2Gfp9JoJI{C2B@21Bs?4!PLxqW z(3eW-*qms*U$lh>Qf=XQe=>TwEt1G2Q_;57>)KX#bZ}bRR9UL4Ebi&<+Pcl@2y_J2 zp-U|NGU7bLyqa&&(MTR3MuQT=Tfn~y3FkDX%uU0X?mXiC%1m5o?v*&_N6u3wneoTD zigTt(H?%(IGxvNq?ZS)RfBJc#zI*<+UAP(JEW_u*IWL>E#D#NCGs*A5-ShM+7jEWR z+O)fH&bKCQaN+LvL(qkDZZ;|8!uifHsmFycHX!JJ7tVK$Nulwd*||07j9dqrGj|Ye z6dM1UeQ9RhD|7u~=Cy5|2gvPwy9Cc|227b)l{$K|AIWbXsSo@A0^M% z=2TGfA0l5zzFqPkAkWw7lwa}>k!M#<`M`t9wEE{=*_R#&WnT%6U%%0_x9jrc+4`Ue zUA{Oe$>qD|2Su(82ERISf^8R?sQ&C6zX&}xnfA{*nvUC~k-!R&XZ+b)HuUVmuS5qwm4a>K~ z-T0&x%2pqTbY{WVrT#?qqtxAaHTgH+W;>-a|pFX{3^Du{(z@ee|FViq$=; zvU||o8?ukQi1;Si9@QIb{cPXKP_}v{va)4z&%*ZjeoHau!EC&gxmj^fOOa~9+{dLT zeG8tumoV-^*^B2_qO1#SnCH&mBQWP-WS5ychsZD#a>~tn$c;ae6Pc9?cpn-x+j)JW z^Ew`)@4-O9P0*V<0e6Tocm4;!FHGacO5d%7vu|wA{`;1h1wRUnU&0*n zTJoo%iTAc(DvY)Gx+nTumUJWM@197vtm>Y4xTT$unmE<8#9x(qJ{tGEj1m>sdnanTrWTWQV+;Z84csrRd4Iw)D(X`1QPo(`}fBJCZ_LM)87#WR4N22kx zeVxC8AMt$Hd%ViC zzaGtyPiQ5X3{c7&oGzJ4X-2_$oZq}m=G*TsZNLu@Ci6RIzGCygUpWIX1wBFB3u`$? zs};`=B&KOkkVLK%kbX$}mu(Gx2|*ysXcaeH8>F5g~#%IL6VwA6jj9^PM#%wxL4al zxYv9cw^}YaSiZH$mb$l2{}QNu2X0p5AL8ygIb?s0T$AE@?RDguspdJk-`+xQk>Yyn zo#d7(E@U4dw@h(CJ4$Xj3-z9S_EE&cte8Ztt3(nxUGa}2Y+3P=7CQzN&;1D8^D<{e zuWkd&wqfA))b@~6)h?sVs+lXn>U*GHrJBjBo9Sgrjt|q@3(S6)S$O00Uv1aepHL3i zdLA!sRjWS@q;>}4tJMuw0FeDCb$wPJ1j611qkxa;bgEq@0(_?RW1F-$QPN{^mHcaB&OVC1Ja-YeCDrFy$+`#?o?%wh z{f2Qo%j(*7zhZu}53o|usI|8Zo9vQH&?%An0ap9E7cM}vB@YHY61 zH+aFX`+pvl?rr;=cKU#kkzEPp2pSWnmJ@VCqqpG!dgfZ zJZmVI@Al>#%&fOOsXgz`dwvLN3r5pP2tOx14>kUaRAtL~PWCoVvedUIZhzxHOHTRL zrQV`T70q9waODkM1|KRW>-3jVhO%6#qf+s%RF=JB;S($}&!i{7Nx>4iI4 zw+;%|%o6$}2Q`E#F1eu98nr;lMOXpH3*I7>A4OO_Jv$+M3xl5Kjgievxc?`jvf zN=HH*gj&;>uzKj(a|8ujbqU|K&<_`!;2w_^Lwj zvP6_;3a)Loy!CZ;2&h^XGG7%^-POFI4iz*G@hOy7tfOL`Rz&nvoM%~G&BW*5D!Q86 zfYh%<2G0tAKl%!lx_xO^b5XS#tBb1Dgj(9Fd05M4w`Gyt0@%3}7Y0OWyM1yi+H+BH zt1YfWvo+N+(j_X34lk(Oy_9`$lN*q2{Xta1BlfV>tvBoE<1RNXIS?u@^A5)&u}nW+ zd2;bO6^OJ4BJhAEYrOy*7*Zd!b3Eo1>}{~d?Y0lvC+!uk>sI@zrw(|q=4;)C5Gpk>J{h2fE?>@l4*H3!uo)(@e3o~<#{gnN!@1My$Z?m~x zf8O5gd26%1@XP^EEgA|N5`%tup>Ud; z58QhgI=r!U2)h!AOu8){O`)UU$dMZv?t$oZ-RJaW2INMDlZf>@iGhJs6b%AA6+RS| zg49qVnU?L88h$A1qy-5(R0TVDNYjWklRx4ezL}hXSa=Wx>oWSn*la-v$p@oJg(gu& zS;D|@EE*4wL2k~NB8tdLtLpo~(-+#NZ4yQr=3{IFmZ5I30|cFg*MP0Bf#jeP=n$%bA z9gaMh8Ff@$WH%tJkp$+Ue1(+kP?{TdrrXu_7*%BFYjbu^LREnKV34x$5rYV%j*P$o zXgaCrkjbIG(d4KIVAUuZ*s`^&H60!lfuV3}NCf(i#9^o?nl*rVCU6LYVmJ{mVjRel z(O8%UIyV|ii-6oE45Zoe0l60$NG9awTp&8+3?wm-oS}Z$8cqZv=>*1HpkI+cjz9>X z;gR783QWKaZUO0A`N19^j1nVU;eu+kFEfbU$8dZQ+n<^pjt?YEKHS%rj2ut4#c*<4)9dr?-OPnu1o(pZ_rDLi}!J(JwcfZYKP|}SFlq*bPN1DA;-5szWixV5FFQ6BoX|gXJQ$Q-PrT{hUsoxcyHwG z%{t9d8X%c<8O13dCQo_~F0P4~`kQr-xoi|9o=add^)`Bj@;49HSPXC0S%TW$Ph+Ig z_!Wv*Ju>ud?0aj2Qq-&M&AN^$zqI}%CH7{W=!CX6>q@j|JD1uY2F7+Z>sn@A?3z|I z?F+=KC+Wv-7)YRDfH2+A6y*bx)V~$cdrTbB<=l8JJ@ zP#XBQElQ?*17?w7{HFa+H3X&Tl(zp{$rWy<{S0yv8Ml4mJe1Pl_;9Dv@}GjxZGXlW zln`7%XSjmzcP68+xB_qR7a(xk zn|0Z%+Wwd^)YRA+`kfN{-UYolZ!W=gb4nYE{tcJG+^V0~<@dV5GP-Y+!DupnA@4%`qv<%s&MM1;!poKa z0uSRM{kTL}!U|sn`_JeX-xo^^N?5r^L9Dd>4%{M(7rmxq6q}FL_~Bzxq9QfFa;q}9 z-6)pWYgYO*bC1DDd*80OobGVCTZhZ^znPagO_nP^v{u=FvP4)Cj#8>{_cA(9aF*1I z*>YJ~+?(GwaT|H@hBNQ=V!T?I_jNH|Bg}ia7_ZImV-(}IFz?M`e2y^h!(zP5IX5VH z@rE?-uVVdq`SZrb`0R6!lzVYv)VxQE^&9f%Ws7m2F!O#f-k6`yi}5DR&%JI)=Dj%C zYUW?J(2HFGy+qjz6mLqZ+rtGo8UjKmNKPa)nf>zE4Ai z^}SItuD&91pSac-EI2{#vczZCm+wQC+oQjujL{S_<=Xkz6>xTlh11yPeQf+Jlof9j z*GuB$c~|ykDb91bR+;g?6?nOG)H{JUnZjI@OS(<$m-?VY&793W8sg@=)tHPKyky~= zJ2!r#s7kBz#T8*rK|Q!ftRZncT^f( z^P&0v-CjZe0pR7%bw3EaTsx$t|0TjKvzzh%a0PvCAu;~aEs5jw<5`UFu3lHK2=V6{ zA1c8=C2>Tgzjuw%-)aAodYojn;1cyQPntaf(+=O1`o_9Ie*(PR`SaJbf3qCAOPlcb za=G@Y#rvQ2HS5P_qT}`k{hunS*FvdZh{NRWsDQ5rUhcg5y%qEysDLMdm#goQ3i?k- zeBP`LqLUIY^M1#|cFc8rT||=UR62u`T3DHMw(Y%dx6|FVXD?5+JKKx6d$;99g%j;q z4|Z_UD2^o`bClf$;gEX58H^?R!ZAlKD>>oJm{8}U($W6F`ZewCf&yo_e~es*P%BgY znURqrCZ5h++hsUAc5m6)=@^dTn0%oWxrQZ6aj)RIRt)dyzHjT6Zs)!oJN9($b@p!A z+TF>jamtQP4p{SKmx#lXDEdRTIRls5=b|m5s7ksh0 z302eG#sAY#`M(md0-pcB2D8rVIIu4CVk+TqIiCL;p~jx+Uu=Oy9JZ)j)RcP^gAx5d z3B`4D|L1|Jr(6p+8yosRBk~LVYH3~eO0lQB0snUbmB+Ggv4Z+1h+<6r??f@C|0lxL Od* + +struct test { + int a; + string b; + int c; +}; + +int main() { + struct test* t = alloc(struct test); + t->a = 1; + t->b = "potato chip"; + t->c = 23; + print(t->b); + printint(t->a); + printint(t->c); + return 0; +} diff --git a/test/structs.c0.bc0 b/test/structs.c0.bc0 new file mode 100644 index 0000000..1a94959 --- /dev/null +++ b/test/structs.c0.bc0 @@ -0,0 +1,54 @@ +C0 C0 FF EE # magic number +00 09 # version 4, arch = 1 (64 bits) + +00 00 # int pool count +# int pool + +00 0C # string pool total size +# string pool +70 6F 74 61 74 6F 20 63 68 69 70 00 # "potato chip" + +00 01 # function count +# function_pool + +#
+00 00 # number of arguments = 0 +00 01 # number of local variables = 1 +00 38 # code length = 56 bytes +BB 18 # new 24 # alloc(struct test) +36 00 # vstore 0 # t = alloc(struct test); +15 00 # vload 0 # t +62 00 # aaddf 0 # &t->a +10 01 # bipush 1 # 1 +4E # imstore # t->a = 1; +15 00 # vload 0 # t +62 08 # aaddf 8 # &t->b +14 00 00 # aldc 0 # s[0] = "potato chip" +4F # amstore # t->b = "potato chip"; +15 00 # vload 0 # t +62 10 # aaddf 16 # &t->c +10 17 # bipush 23 # 23 +4E # imstore # t->c = 23; +15 00 # vload 0 # t +62 08 # aaddf 8 # &t->b +2F # amload # t->b +B7 00 00 # invokenative 0 # print(t->b) +57 # pop # (ignore result) +15 00 # vload 0 # t +62 00 # aaddf 0 # &t->a +2E # imload # t->a +B7 00 01 # invokenative 1 # printint(t->a) +57 # pop # (ignore result) +15 00 # vload 0 # t +62 10 # aaddf 16 # &t->c +2E # imload # t->c +B7 00 01 # invokenative 1 # printint(t->c) +57 # pop # (ignore result) +10 00 # bipush 0 # 0 +B0 # return # + +00 02 # native count +# native pool +00 01 00 06 # print +00 01 00 09 # printint + diff --git a/test/structs.c0.bc0out b/test/structs.c0.bc0out new file mode 100644 index 0000000..62b3dfa --- /dev/null +++ b/test/structs.c0.bc0out @@ -0,0 +1 @@ +potato chip1230 diff --git a/test/structs.c0.c0out b/test/structs.c0.c0out new file mode 100644 index 0000000..62b3dfa --- /dev/null +++ b/test/structs.c0.c0out @@ -0,0 +1 @@ +potato chip1230 diff --git a/test/structs.c0.ex b/test/structs.c0.ex new file mode 100755 index 0000000000000000000000000000000000000000..617b6997c1dae14b74aa848ae8e85f91e0870b8e GIT binary patch literal 14379 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 literal 0 HcmV?d00001 diff --git a/test/tests.js b/test/tests.js index 6229ddb..0e2116b 100644 --- a/test/tests.js +++ b/test/tests.js @@ -37,3 +37,14 @@ exports.testIF = doTest("testif.c0.bc0", 32); exports.testDSQUARED = doTest("dsquared.c0.bc0", 17068); +exports.testArrays = function(test) { + var result = c0vm.execute(parser.parse("arrays.c0.bc0"), callbacks, false); + test.ok(false, "test.bc0 - Did not print to screen correctly"); + test.done(); +} + +exports.testStructs = function(test) { + var result = c0vm.execute(parser.parse("structs.c0.bc0"), callbacks, false); + test.ok(false, "test.bc0 - Did not print to screen correctly"); + test.done(); +} From 3278bfe6c47f135c0a5b73d704c173b786f232e7 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Mon, 6 Apr 2015 02:22:37 -0400 Subject: [PATCH 08/14] Added native function support --- src/c0ffi.js | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/c0vm.js | 60 +++++++++++++++++++++------ src/index.js | 14 ++++++- test/tests.js | 37 +++++++++++++---- 4 files changed, 199 insertions(+), 22 deletions(-) create mode 100644 src/c0ffi.js diff --git a/src/c0ffi.js b/src/c0ffi.js new file mode 100644 index 0000000..c3ce859 --- /dev/null +++ b/src/c0ffi.js @@ -0,0 +1,110 @@ +exports.NATIVE_FADD = 0 +exports.NATIVE_FDIV = 1 +exports.NATIVE_FLESS = 2 +exports.NATIVE_FMUL = 3 +exports.NATIVE_FSUB = 4 +exports.NATIVE_FTOI = 5 +exports.NATIVE_ITOF = 6 +exports.NATIVE_PRINT_FPT = 7 +exports.NATIVE_PRINT_HEX = 8 +exports.NATIVE_PRINT_INT = 9 + +/* args */ +exports.NATIVE_ARGS_FLAG = 10 +exports.NATIVE_ARGS_INT = 11 +exports.NATIVE_ARGS_PARSE = 12 +exports.NATIVE_ARGS_STRING = 13 + +/* conio */ +exports.NATIVE_EOF = 14 +exports.NATIVE_FLUSH = 15 +exports.NATIVE_PRINT = 16 +exports.NATIVE_PRINTBOOL = 17 +exports.NATIVE_PRINTCHAR = 18 +exports.NATIVE_PRINTINT = 19 +exports.NATIVE_PRINTLN = 20 +exports.NATIVE_READLINE = 21 + +/* curses */ +exports.NATIVE_C_ADDCH = 22 +exports.NATIVE_C_CBREAK = 23 +exports.NATIVE_C_CURS_SET = 24 +exports.NATIVE_C_DELCH = 25 +exports.NATIVE_C_ENDWIN = 26 +exports.NATIVE_C_ERASE = 27 +exports.NATIVE_C_GETCH = 28 +exports.NATIVE_C_INITSCR = 29 +exports.NATIVE_C_KEYPAD = 30 +exports.NATIVE_C_MOVE = 31 +exports.NATIVE_C_NOECHO = 32 +exports.NATIVE_C_REFRESH = 33 +exports.NATIVE_C_SUBWIN = 34 +exports.NATIVE_C_WADDCH = 35 +exports.NATIVE_C_WADDSTR = 36 +exports.NATIVE_C_WCLEAR = 37 +exports.NATIVE_C_WERASE = 38 +exports.NATIVE_C_WMOVE = 39 +exports.NATIVE_C_WREFRESH = 40 +exports.NATIVE_C_WSTANDEND = 41 +exports.NATIVE_C_WSTANDOUT = 42 +exports.NATIVE_CC_GETBEGX = 43 +exports.NATIVE_CC_GETBEGY = 44 +exports.NATIVE_CC_GETMAXX = 45 +exports.NATIVE_CC_GETMAXY = 46 +exports.NATIVE_CC_GETX = 47 +exports.NATIVE_CC_GETY = 48 +exports.NATIVE_CC_HIGHLIGHT = 49 +exports.NATIVE_CC_KEY_IS_BACKSPACE = 50 +exports.NATIVE_CC_KEY_IS_DOWN = 51 +exports.NATIVE_CC_KEY_IS_ENTER = 52 +exports.NATIVE_CC_KEY_IS_LEFT = 53 +exports.NATIVE_CC_KEY_IS_RIGHT = 54 +exports.NATIVE_CC_KEY_IS_UP = 55 +exports.NATIVE_CC_WBOLDOFF = 56 +exports.NATIVE_CC_WBOLDON = 57 +exports.NATIVE_CC_WDIMOFF = 58 +exports.NATIVE_CC_WDIMON = 59 +exports.NATIVE_CC_WREVERSEOFF = 60 +exports.NATIVE_CC_WREVERSEON = 61 +exports.NATIVE_CC_WUNDEROFF = 62 +exports.NATIVE_CC_WUNDERON = 63 + +/* file */ +exports.NATIVE_FILE_CLOSE = 64 +exports.NATIVE_FILE_CLOSED = 65 +exports.NATIVE_FILE_EOF = 66 +exports.NATIVE_FILE_READ = 67 +exports.NATIVE_FILE_READLINE = 68 + +/* img */ +exports.NATIVE_IMAGE_CLONE = 69 +exports.NATIVE_IMAGE_CREATE = 70 +exports.NATIVE_IMAGE_DATA = 71 +exports.NATIVE_IMAGE_DESTROY = 72 +exports.NATIVE_IMAGE_HEIGHT = 73 +exports.NATIVE_IMAGE_LOAD = 74 +exports.NATIVE_IMAGE_SAVE = 75 +exports.NATIVE_IMAGE_SUBIMAGE = 76 +exports.NATIVE_IMAGE_WIDTH = 77 + +/* parse */ +exports.NATIVE_PARSE_BOOL = 78 +exports.NATIVE_PARSE_INT = 79 + +/* string */ +exports.NATIVE_CHAR_CHR = 80 +exports.NATIVE_CHAR_ORD = 81 +exports.NATIVE_STRING_CHARAT = 82 +exports.NATIVE_STRING_COMPARE = 83 +exports.NATIVE_STRING_EQUAL = 84 +exports.NATIVE_STRING_FROM_CHARARRAY = 85 +exports.NATIVE_STRING_FROMBOOL = 86 +exports.NATIVE_STRING_FROMCHAR = 87 +exports.NATIVE_STRING_FROMINT = 88 +exports.NATIVE_STRING_JOIN = 89 +exports.NATIVE_STRING_LENGTH = 90 +exports.NATIVE_STRING_SUB = 91 +exports.NATIVE_STRING_TERMINATED = 92 +exports.NATIVE_STRING_TO_CHARARRAY = 93 +exports.NATIVE_STRING_TOLOWER = 94 + diff --git a/src/c0vm.js b/src/c0vm.js index c3f50f6..9cb7e30 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -9,7 +9,11 @@ function log(message) { } function c0_assertion_failure(val) { - throw "c0 assertion failure: " + val; + throw ("c0 assertion failure: " + val); +} + +function c0_memory_error(val) { + throw ("c0 memory error: " + val); } var StackFrame = function(file, f) { @@ -23,7 +27,7 @@ var StackFrame = function(file, f) { this.file = file; } -var ProgramState = function(parsed_file) { +var ProgramState = function(parsed_file, callback_dict) { log("Creating program state with file " + parsed_file); var main_function = parsed_file.function_pool[0]; @@ -31,6 +35,19 @@ var ProgramState = function(parsed_file) { this.call_stack = []; this.file = parsed_file; + this.natives = {}; + + for (var i = 0; i < 95; i++) { + try { + this.natives[i] = callback_dict[i]; + } catch (key_not_found) { + dict[i] = function (arg) { + console.log("Native function " + name + " called, ran method stub."); + return 0; + }; + } + } + // Memory is just a big array of bytes, right? // "Allocation" is appending onto this array // A pointer to memory is an index into this array. @@ -108,7 +125,7 @@ ProgramState.prototype.step = function() { case op.RETURN: var retVal = this.pop(); if (this.call_stack.length == 0) - throw retVal; + return retVal; this.frame = this.call_stack.pop(); this.push(retVal); @@ -183,7 +200,6 @@ ProgramState.prototype.step = function() { this.frame.pc++; var y = this.pop(); var x = this.pop(); - console.log("y="+y+", x="+x); if (y < 0 || y > 31) c0_arith_error("Shifting by too many bits"); this.push(x>>y); break; @@ -276,6 +292,30 @@ ProgramState.prototype.step = function() { this.frame = newFrame; break; + case op.INVOKENATIVE: + var c1 = this.frame.program[this.frame.pc+1]; + var c2 = this.frame.program[this.frame.pc+2]; + this.frame.pc += 3; + + var index = (c1 << 8) + c2; + + var f = this.file.native_pool[index]; + var arg_array = []; + for (var i = f.num_args - 1; i >= 0; i--) + arg_array[i] = this.pop(); + + var native_function = this.natives[f.function_table_index]; + if (native_function === undefined) { + native_function = function (ignored) { + console.log("Could not find native function with index " + + f.function_table_index); + return 0; + }; + console.log("Unknown native function index " + f.function_table_index); + } + this.push(native_function(arg_array)); + break; + // Memory allocation operations: case op.NEW: @@ -354,7 +394,6 @@ ProgramState.prototype.step = function() { " (" + opcode_name + ")\n"); throw "Error - unknown opcode"; } - return false; } // Takes in a parsed .bc0 file and runs it @@ -362,18 +401,13 @@ function execute(file, callbacks, v) { verbose = typeof v !== 'undefined' ? v : true; log("Initializing with file " + file); - var state = new ProgramState(file); + var state = new ProgramState(file, callbacks); log("Beginning execution"); while (true) { - // I'm not sure how to structure this control flow yet, - // so if anyone has a better idea, let me know - try { - state.step(); - } catch (val) { - return val; - } + var val = state.step(); + if (val !== undefined) return val; // if (at_breakpoint) { // save state (maybe in a global in this file?) diff --git a/src/index.js b/src/index.js index dd3b7a5..94d2a1d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,6 @@ parser = require("./bytecode-parser"); c0vm = require("./c0vm.js"); +c0ffi = require("./c0ffi.js"); // console.log("Reading in sample bytecode file:"); // console.log(parser.getBytes("../test/test.bc0")); @@ -9,5 +10,14 @@ c0vm = require("./c0vm.js"); // console.log(file); // console.log(file.function_pool[0].code); -var file = parser.parse("../test/iadd.c0.bc0"); -console.log("Result is " + c0vm.execute(file)); +callbacks = {}; +callbacks[c0ffi.NATIVE_PRINT] = function(args) { + console.log("Print function says: " + args[0]); +} +callbacks["printint"] = function(args) { + console.log("Printint function says: " + args[0]); +} + +var file = parser.parse("../test/sample2.5.c0.bc0"); +console.log("Result is " + c0vm.execute(file, callbacks)); + diff --git a/test/tests.js b/test/tests.js index 0e2116b..ce060b1 100644 --- a/test/tests.js +++ b/test/tests.js @@ -1,7 +1,21 @@ -parser = require("../src/bytecode-parser.js") -c0vm = require("../src/c0vm.js") +parser = require("../src/bytecode-parser.js"); +c0vm = require("../src/c0vm.js"); +c0ffi = require("../src/c0ffi.js"); var callbacks = {} +var printout = ""; + +callbacks[c0ffi.NATIVE_PRINT] = function(args) { + printout += args[0]; +} + +callbacks[c0ffi.NATIVE_PRINTINT] = function(args) { + printout += args[0]; +} + +callbacks[c0ffi.NATIVE_PRINTLN] = function(args) { + printout += (args[0] + "\n"); +} function doTest(filename, expected_result) { return function(test) { @@ -16,8 +30,10 @@ function doTest(filename, expected_result) { exports.testIADD = doTest("iadd.c0.bc0", -2); exports.testPrint = function(test) { + printout = ""; var result = c0vm.execute(parser.parse("test.bc0"), callbacks, false); - test.ok(result == 0, "test.bc0 - Did not print to screen correctly"); + test.ok(printout == "Hello, world.\nYou don't look so good.\n", + "test.bc0 - Did not print to screen correctly: output was " + printout); test.done(); } @@ -29,7 +45,9 @@ exports.testMID = doTest("mid.c0.bc0", 155); // This one should throw an exception because an assertion fails exports.testSample25 = function(test) { - test.throws(c0vm.execute(parser.parse("sample2.5.c0.bc0"), callbacks, false)); + test.throws(function () { + c0vm.execute(parser.parse("sample2.5.c0.bc0"), callbacks, false) + }); test.done(); } @@ -38,13 +56,18 @@ exports.testIF = doTest("testif.c0.bc0", 32); exports.testDSQUARED = doTest("dsquared.c0.bc0", 17068); exports.testArrays = function(test) { - var result = c0vm.execute(parser.parse("arrays.c0.bc0"), callbacks, false); - test.ok(false, "test.bc0 - Did not print to screen correctly"); + test.throws(function () { + c0vm.execute(parser.parse("arrays.c0.bc0"), callbacks, true) + }); test.done(); } exports.testStructs = function(test) { + printout = ""; var result = c0vm.execute(parser.parse("structs.c0.bc0"), callbacks, false); - test.ok(false, "test.bc0 - Did not print to screen correctly"); + test.ok(printout == "expected result here", + "structs.c0.bc0 - Did not print to screen correctly, result was " + + printout); test.done(); } + From be1848a055c54b6bc3bd5ade93a272b8dd55fce4 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Mon, 6 Apr 2015 02:41:11 -0400 Subject: [PATCH 09/14] Arrays and structs kinda work... --- src/c0vm.js | 57 ++++++++++++++++++++++++++++++++++++++++++--- src/index.js | 6 +++-- test/structs.c0.bc0 | 4 ++-- test/tests.js | 2 +- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/c0vm.js b/src/c0vm.js index 9cb7e30..237cf44 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -16,6 +16,21 @@ function c0_memory_error(val) { throw ("c0 memory error: " + val); } +function i32_to_array(i32) { + return [(i32 & 0xFF), + ((i32 >> 8) & 0xFF), + ((i32 >> 16) & 0xFF), + ((i32 >> 24) & 0xFF)]; + +} + +function array_to_i32(array) { + return array[0] + + (array[1] << 8) + + (array[2] << 16) + + (array[3] << 24); +} + var StackFrame = function(file, f) { log("Creating stack frame"); this.stack = []; @@ -375,13 +390,49 @@ ProgramState.prototype.step = function() { case op.IMLOAD: var addr = this.pop(); // Get int32 from bytes - var val = this.heapdsfjsldkfjsd - this.push(this.heap[addr]); + var c1 = this.heap[addr]; + var c2 = this.heap[addr+1]; + var c3 = this.heap[addr+2]; + var c4 = this.heap[addr+3]; + var combined = array_to_i32([c1, c2, c3, c4]); + this.push(combined); this.frame.pc++; break; case op.IMSTORE: - + var value = this.pop(); + var addr = this.pop(); + var array = i32_to_array(value); + + for (var i = 0; i < 4; i++) + this.heap[addr + i] = array[i]; + this.frame.pc++; + + case op.AMLOAD: + var addr = this.pop(); + this.push(this.heap[addr]); + this.frame.pc++; + break; + + case op.AMSTORE: + var value = this.pop(); + var addr = this.pop(); + this.heap[addr] = value; + this.frame.pc++; + break; + + case op.CMLOAD: + var addr = this.pop(); + this.push(this.heap[addr]); + this.frame.pc++; + break; + + case op.CMSTORE: + var value = this.pop(); + var addr = this.pop(); + this.heap[addr] = value; + this.frame.pc++; + break; default: var opcode_name; diff --git a/src/index.js b/src/index.js index 94d2a1d..09a1678 100644 --- a/src/index.js +++ b/src/index.js @@ -14,10 +14,12 @@ callbacks = {}; callbacks[c0ffi.NATIVE_PRINT] = function(args) { console.log("Print function says: " + args[0]); } -callbacks["printint"] = function(args) { +callbacks[c0ffi.NATIVE_PRINTINT] = function(args) { console.log("Printint function says: " + args[0]); } -var file = parser.parse("../test/sample2.5.c0.bc0"); +console.log(callbacks); + +var file = parser.parse("../test/structs.c0.bc0"); console.log("Result is " + c0vm.execute(file, callbacks)); diff --git a/test/structs.c0.bc0 b/test/structs.c0.bc0 index 1a94959..6183a15 100644 --- a/test/structs.c0.bc0 +++ b/test/structs.c0.bc0 @@ -49,6 +49,6 @@ B0 # return # 00 02 # native count # native pool -00 01 00 06 # print -00 01 00 09 # printint +00 01 00 10 # print +00 01 00 13 # printint diff --git a/test/tests.js b/test/tests.js index ce060b1..c77ee49 100644 --- a/test/tests.js +++ b/test/tests.js @@ -65,7 +65,7 @@ exports.testArrays = function(test) { exports.testStructs = function(test) { printout = ""; var result = c0vm.execute(parser.parse("structs.c0.bc0"), callbacks, false); - test.ok(printout == "expected result here", + test.ok(printout == "potato chip123", "structs.c0.bc0 - Did not print to screen correctly, result was " + printout); test.done(); From 00bf6e824333b0eed13db9025d26c21061bb7c18 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Mon, 6 Apr 2015 02:56:54 -0400 Subject: [PATCH 10/14] Struct functions (at least) actually work --- src/c0vm.js | 15 ++++++++++++++- src/index.js | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/c0vm.js b/src/c0vm.js index 237cf44..bf8170e 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -78,6 +78,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(); } @@ -372,7 +374,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; @@ -407,6 +409,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(); @@ -460,6 +463,16 @@ function execute(file, callbacks, v) { 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/src/index.js b/src/index.js index 09a1678..901e9a8 100644 --- a/src/index.js +++ b/src/index.js @@ -13,9 +13,11 @@ c0ffi = require("./c0ffi.js"); callbacks = {}; callbacks[c0ffi.NATIVE_PRINT] = function(args) { console.log("Print function says: " + args[0]); + return 0; } callbacks[c0ffi.NATIVE_PRINTINT] = function(args) { console.log("Printint function says: " + args[0]); + return 0; } console.log(callbacks); From f2541c0266dc431dae9205ca05c8a3f139d1a8b3 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sun, 12 Apr 2015 00:33:57 -0400 Subject: [PATCH 11/14] Fixed error with the way the string pool worked --- test/abort.c0 | 6 + test/abort.c0.bc0 | 25 +++ test/abort.c0.bc0out | 0 test/abort.c0.c0out | 0 test/abort.c0.ex | Bin 0 -> 13353 bytes test/arith.c0 | 129 ++++++++++++ test/arith.c0.bc0 | 430 ++++++++++++++++++++++++++++++++++++++ test/arith.c0.bc0out | 6 + test/arith.c0.c0out | 6 + test/arith.c0.ex | Bin 0 -> 15127 bytes test/chararrays.c0 | 7 + test/easyMath.c0 | 3 + test/easyMath.c0.bc0 | 26 +++ test/easyMath.c0.bc0out | 1 + test/easyMath.c0.c0out | 1 + test/easyMath.c0.ex | Bin 0 -> 13275 bytes test/hellosir.c0 | 9 + test/hellosir.c0.bc0 | 40 ++++ test/hellosir.c0.bc0out | 2 + test/hellosir.c0.c0out | 2 + test/hellosir.c0.ex | Bin 0 -> 13934 bytes test/iadd.c0.bc0out | 1 + test/iadd.c0.c0out | 1 + test/iadd.c0.ex | Bin 0 -> 13263 bytes test/moreArrays.c0 | 10 + test/moreArrays.c0.bc0 | 48 +++++ test/moreArrays.c0.bc0out | 1 + test/moreArrays.c0.c0out | 1 + test/moreArrays.c0.ex | Bin 0 -> 14219 bytes test/piazza1.c0 | 22 ++ test/piazza1.c0.bc0 | 70 +++++++ test/piazza1.c0.bc0out | 1 + test/piazza1.c0.c0out | 1 + test/piazza1.c0.ex | Bin 0 -> 14792 bytes test/strings.c0 | 29 +++ test/strings.c0.bc0 | 118 +++++++++++ test/strings.c0.bc0out | 1 + test/strings.c0.c0out | 1 + test/strings.c0.ex | Bin 0 -> 16081 bytes test/swapTest.c0.bc0 | 25 +++ test/testError.c0 | 7 + test/testError.c0.bc0 | 40 ++++ test/testError.c0.bc0out | 1 + test/testError.c0.c0out | 1 + test/testError.c0.ex | Bin 0 -> 13354 bytes 45 files changed, 1072 insertions(+) create mode 100644 test/abort.c0 create mode 100644 test/abort.c0.bc0 create mode 100644 test/abort.c0.bc0out create mode 100644 test/abort.c0.c0out create mode 100755 test/abort.c0.ex create mode 100644 test/arith.c0 create mode 100644 test/arith.c0.bc0 create mode 100644 test/arith.c0.bc0out create mode 100644 test/arith.c0.c0out create mode 100755 test/arith.c0.ex create mode 100644 test/chararrays.c0 create mode 100644 test/easyMath.c0 create mode 100644 test/easyMath.c0.bc0 create mode 100644 test/easyMath.c0.bc0out create mode 100644 test/easyMath.c0.c0out create mode 100755 test/easyMath.c0.ex create mode 100644 test/hellosir.c0 create mode 100644 test/hellosir.c0.bc0 create mode 100644 test/hellosir.c0.bc0out create mode 100644 test/hellosir.c0.c0out create mode 100755 test/hellosir.c0.ex create mode 100644 test/iadd.c0.bc0out create mode 100644 test/iadd.c0.c0out create mode 100755 test/iadd.c0.ex create mode 100644 test/moreArrays.c0 create mode 100644 test/moreArrays.c0.bc0 create mode 100644 test/moreArrays.c0.bc0out create mode 100644 test/moreArrays.c0.c0out create mode 100755 test/moreArrays.c0.ex create mode 100644 test/piazza1.c0 create mode 100644 test/piazza1.c0.bc0 create mode 100644 test/piazza1.c0.bc0out create mode 100644 test/piazza1.c0.c0out create mode 100755 test/piazza1.c0.ex create mode 100644 test/strings.c0 create mode 100644 test/strings.c0.bc0 create mode 100644 test/strings.c0.bc0out create mode 100644 test/strings.c0.c0out create mode 100755 test/strings.c0.ex create mode 100644 test/swapTest.c0.bc0 create mode 100644 test/testError.c0 create mode 100644 test/testError.c0.bc0 create mode 100644 test/testError.c0.bc0out create mode 100644 test/testError.c0.c0out create mode 100755 test/testError.c0.ex 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 0000000000000000000000000000000000000000..7091bd63f25e7fc16afd5e2d0c69be3ec7ef5703 GIT binary patch literal 13353 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 Y?rKaO{jSFJk#5hxnA77b=r8^LAE23S#sB~S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9f1699769f5125b64c9251141ea857e33786ada6 GIT binary patch literal 15127 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 + +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 0000000000000000000000000000000000000000..9973be07c88ebdc1e1c713bbcec5805f49db0efe GIT binary patch literal 13275 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 P?KmH5lekFf^SJ*Piy~Gf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6dc82c9f72ae11113822b8faa1f89a967f2223c5 GIT binary patch literal 13934 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 YF(!6(7h`g_w&Q%Ljp1T5H;?;&0l2nRZvX%Q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dca9ddf96f569404b9598404c418d526f5e8028e GIT binary patch literal 14219 zcmcgzdvIJ=eLi>BD_vQ(w0hWk9%Qwv z*@x|fm>9$(8{r^RpeYT+Ftnr$Q2&t*u9Hb*3^-v@FeS8R$bcs#?TUorOj2+Opnl(Z z?A~4NGIToAGrISj-}if-$36G%IY$rl^zHCimN3a9ZWW|1*M%gc?m|3xtt2(JLD(WB zt`#dq4G(_S12Rq`UiR_V%BOBIt ztX~^UCxhKGeulxeyKUEgY1*_$vv$O0S&oao+i)$y)q=~Ug(%eFT8e8KuEn@$b3QKG zSb(bm*PoLLT?1j(n{hF5EY-@Ax^aBe<7(8HsVie`#kEA^m9kF(3_v2#+F!zc9h9lF zo5A`8+<-1~+*ZPW4!n|`V^#1ji7yo4#t=%y^fHQ-?6jg$D&gxPA1JC9N_(o{Q^5Td z+TruSE7^}%!Dp-B9f;E}UZ3qMYv;eKBEM0~A1IT*QbqnBtKc=T(}a;~{FEojV3bq6ZF}Y%Ft!B z%SmN{j>Q}p&LD)rNG75}Ad^mpScs%jk$as;Jf4ge$#izWZ6O+uMH1O@X`fTbdJ#JU zn?uR*SVD})QmJH0$RLKqP&A%Q$HZ_f6H6Qt=?wg&#L(f?Xa+TK7@%&3vB+pbI59>A z#y~o)V{>AOLD3l*N_R#QgQ?iz&S)~5O2;}^uj^dh-OXw3=IUHsWpP_y@78Tjcd$FS z4qamDml5X~meqWNjz;nTF%sk$+5-M#a5$$iWtWX&y7Pz+Dm5|H(l2q&kDRAWGUJbP z73WNoPHB10XYTp#v9~WFW=Vg;Fx^T{ECS7vj?s+=z!p%HO zoy#sv~n`FCizB5enyYM9jMBe7Y`K~c3Jn@>HUxUubccVG; zSD}r<6W_Ma&93{>{D7Ff{>!*Gt_-0>dW32-mu8W!{~T%d;>-m}e~L7_WM*2@50Pe< z&YY6;he`9bG;>nY_mO5-%}hx;MVehSb4=3jC(UZlj7xfeG`ni1U()X(%`TeRE$Ka^ z`P!TbN&0ru^`yHby_Gayr!xUb-%OfaIpYV7T&C5(>dpP|ec{|o;fa?o@7~vYetNti zB*N#<9+TPm`3plL-wA~`r>59;;Yr_UT|k6CI-T*%UXV>UY*4Youy-!Xz!R?1$J>M`<6F6@v0Txcro2R)VOjx z%uP&N;hb+LxU;R_k@Azi&6M4EG4)b@9cuht-zv}+>-gTg&uM?*iA^VK;4pJ_p-Qd$ zpLv%4a<9x@xO?X9&}>{OX0AhyhGAHUr0eN!)ZrNphx|2voShBldai^gapih0Bforx zoToW@!nyPLl}aKHPM-8Lf0&&;kC!jF1zC3USrT72(y{_BD z(JLam7@UiQ6EN}&pPl>@6hOsGtf3jQmthT7c3$esL1%I&tb(2dE}Q9mei@^^r6->* zSZymEMOQo)=0S zyz)DCAG-Z`&kM%N50w>;U^;52BRF|FuRX^KMh_!AX&%qi20T-EKHfMt#1w2?`4Q;T zLcINAUv9AdQuugBi#H(pj$glk8Ss2xF4KOwFL!@Cy7#Vj%s#Je=)38aExAAR=6(}C z`v-4t?%(pu8R18Nm07X+r<}+8a=+`#{bqaa*IQ;=Ukp#2!yNEx>X+fkyV^08#oPUT zlY{MTeJBO`CNu3f_D$a3-o@w`8yc<%yyKVsQc!tX8c?*jf+ z@b{GPcNX~f1Ah_x4Q_r~vZe1wfxihpU!n#7JBs|L0ROxSza6|6aeWW`DC=tC@0sv= z4_e9yVAg*g_%_;zQ@BagUqL-ScLeYJgzsZDPD5y-_LH86y~pQy4m6+{3JFt*Oa>^Y z4Nj9x<#|@Y1)SfkOy=9|R;|Dn36uGqvQUwQ-=BQynL?fr?!~p3V?IUm1BdB~C&Wzt z&S(CRwlCWnbQ?h=_qQ);zPgwmY3Y}_X|vs0-;5`II5F`h$uw0PlDWbAHEr6kOLEot zX3_Y^P)(8!X?e7(q)q!>*7SVMr|kbnGV4p_z8dO661rOFL7m^K^IbZBpUx9H|Detv z*7+B7{tcZ!t@H2e{AW5Z_kY{AZ8ryQ#A?t@fwjT4!FL9_yH{<>U?>rxW5_@c)4-_)og~#%INoF;5a5axVd^~Lfxclr8+-n}kt+okc z#PY92vE01%=r4fUH{oVA{RQrx6C?Jsq?#4gZ?7ZOLNU*Y1NIhDixsuo-brdH4SP=X z*#}82S5z1Quq38Y&3Ph)lCJ3|5GQL|-b5b<=IKSGo)TWwzD3q2S++k-&SFXU?FEa3K+Zo8Xe0ZAONCrMmu4MCvaet}}`Rvg)g zy@>`^$*9NeKa%q{Nn~uU0r}oxjiU-j>`NrNtQ{bZ*~_T2+S&)=!}e0@bXzH86ZVfN zw%+igkoXqIEY7V{?PRGO5&uQByqbW9=8vXc()`@*+)tASslU%zb)!^lJ&&=22gFjGpuC&dnxcFi=zH@#_<%ZYuCTV^7H^; zzo@a-0jsgul?&Lz413|nP$0@amFOb|Z2|fP5DjuPs7I;B=8}4&S3Obw@4~#*>_QK!3x4@BZ@C0D>#Fzb zX+nM%NXz#@taUt-0`sfV@<`K9r6^m@bE3cLG`(J>r~^$uk(9Eny_2`3`3YrEB0^So(Jk*Jo zI$5Zk_$yZXXX4KMF&BI!@xHU`kTA}9>Toe@L?ed zc`5r~nH!L8J%LJi1YdWS^;W||+~qDK2SW9A+0jHao*l%idn}oXZQ+V@IvDK=Mqvf( z%zD)}IHJB{>pbSY>ut0q?9PwaC+ur+U1LA?82%1=utsZL4~HJX4~+js7+5?Oo!NA% z6N}xEIMqs(KbPj8E5Z?cE8Po8{t zxBYedxhGGqe&dZNPj`k8QTI@w9 z4|;0RIM_fK4#*onhs=V%kVrO>9vx2L^NuVh+J()D%-FcI+Ewm$mDjk+YhC4a+(is* z!v`XoDbO*N$tGf(hGU6XYBUNml8TOOQu~jAj^RKD>b@zuabutZ+X9jCL&DjbOvVe5 zIU}(MHVx*C6ohxk+2Y#*Pu} zBqXz$&P*(g&VnIFZ9eqg;S6Mldo&FfvD*tCg_rOghC;mI8r2gCOsZ~%^>I@y#HO~$ih*iIQw!gv~$l8)t)L!pnOBN2p! zcvKXSW7UkTid==6O=Q!tLG(O?WtgmxYKVe0IbssABivaUj|^hSFoO=WH7dgxA+=6G z7+#OKJ8$l`PG|ACp<@*gH-j8@%=)!xds$+Rx?uN+T~TN?DX-c)61^uo?x?!RZa`RL zNlZV53Mt;93^&$Hx2tU|ipb8_>g=4PssQ(^z-8kj1`$l(I|c*DGbxpim=fw6OO1;l zR)=E2En9m#GLc~s9EqeyL~!ul1Qb<{W({I~2_C|r7)>Th2nW1WEFPhPE{(@CA}DwB zf*H1aQ0^H9Q%Sjr7L1KJLn#a-XJin%h7!SOCW$c@98}r+qhP{jWNb7Fhe?>hEhud( zJJ^eZQgVzdSrCm4WQVa!7)cCcn^KdbiJ_z^M+OE`u|tN!X@i(4qd7Ri|DO`iAYdBh z^r@03q;r+=2aY>Y)}5{c!Llyl|K;@`E7LdYK~q}atRGRI?Od*Z7#Q261{afA|GK0FO*<=Yu^kM}5$x8# zqWAf)X#LAZQ0Jx|eoY@O(>Ld@F4rl61G*ozcwxWU&=Y0)=DbL_QAyyFwj>$<2F#(r z_)YsCXbef#0j>WJk}BRz`x)c}3U2-4xg{mR@!?M8{vQL=t>5ntN%4N&K-p& z4<1GM3@~v8U*$5J(_ZEJry%Cm=MEv$X}yVU`bmPgmFs^Km|LGagiOzB{c`zo`YFhA z?3wt@`ky&>Hm&P#hJn#HaeW86ZvW=o!4y8*nT))minPJM2ZmeUtiL{@^&d2fIyZVI z|52HKptWC023nPZiBnNU|Azhv3bbYF&uwC+F0Fr~q>4A=*C0Pbf$?`4K<7q(QyH$C zQ|gfQAGi$W79G?6``us#+22&asPfNR{~M;`2qKmH@&G8uDE9##nnU_o8MBNO{wn$h z^^5ORnL-&U_acauw_n}W(!DrfI!2L&SdASH^D+@B8M#I&++YOD^ff8%nYqVc%u#nOZ$)SO7XepL&^8L&J~u*V}+zb^2!sja~WQFqP7yQALcTaS6o$wDAFtR z!|UR5+>t_5Pt0JG1_<}h*5hrNJv!rl7+EnH98oyCLUk2xP zN|UEqOqY$rZ)*F;^f<|Bh4YlhJZZKDOgsEQ${VZ2{1?D0ofH4Hwr`d}cWIU1SFux% z_dom5EE#h}n5h*w?U$b`Un=F5jQieE1-}`1rE}%Gs>lyi!4CniRNtdjOcp1yurldv+jqwvr>}SKKAt{zwwF-1Z!55hC(p4C?BGOE z0!u#T$hix`Ve+Ii98V5J;*MNaaw6FyLY;rg#0G=w*K~CWGMv%DBc!^8TA3Qmj*Z=G z;_2D7U52w`&z7A%j-eQiDHpxSH7x0+d*oG1 z0aH)89&R=@^nWoF7x>xTYB{~sQbB?L=YYy%>9y=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 0000000000000000000000000000000000000000..f4b1ffe68d5f206470cab43cecb66811ec99309d GIT binary patch literal 14792 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 G>-694suF(y literal 0 HcmV?d00001 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..b27a4fc --- /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 47 # char_ord +00 01 00 46 # char_chr +00 01 00 50 # string_length +00 01 00 53 # string_to_chararray +00 01 00 4B # string_from_chararray +00 01 00 06 # 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 0000000000000000000000000000000000000000..2ebe489df9e410a7ea207d393368df0c031ae541 GIT binary patch literal 16081 zcmcgz3viRio!?LL<3k2pws}K9B<7XYvP{4+Bn0sg$ixuyY9S5%EK9QGMwUE!fJu`= zQIe_2f!xhoq&2%lY!C@Auz_ z{7IHN>De@TV+tz09nd2`KWb8b)`Z(z>Q>f-1J&X7NV2QCtG=$f zZlyCGb*|w4+hLHZxMlkuZd%1dy2r{vb>Ja6YOC3JX5dk&6q%WL?!dDU&m24p@RZ=8 zkWRxxec_`d)ikQkHYmyPb9JhJvB?nilc{*7;2}RLQN7FXRN|S3XBHl+%UnEvDp^pF z1Ja>c%^6}I&{ZtV462vIOptksQ7-yDdFCYQ+epS^4R%2FZcK3U0Ln&-8^=VOZmPm`Nll< z!+Gpn$U}b^cFOS^Q^I)Q zk4D;~7y_7Kv~@%yMm*t*B@BZZTMrmJgKh2cL@>57?2E^Pab~o(N7|XuuzQ;k2*xCH z_qL7UXe7AX*Afm2UQSMDtUZ!oC@`Ktu8m6chkP-^ABr(SG7?c>zL+l-^Bq#O)>yQ| zMD@E2&Nh7EaMaJzXgt}XG{V71TOuTkM`Hmh((j5Tc!4e>mW(9YJAwu(l0cOMzJyOy znQT#|S}CKX{NbQ4lI-L*Xqc>H!7k{vMmvKM))|b&qA|uR*2-G_;b=U_+JcE-Zk3u%behLi@^-(ik9-!L zVB|40<46$k^LGDGzc{|?;i(QbzW5RRmMwH6M|g!{24^cT5&PvL7+v(-bfH%C?>l9vi!0IpFTKehj&EYI7$mgy)ku^?Tg>3hx( zQF*EB3XLKm>-|f+z0O*fGzwvKKtpQkO@%5YCimtj9B!^4vbZ9+evj za?;Hn&&~Thw-3)d|1c4oIPvWs&+Yp>Z>$oF&$s_mR-YxX_3& zvw$PN>hb)lXV1v;AEX9Tp5Y$+?YXTDqTrej$H$L(ep&XM=a)AM@O$m*Md@F&H}%A6 zZ;$7+7h?SoOZ%sYl^}Xko)O?9fG~R-Aw+Y~t2MG%aEHJh0(bDT=L3-0jfZ=-eE{0v zS&~Y9dbZupD&Y#`;6y*j{iNpwehEzuKM36?*k^#BNe94werkoAjl6>rp*jZM7|C`( zmN)d(i|Mv>Ayx=Ma@d>Ng9`5%hA{A-lKgkxm-^jLjIrcQa1f5mBcFg75vVW;z<9b~ zvWB9PH(?D{whcF?pwqJrR)P0`E?u#Z+xK}!;%TcaZFMHBrY+jj7NzD%aPhv99!j}9 zas{~X<`?fNy?%7p!~1!6p!yyW*Lo@O` zbdT@V1acP0>Wj&F0{b>+i4cx_g|iY1ygh~c$xiCR*(E6J1?n5;9TffrMAS5hZM_){NUhVO`no+=4Q2-id$a~!LsEsRD{4W7f8QjakO@9E4BUKp6!&Uaio6jglBv zX%|C|r~hej(7-;Pm@dcB8#?BJ9*nPJBL;6a%+g}T=k;I(?bsc{l6TQM zUR%aIw4hz%h(r?(pCfTFx-{{&h!H!@g;pp)BL+z2Ejcs%pJ3YJhH10MwH#BDFoAUd`&%BNSkN9F96XJJoTv75x^n9 zKET(}YX<-e@IDR$?gXSo?Kc1&fNuc00e=J74EP7YBY=C+F-`+guNwfQG+h9uJ+_l+ zU3P8W)MEVvc(it+=L|YvAIYpQwI8)?oK|G{J4guL{UE#G6W?x2^FK)Q9|6A{zAiWG z2RNJCejN1q;BPncEe&b?Q=o4JpZ-UmD1Td;|2)W#gI{mv$0zK+0s2?Krx>R7H&5_C z0QqnpeieB05r@x!@26O)`gyvo)_s~V0y4#K6ZoeQV_M{?MEZ|_-UoV$h&%qW@Mw`y z>h3Q7lI4rm;{}$zrRH@#hAN(vem1V?_M9?>E{0hh(rrvO8xTx7Zt-R zQeX8?TJTbuB>+33yLnF0nXLG_5T>NcN7s)M?vnC|Gsk6d?54zjTkIyW|F<-Z z5ieIdU~_ZwQ3;=x@E;|7PQptP{#3$WOZcvYMJ2+{ObM4rSSR6T2|poWtAqz6JSySS z5@!3lW#h&*j%C% zQ65PG|>3s;* zY9(&{CxQ1#qkIw|sZ+ZUnklsZCHZT*C9BbThbeTS$1xAf~#5GdJ} z5#KEe4NqmV%TS0Y*`6Zy24SuLu&tNSO;llP@AnVeo*~pD(C286xkx8u+8adQK}P>x z8eEP%CGC`r{%O{Bl1FGu966y27O>}l%3krl2;EBZYr7CHe6M4z?FK6{Sjj<=Jwf1~UdDGO`sAX=yw>3>D2#=ElR zEmE(gl8b+h>`-BuMi%u}lC^6sU@-k|SSg&LeTnjVH*sci#IC*O; z@}#bl&I&CCfo}Z=Bvz+A32;oGL&!Sqvk*I>H<6fEI}YTe{z*a_IMSzonvks=Ijsi? zd5|M#^e`cfS~Ya~_5UJdJNIosUqncgb_^x_kWIOt{CU>)A+XtnXQ`4UTS?#?Wm(BE zehZ(c>gpvwr~E(*$aZwhRltgLYRak9!sPa}qsS1I+LTjIDrzOD&j2aqy+I6fMfw>~ z%B*6vvwshWR$)iss;BZ58w_fvh+2Mv3y?{?!R7CQq*Vy4seCr7p;c0svGjT?TA4P3 zROp2$(rJNL`6Cj)V=nf6DDkx(pmypp(5H7MVqkuYTMm`K#6>A`mfq&_Z&Imu2yAcp z6^;qpveX5#R95*n#9R`VW$^VPFXLGl6q-wn+(f;Atj_rtlvnUg>Ogaw z@S~NHz!dArSF9H514S_H{fK zMx&^vyT98^-B*Vi+pb={sxJyPy3Sp1yVb4ldn)PDd-dAb3@&F@b`d~0CTt*lN)9*sl~M&t(w zZINWnN+(viHL8-_f<$Us+7oeMQ?Z%f@1g@V1OPtblr0c!MeXr6CJuE5iKuJ6GW`gioJ=lW`I-8$FjdT<~8-RiZLe4B!U!M{lV zn*Q?ZeaWl(Q;6EFtNL2YU6uNbzI~Qr1jq2Z4jAhh2O9|BWnQeVqqPhVC`x>rMI9=F>>0za!}k29nf1t81_)Q7A~iVt zJm5>vAtjwrh7PW-4&n4NnoQIrf^jq+kBnacoE%fQ;-U6d90W%rZH{Cl-rg3$e?aul zgkTDQGh7OqI2R_8%o^e7K@mR{Xcuu6Qfo%cF|0KQvDO^L+EwY+5k7Ipq(25fs})|z z*Us1wjfS~L{Pa2zl^!)bWV9q(`5CSe4F`;9Yim4+N`W5t9SCwpJQR&3cwOV|j|Ghc zBS8IDxX^Y$Lc|Mde2>haIo@au``QpoSw@Qw=ge>|_GmCBs4;XaUP5a-BIoM}GElJeDkK7tw#K6!33ee|MyD@;RwMu&0%$n`Xfpz< z7=%&xE_2_Ud{SOBF-%N^lFru+YM8o}h&|5{L|t$oPfd}Ij6Aicc>Da1COZKr6`LFf7n4b=%>8*_$y@ep$c4n?3SAj0azaOymOPSGBXWFQ83v0&Io3NqIjPB16` z2*R15$UFI`9nM&kf0y74hK$x2I+76zKv!YR=}$z_=bQlnKH~=yHhmrKeiRsm8T>f8 zZD9wWH$W-cK^w>r4YnlP@BxP}(uS`|B-$QnjjFt_r6m?TpfG%-7F2nJgHLS#ryu@L zJSH411xH;NaNA4rLXoi zo20%=3TDSo)xRT4U+t3~k@{+1mGmjj+3`CF8pTzHE4?r5cVFI zW}BO{nx(!wtHUXMyEO1bmcIIKw~w4f+N&HBDE{HiOx-}u<*R+{G5OI7?a7#vDqqo3 z$dJB@zh2?yEWLsQc3yz=uZo`{^de){zasV3_pbpZC}DQ_U(3>WRl2#P3;!TcqHQX3 z$}az(z$6j*n&A83W-i`8or6j7%GN&vF|$5>sX*zZ|XP>HVRk^i@B25j1o8>iexT@?#?<&y`L3ivCiTzB-ram--YRb5eQ= zz5=GX{LrjsE*_dCw3MF$oA6)ZuOmaYRQ=8;VKvh;n3OuC(^aX*t@o*vIL=@l5Co6RJix8hcS8h_19 zD^9J|xSC0y!PIz}NuQZMpUtFCzCS>GtLc03OnK}Wo`8AKqoZr1Q6e1BG)@8g=8c+ z?wCwwbS7DD8Yk5>wLOn~2=rX{bCRIv^8a(({%odBGSqu<@bh`6JlDEuC-+NIm z|E;8V%J)mr=`gC?Qo-nhU~_s_+NaN(DW&)?4){1-A|^0IcJN-Gl=f8|hV#h3n}=@0 zA|Tg&o0*_fJE~puK3VosNmtv)+a-M^r<)v<*^N>@``Eit(z8Dc*bh4S)0Y*umOSlZ@m&4nMbLA_?OGoBpXH&`p>r<#bT~@!&ps2R1M~`(V;zEn zhOp_{67$Cr@kA0|aAFJ9*tq+loknBBuHAH-$=H;EZQYn=(WM`8%?Vrg2EI6qU~ei1 z373VUMq4=A;tLym|I6?tyO{VsG7$_o>+W&67%`0YKo?;vnAk!KBs)3|DStfMH*t41 z?_9slV_e-d&Eo5=$=_A}6qia){ zma(U=Zdr-DSbPJL->k|MoOF3AldW74d$xRc7@MnnbDpl2{prhU*q_B&QN*AAvUn=r)_yO zJ9c6-?!bvFW|>jQxJU-|jKc{PBEI3zZR3KSyg^52E8<2PGO|2*q(NOr93W(tC2sPi s?TD*)bh3~sChopv(!`ayOq#q3r^=SM_a=IWx`W57L>KymyF7UR3m7dV#sB~S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..590ccef9bb51094565077dff7b224eb3c57d5123 GIT binary patch literal 13354 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 W6UV=cF?p=pGAil>xd{66+W#+#fNvrI literal 0 HcmV?d00001 From ee99956b527a35132c241da52db50e95433dc4aa Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sun, 12 Apr 2015 00:37:20 -0400 Subject: [PATCH 12/14] Arith.c0 test is successful --- test/tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests.js b/test/tests.js index f15edaa..324a672 100644 --- a/test/tests.js +++ b/test/tests.js @@ -93,7 +93,7 @@ exports.testAbort = function(test) { 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 736 0 588088 -31 -19 \n0\n", + 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(); From 65197535bc2e09f77017a8116ac476291dee9a63 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sun, 12 Apr 2015 00:56:07 -0400 Subject: [PATCH 13/14] This whole "strings" thing isn't quite working... --- src/c0vm.js | 19 ++++++++++++++----- test/strings.c0.bc0 | 12 ++++++------ test/tests.js | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 11 deletions(-) diff --git a/src/c0vm.js b/src/c0vm.js index 2c0696f..3bce00e 100755 --- a/src/c0vm.js +++ b/src/c0vm.js @@ -394,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(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; @@ -438,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; diff --git a/test/strings.c0.bc0 b/test/strings.c0.bc0 index b27a4fc..0b7b6c7 100644 --- a/test/strings.c0.bc0 +++ b/test/strings.c0.bc0 @@ -109,10 +109,10 @@ B0 # return # 00 06 # native count # native pool -00 01 00 47 # char_ord -00 01 00 46 # char_chr -00 01 00 50 # string_length -00 01 00 53 # string_to_chararray -00 01 00 4B # string_from_chararray -00 01 00 06 # print +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/tests.js b/test/tests.js index 324a672..9d6a198 100644 --- a/test/tests.js +++ b/test/tests.js @@ -20,6 +20,30 @@ callbacks[c0ffi.NATIVE_PRINTLN] = function(args) { 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) { return function(test) { var result = c0vm.execute(parser.parse(filename), callbacks, false); @@ -98,3 +122,14 @@ exports.testArith = function(test) { 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(); +} From bbd72c211156f5bb844c7a376e4d0938cba03cc6 Mon Sep 17 00:00:00 2001 From: Aaron Gutierrez Date: Mon, 13 Apr 2015 22:50:30 -0400 Subject: [PATCH 14/14] VM works in browser for simple examples. --- public/vm/bytecode-parser.js | 1 + public/vm/index.js | 3 ++- public/vm/vm.js | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/public/vm/bytecode-parser.js b/public/vm/bytecode-parser.js index dd8240b..bce7604 100644 --- a/public/vm/bytecode-parser.js +++ b/public/vm/bytecode-parser.js @@ -18,6 +18,7 @@ function getBytes(data) { // Data contains our file, but we want it as a string var string_data = data.toString(); + console.log(string_data); // Strip all the comments for easier parsing var without_comments = string_data.replace(new RegExp("#.*", "gi"), ""); diff --git a/public/vm/index.js b/public/vm/index.js index b242194..940c5d0 100644 --- a/public/vm/index.js +++ b/public/vm/index.js @@ -10,6 +10,7 @@ c0vm = require("./c0vm.js"); // console.log(file.function_pool[0].code); $("#run").click(function() { - var file = parser.parse($("#bytecode").text); + var input = $("#bytecode").html().replace(/(\r\n|\n|\r)/gm,""); + var file = parser.parse($("#bytecode").text()); $("#output").text(c0vm.execute(file)); }); diff --git a/public/vm/vm.js b/public/vm/vm.js index fee13b5..d8675d3 100644 --- a/public/vm/vm.js +++ b/public/vm/vm.js @@ -60,6 +60,7 @@ function getBytes(data) { // Data contains our file, but we want it as a string var string_data = data.toString(); + console.log(string_data); // Strip all the comments for easier parsing var without_comments = string_data.replace(new RegExp("#.*", "gi"), ""); @@ -404,7 +405,8 @@ c0vm = require("./c0vm.js"); // console.log(file.function_pool[0].code); $("#run").click(function() { - var file = parser.parse($("#bytecode").text); + var input = $("#bytecode").html().replace(/(\r\n|\n|\r)/gm,""); + var file = parser.parse($("#bytecode").text()); $("#output").text(c0vm.execute(file)); });