From a2fbf6d2302ca83b6c9a0b032aec085be7bbc825 Mon Sep 17 00:00:00 2001 From: Artur Ventura Date: Thu, 21 Jul 2011 09:05:18 +0100 Subject: [PATCH] Interactive development mode restored and more Intrp code --- src/class.js | 12 ++- src/class.jsh | 33 ++++-- src/intrp.def | 251 ++++++++++++++++++++++++++++++++++++++----- webserver/app.py | 4 +- webserver/index.html | 5 +- 5 files changed, 263 insertions(+), 42 deletions(-) diff --git a/src/class.js b/src/class.js index 9df593d..f78199e 100644 --- a/src/class.js +++ b/src/class.js @@ -223,7 +223,13 @@ ClassDefinition.prototype.initializeClass = function(){ } this.calculateEffectiveMembers(); - var that = this + for (var i=0; i this.inited = true; } @@ -263,7 +269,9 @@ ClassDefinition.prototype.makeInstance = function(){ if (!this.inited) { this.initializeClass(); } var newInstance = {}; for(var k in this.effectiveFields){ - newInstance[k] = (this.effectiveFields[k].primitive)?0:null; + if (!(this.effectiveFields[k].access_flags & ACC_STATIC)){ + newInstance[k] = (this.effectiveFields[k].primitive)?0:null; + } } newInstance["class"] = this; return newInstance; diff --git a/src/class.jsh b/src/class.jsh index 7caa773..7c06ea3 100644 --- a/src/class.jsh +++ b/src/class.jsh @@ -12,14 +12,25 @@ #define CLASS_MAGIC 0xCAFEBABE -#define ACC_PUBLIC 0x0001 // Declared public; may be accessed from outside its package. -#define ACC_PRIVATE 0x0002 // Declared private; usable only within the defining class. -#define ACC_PROTECTED 0x0004 // Declared protected; may be accessed within subclasses. -#define ACC_STATIC 0x0008 // Declared static. -#define ACC_FINAL 0x0010 // Declared final; no subclasses allowed. -#define ACC_SUPER 0x0020 // Treat superclass methods specially when invoked by the invokespecial instruction. -#define ACC_VOLATILE 0x0040 // Declared volatile; cannot be cached. -#define ACC_NATIVE 0x0100 // Declared native; implemented in a language other than Java. -#define ACC_INTERFACE 0x0200 // Is an interface, not a class. -#define ACC_ABSTRACT 0x0400 // Declared abstract; may not be instantiated. -#define ACC_TRANSIENT 0x0080 // Declared transient; not written or read by a persistent object manager. +#define ACC_PUBLIC 0x0001 +// Declared public; may be accessed from outside its package. +#define ACC_PRIVATE 0x0002 +// Declared private; usable only within the defining class. +#define ACC_PROTECTED 0x0004 +// Declared protected; may be accessed within subclasses. +#define ACC_STATIC 0x0008 +// Declared static. +#define ACC_FINAL 0x0010 +// Declared final; no subclasses allowed. +#define ACC_SUPER 0x0020 +// Treat superclass methods specially when invoked by the invokespecial instruction. +#define ACC_VOLATILE 0x0040 +// Declared volatile; cannot be cached. +#define ACC_NATIVE 0x0100 +// Declared native; implemented in a language other than Java. +#define ACC_INTERFACE 0x0200 +// Is an interface, not a class. +#define ACC_ABSTRACT 0x0400 +// Declared abstract; may not be instantiated. +#define ACC_TRANSIENT 0x0080 +// Declared transient; not written or read by a persistent object manager. diff --git a/src/intrp.def b/src/intrp.def index 67b631f..7eee983 100644 --- a/src/intrp.def +++ b/src/intrp.def @@ -173,12 +173,10 @@ ENDDEF DEFOP(DALOAD) var index = OPPOP(); var arrayref = OPPOP(); - if (arrayref == NULL){ - JVM_THROWS_NEW(java.lang.NullPointerException); - } - if (index >= arrayref.length){ - JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException); - } + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + OPPUSHD(arrayref.value[index]); ENDDEF @@ -186,12 +184,10 @@ DEFOP(DASTORE) var value = OPPOPD(); var index = OPPOP(); var arrayref = OPPOP(); - if (arrayref == NULL){ - JVM_THROWS_NEW(java.lang.NullPointerException); - } - if (index >= arrayref.length){ - JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException); - } + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + arrayref.value[index] = value; ENDDEF @@ -380,12 +376,10 @@ ENDDEF DEFOP(FALOAD) var index = OPPOP(); var arrayref = OPPOP(); - if (arrayref == NULL){ - JVM_THROWS_NEW(java.lang.NullPointerException); - } - if (index >= arrayref.length){ - JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException); - } + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + OPPUSHD(arrayref.value[index]); ENDDEF @@ -393,12 +387,10 @@ DEFOP(FASTORE) var value = OPPOPD(); var index = OPPOP(); var arrayref = OPPOP(); - if (arrayref == NULL){ - JVM_THROWS_NEW(java.lang.NullPointerException); - } - if (index >= arrayref.length){ - JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException); - } + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + arrayref.value[index] = value; ENDDEF @@ -530,5 +522,216 @@ DEFOP(GETFIELD) ENDDEF DEFOP(GETSTATIC) + var indexbyte1 = READ_NEXT(); + var indexbyte2 = READ_NEXT(); + CHECK_NULL(objectref) + var field = this_method_cass.constantPool[(indexbyte1 << 8) | indexbyte2]; + var aClass = field.class_ref.name_ref.str; + + //check if static + OPPUSH(jvm.classForName(aClass)[canonicalName(field.class_ref.name_ref.str) + " " + field.name_and_type_ref.name_ref.str]); ENDDEF + +DEFOP(GOTO) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; +ENDDEF + +DEFOP(GOTO_W) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var branchbyte3 = READ_NEXT(); + var branchbyte4 = READ_NEXT(); + + var branchoffset = (branchbyte1 << 24) | (branchbyte2 << 16) | (branchbyte3 << 8) | branchbyte4; + PC = PC + branchoffset; +ENDDEF + +DEFOP(I2B) + var value = OPPOP(); + + if (IS_OVERFLOW(value,BYTE_MAX_VALUE) || IS_UNDERFLOW(result,BYTE_MIN_VALUE)){ + OPPUSH(BYTE_OVERFLOW(value)); + }else{ + OPPUSH(value); + } +ENDDEF + +DEFOP(I2C) + var value = OPPOP() + + if (IS_OVERFLOW(value,CHAR_MAX_VALUE) || IS_UNDERFLOW(result,CHAR_MIN_VALUE)){ + OPPUSH(CHAR_OVERFLOW(value)); + }else{ + OPPUSH(value); + } +ENDDEF + +DEFOP(I2D) + OPPUSH(null); +ENDDEF + +DEFOP(I2F) + OPPUSH(null); +ENDDEF + +DEFOP(I2L) + //NOP because it is the same size. +ENDDEF + +DEFOP(IADD) + var value1 = OPPOP(); + var value2 = OPPOP(); + var result = value1 + value2; + if (IS_OVERFLOW(result,INT_MAX_VALUE) || IS_UNDERFLOW(result,INT_MIN_VALUE)){ + OPPUSH(INT_OVERFLOW(result)); + }else{ + OPPUSH(result); + } +ENDDEF + +DEFOP(IALOAD) + var index = OPPOP(); + var arrayref = OPPOP(); + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + + OPPUSH(arrayref.value[index]); +ENDDEF + +DEFOP(IAND) + var value1 = OPPOP() + var value2 = OPPOP() + var result = value1 & value2 + OPPUSH(result); +ENDDEF + +DEFOP(IASTORE) + var index = OPPOP(); + var arrayref = OPPOP(); + var value = OPPOP(); + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + + arrayref.value[index] = value; +ENDDEF + +DEFALIAS(ICONST_M1) +DEFALIAS(ICONST_0) +DEFALIAS(ICONST_1) +DEFALIAS(ICONST_2) +DEFALIAS(ICONST_3) +DEFALIAS(ICONST_4) +DEFALIAS(ICONST_5) +DEFNOP() + OPPUSH(OPCODE - ICONST_0) +ENDDEF + +DEFOP(IDIV) + var value1 = OPPOP(); + var value2 = OPPOP(); + if(value2 == 0){ + JVM_THROWS_NEW(java.lang.ArithmeticException); + } + + var result = Math.round(value1 / value2); + if (IS_OVERFLOW(result,INT_MAX_VALUE) || IS_UNDERFLOW(result,INT_MIN_VALUE)){ + OPPUSH(INT_OVERFLOW(result)); + }else{ + OPPUSH(result); + } +ENDDEF + +DEFOP(IF_ACMPEQ) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 == value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IF_ACMPNE) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 != value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IF_ICMPEQ) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 == value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IF_ICMPNE) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 != value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IF_ICMPLT) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 < value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IF_ICMPLE) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 <= value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IF_ICMPGT) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 < value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IF_ICMPLE) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value1 = OPPOP(); + var value2 = OPPOP(); + if (value1 <= value2){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF \ No newline at end of file diff --git a/webserver/app.py b/webserver/app.py index 01377e2..60a14a9 100644 --- a/webserver/app.py +++ b/webserver/app.py @@ -25,9 +25,9 @@ class index: if filename.endswith("favicon.ico"): web.webapi.notfound() return "" - if filename.endswith(".js"): + if filename == "jvm.js": web.header('Content-Type', 'text/javascript') - return commands.getstatusoutput("/usr/bin/cpp -P -DDEBUG -DDEBUG_INTRP -undef -Wundef -std=c99 -nostdinc -Wtrigraphs -fdollars-in-identifiers ../src/" + filename)[1] + return commands.getstatusoutput("cat ../src/*.js | cpp -DDEBUG -DDEBUG_INTRP -I../src/ -P -undef -CC -Wundef -std=c99 -nostdinc -Wtrigraphs -fdollars-in-identifiers")[1] if "testRuntime" in filename: alphex = filename[filename.rfind("/") + 1:]; return file("../runtime/" + alphex.replace(".","/") + ".class"); diff --git a/webserver/index.html b/webserver/index.html index b7c46a1..89e6f20 100644 --- a/webserver/index.html +++ b/webserver/index.html @@ -1,14 +1,13 @@ JS JVM - - + +