From af86f568732564b01e4b3896b3bcd9f07290980c Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Sat, 28 Mar 2015 18:35:26 -0400 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 4/8] 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 447b40710e82f27f4a72d955adcc1b4b3f278ec5 Mon Sep 17 00:00:00 2001 From: Mitchell Plamann Date: Mon, 6 Apr 2015 01:21:21 -0400 Subject: [PATCH 5/8] 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 6/8] 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 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 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 7/8] 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 8/8] 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();