diff --git a/Test.class b/Test.class deleted file mode 100644 index c8b4bfa..0000000 Binary files a/Test.class and /dev/null differ diff --git a/intrp.js b/intrp.js deleted file mode 100644 index 8fdbce1..0000000 --- a/intrp.js +++ /dev/null @@ -1,253 +0,0 @@ -/* -*- Mode: Javascript -*- - * -*- coding: UTF-8 -*- - * Copyright (C) 2011 by Artur Ventura - * - * File: intrp.js - * Time-stamp: Fri Jul 15 02:46:27 2011 - * - * Author: Artur Ventura - * - */ - -#include "opcodes.js" - -DEFOP(AALOAD) - 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); - } - OPPUSH(arrayref.value[index.value]); -ENDDEF - -DEFOP(AASTORE) - var value = OPPOP(); - 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); - } - if (!arrayref.classRef.isAssignable(value.cl)){ - JVM_THROWS_NEW(java.lang.ArrayStoreException); - } -ENDDEF - -DEFOP(ACONST_NULL) - OPPUSH(null); -ENDDEF - -DEFOP(ALOAD) - var i = OPPOP(); - OPPUSH(LOCAL_VAR(i)) -ENDDEF - -DEFALIAS(ALOAD_0) -DEFALIAS(ALOAD_1) -DEFALIAS(ALOAD_2) -DEFALIAS(ALOAD_3) -DEFNOP() - OPPUSH(LOCAL_VAR(OPCODE - ALOAD_0)); -ENDDEF - -DEFOP(ANEWARRAY) - var indexbyte1 = READ_NEXT(); - var indexbyte2 = READ_NEXT(); - var count = OPPOP(); - if (count < 0){ - JVM_THROWS_NEW(java.lang.NegativeArraySizeException); - } - var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2); - var instance = {length:count, value:[], 'class':this.jvm.classForName(clRef)}; - OPPUSH(instance); -ENDDEF - -DEFOP(ARETURN) - var objectref = OPPOP(); - return {return_object: objectref} -ENDDEF - -DEFOP(ARRAYLENGTH) - var arrayref = OPPOP(); - OPPUSH(arrayref.length); -ENDDEF - -DEFOP(ASTORE) - var objectref = OPPOP(); - LOCAL_VAR(READ_NEXT()) = objectref; -ENDDEF - -DEFALIAS(ASTORE_0) -DEFALIAS(ASTORE_1) -DEFALIAS(ASTORE_2) -DEFALIAS(ASTORE_3) -DEFNOP() - var objectref = OPPOP(); - LOCAL_VAR(OPCODE-ASTORE_0) = objectref; -ENDDEF - - -DEFOP(ATHROW) - var objectref = OPPOP(); - if (objectref == null){ - JVM_THROWS_NEW(java.lang.NullPointerException); - } - throw [objectref.classRef.name_ref.str,objectref]; -ENDDEF - -DEFOP(BALOAD) - var value = OPPOP(); - 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); - } - arrayref.value[index] = value; -ENDDEF - -DEFOP(BIPUSH) - OPPUSH(code.pop()); -ENDDEF - -DEFOP(CALOAD) - var index = OPPOP(); - var arrayref = OPPOP(); - - OPPUSH(arrayref.value[index]); -ENDDEF - -DEFOP(CASTORE) - var value = OPPOP(); - 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); - } - arrayref.value[index] = value; -ENDDEF - -DEFOP(CHECKCAST) - var objectref = OPPOP(); - var indexbyte1 = READ_NEXT(); - var indexbyte2 = READ_NEXT(); - var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2); - if (objectref.classRef.isAssignable(clRef)){ - OPPUSH(objectref); - }else{ - JVM_THROWS_NEW(java.lang.ClassCastException); - } -ENDDEF - -DEFOP(D2F) - var value = OPPOP(); - if (isNaN(value)){ - OPPUSH(NaN); - }else if(IS_OVERFLOW(value,FLOAT_MAX_VALUE)){ - OPPUSH(POSITIVE_INF); - }else if (IS_UNDEFLOW(value,FLOAT_MIN_VALUE)){ - OPPUSH(NEGATIVE_INF); - }else{ - OPPUSH(value); - } -ENDDEF - -DEFOP(D2I) - var value = OPPOP(); - if (isNaN(value)){ - OPPUSH(0); - }else if(IS_OVERFLOW(value,INT_MAX_VALUE)){ - OPPUSH(INT_MAX_VALUE); - }else if(IS_UNDERFLOW(value,INT_MIN_VALUE)){ - OPPUSH(INT_MIN_VALUE); - }else{ - OPPUSH(Math.round(value)); - } -ENDDEF - -DEFOP(D2L) - var value = OPPOP(); - if (isNaN(value)){ - OPPUSH(0); - }else if(IS_OVERFLOW(value,LONG_MAX_VALUE)){ - OPPUSH(LONG_MAX_VALUE); - }else if(IS_UNDERFLOW(value,LONG_MIN_VALUE)){ - OPPUSH(LONG_MIN_VALUE); - }else{ - OPPUSH(Math.round(value)); - } -ENDDEF - -DEFOP(DADD) - var value1 = OPPOP(); - var value2 = OPPOP(); - var result = value1 + value2; - if (IS_OVERFLOW(result,DOUBLE_MAX_VALUE)){ - OPPUSH(POSITIVE_INF); - }else if(IS_UNDERFLOW(result,DOUBLE_MIN_VALUE)){ - OPPUSH(NEGATIVE_INF); - }else{ - OPPUSH(result); - } -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); - } - OPPUSH(arrayref.value[index]); -ENDDEF - -DEFOP(DASTORE) - var value = OPPOP(); - 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); - } - arrayref.value[index] = value; -ENDDEF - -DEFALIAS(DCMPG) -DEFALIAS(DCMPL) -DEFNOP() - var value2 = OPPOP(); - var value1 = OPPOP(); - if (isNaN(value1) || isNaN(value2)) { OPPUSH((OPCODE == DCMPG)?1:0)} - if (value1 > value2){ - OPPUSH(1); - }else if(value1 == value2){ - OPPUSH(0); - }else{ - OPPUSH(-1); - } -ENDDEF - -DEFALIAS(DCONST_1) -DEFALIAS(DCONST_0) -DEFNOP() - OPPUSH(OPCODE-DCONST_0); -ENDDEF - diff --git a/makefile b/makefile new file mode 100644 index 0000000..fb973ed --- /dev/null +++ b/makefile @@ -0,0 +1,15 @@ +all: ids + +ids: + cd webserver && python app.py + +preprocess: + mkdir -p build + /usr/bin/cpp -P -undef -Wundef -std=c99 -nostdinc -Wtrigraphs -fdollars-in-identifiers src/main.js build/pp_jvm.js + +compile: preprocess + java -jar lib/compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js build/pp_jvm.js --js_output_file build/jvm.js + +clean: + rm -dR build + diff --git a/attributes.js b/src/attributes.js similarity index 100% rename from attributes.js rename to src/attributes.js diff --git a/class.js b/src/class.js similarity index 99% rename from class.js rename to src/class.js index ae08193..782e7cc 100644 --- a/class.js +++ b/src/class.js @@ -232,8 +232,10 @@ ClassDefinition.prototype.initializeClass = function(){ if (this.super_class && !this.super_class_ref.inited){ this.super_class_ref.initializeClass(); } + this.calculateEffectiveMembers(); - + var that = this + this.effectiveFields.each() // call this.inited = true; } diff --git a/constantPool.js b/src/constantPool.js similarity index 100% rename from constantPool.js rename to src/constantPool.js diff --git a/cpu.js b/src/cpu.js similarity index 90% rename from cpu.js rename to src/cpu.js index 85ac57f..530c66b 100644 --- a/cpu.js +++ b/src/cpu.js @@ -27,16 +27,19 @@ #define OPPOP() operand_stack.pop() #define OPPUSH(v) operand_stack.push(v) +#define OPPOPD() operand_stack.pop() && operand_stack.pop() +#define OPPUSHD(v) operand_stack.push(v) && operand_stack.push(null) + +#define OPSTACK(v) operand_stack[v] +#define OPSTACK_LENGTH() operand_stack.length + #define LOCAL_VAR(v) local_variables[v] #define OPCODE opcode #define PC pc +#define STACK_MOVE(y,x) OPSTACK(OPSTACK_LENGTH()-y) = OPSTACK(OPSTACK_LENGTH()-x) #define READ_NEXT() code[++pc] - - -function canonicalName(ref){ - return ref.str.replace(/\//g,".") -} +#define canonicalName(ref) ref.str.replace(/\//g,".") var JVM = function(params,args){ this.nativeMappingTable = {} diff --git a/infos.js b/src/infos.js similarity index 100% rename from infos.js rename to src/infos.js diff --git a/src/intrp.js b/src/intrp.js new file mode 100644 index 0000000..9a1ceae --- /dev/null +++ b/src/intrp.js @@ -0,0 +1,542 @@ +/* -*- Mode: Javascript -*- + * -*- coding: UTF-8 -*- + * Copyright (C) 2011 by Artur Ventura + * + * File: intrp.js + * Time-stamp: Fri Jul 15 02:46:27 2011 + * + * Author: Artur Ventura + * + */ + +#include "opcodes.js" +#define CHECK_NULL(ref) if (ref == NULL){ JVM_THROWS_NEW(java.lang.NullPointerException); } +#define CHECK_ARRAY_INDEX(ind,ref) if (ind >= ref.length){ JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException); } + +#define TO_INT(value) if (isNaN(value)){ OPPUSH(0); }else if(IS_OVERFLOW(value,INT_MAX_VALUE)){ OPPUSH(INT_MAX_VALUE); }else if(IS_UNDERFLOW(value,INT_MIN_VALUE)){ OPPUSH(INT_MIN_VALUE); }else{ OPPUSH(Math.round(value)); } +#define TO_FLOAT(value) if (isNaN(value)){ OPPUSHD(NaN); }else if(IS_OVERFLOW(value,FLOAT_MAX_VALUE)){ OPPUSHD(POSITIVE_INF); }else if (IS_UNDEFLOW(value,FLOAT_MIN_VALUE)){ OPPUSHD(NEGATIVE_INF); }else{ OPPUSHD(value);} +#define TO_LONG(value) if (isNaN(value)){ OPPUSH(0); }else if(IS_OVERFLOW(value,LONG_MAX_VALUE)){ OPPUSH(LONG_MAX_VALUE); }else if(IS_UNDERFLOW(value,LONG_MIN_VALUE)){ OPPUSH(LONG_MIN_VALUE); }else{ OPPUSH(Math.round(value));} + +DEFOP(AALOAD) +/* + * ..., array ref, index -> ..., ref value + */ + var index = OPPOP(); + var arrayref = OPPOP(); + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + + OPPUSH(arrayref.value[index]); +ENDDEF + +DEFOP(AASTORE) + var value = OPPOP(); + var index = OPPOP(); + var arrayref = OPPOP(); + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + + if (!arrayref.classRef.isAssignable(value.cl)){ + JVM_THROWS_NEW(java.lang.ArrayStoreException); + } + + arrayref.value[index] = value; +ENDDEF + +DEFOP(ACONST_NULL) + OPPUSH(null); +ENDDEF + +DEFOP(ALOAD) + var i = OPPOP(); + OPPUSH(LOCAL_VAR(i)) +ENDDEF + +DEFALIAS(ALOAD_0) +DEFALIAS(ALOAD_1) +DEFALIAS(ALOAD_2) +DEFALIAS(ALOAD_3) +DEFNOP() + OPPUSH(LOCAL_VAR(OPCODE - ALOAD_0)); +ENDDEF + +DEFOP(ANEWARRAY) + var indexbyte1 = READ_NEXT(); + var indexbyte2 = READ_NEXT(); + var count = OPPOP(); + if (count < 0){ + JVM_THROWS_NEW(java.lang.NegativeArraySizeException); + } + var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2); + var instance = {length:count, value:[], 'class':this.jvm.classForName(clRef)}; + OPPUSH(instance); +ENDDEF + +DEFOP(ARETURN) + var objectref = OPPOP(); + return {return_object: objectref} +ENDDEF + +DEFOP(ARRAYLENGTH) + var arrayref = OPPOP(); + OPPUSH(arrayref.length); +ENDDEF + +DEFOP(ASTORE) + var objectref = OPPOP(); + LOCAL_VAR(READ_NEXT()) = objectref; +ENDDEF + +DEFALIAS(ASTORE_0) +DEFALIAS(ASTORE_1) +DEFALIAS(ASTORE_2) +DEFALIAS(ASTORE_3) +DEFNOP() + var objectref = OPPOP(); + LOCAL_VAR(OPCODE-ASTORE_0) = objectref; +ENDDEF + + +DEFOP(ATHROW) + var objectref = OPPOP(); + CHECK_NULL(objectref); + throw [objectref.classRef.name_ref.str,objectref]; +ENDDEF + +DEFOP(BALOAD) + var value = OPPOP(); + var index = OPPOP(); + var arrayref = OPPOP(); + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + + arrayref.value[index] = value; +ENDDEF + +DEFOP(BIPUSH) + OPPUSH(code.pop()); +ENDDEF + +DEFOP(CALOAD) + var index = OPPOP(); + var arrayref = OPPOP(); + + OPPUSH(arrayref.value[index]); +ENDDEF + +DEFOP(CASTORE) + var value = OPPOP(); + var index = OPPOP(); + var arrayref = OPPOP(); + + CHECK_NULL(arrayref); + CHECK_ARRAY_INDEX(index,arrayref); + + arrayref.value[index] = value; +ENDDEF + +DEFOP(CHECKCAST) + var objectref = OPPOP(); + var indexbyte1 = READ_NEXT(); + var indexbyte2 = READ_NEXT(); + var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2); + if (objectref.classRef.isAssignable(clRef)){ + OPPUSH(objectref); + }else{ + JVM_THROWS_NEW(java.lang.ClassCastException); + } +ENDDEF + +DEFOP(D2F) + var value = OPPOPD(); + TO_FLOAT(value) +ENDDEF + +DEFOP(D2I) + var value = OPPOPD(); + TO_INT(value); +ENDDEF + +DEFOP(D2L) + var value = OPPOPD(); + TO_LONG(value); +ENDDEF + +DEFOP(DADD) + var value1 = OPPOPD(); + var value2 = OPPOPD(); + var result = value1 + value2; + if (IS_OVERFLOW(result,DOUBLE_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,DOUBLE_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +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); + } + OPPUSHD(arrayref.value[index]); +ENDDEF + +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); + } + arrayref.value[index] = value; +ENDDEF + +DEFALIAS(DCMPG) +DEFALIAS(DCMPL) +DEFNOP() + var value2 = OPPOPD(); + var value1 = OPPOPD(); + if (isNaN(value1) || isNaN(value2)) { OPPUSH((OPCODE == DCMPG)?1:0)} + if (value1 > value2){ + OPPUSH(1); + }else if(value1 == value2){ + OPPUSH(0); + }else{ + OPPUSH(-1); + } +ENDDEF + +DEFALIAS(DCONST_1) +DEFALIAS(DCONST_0) +DEFNOP() + OPPUSHD(OPCODE-DCONST_0); +ENDDEF + +DEFOP(DDIV) + var value2 = OPPOPD(); + var value1 = OPPOPD(); + var result = value1/value2; + + if (IS_OVERFLOW(result,DOUBLE_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,DOUBLE_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(DLOAD) + var index = READ_NEXT(); + OPPUSHD(LOCAL_VAR(index)); +ENDDEF + +DEFALIAS(DLOAD_0) +DEFALIAS(DLOAD_1) +DEFALIAS(DLOAD_2) +DEFALIAS(DLOAD_3) +DEFNOP() + var index = OPCODE - DLOAD_0; + OPPUSHD(LOCAL_VAR(index)); +ENDDEF + +DEFOP(DMUL) + var value2 = OPPOPD(); + var value1 = OPPOPD(); + var result = value1*value2; + + if (IS_OVERFLOW(result,DOUBLE_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,DOUBLE_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(DNEG) + OPPUSHD(NEG(OPPOPD())); +ENDDEF + +DEFOP(DREM) + var value2 = OPPOPD() + var value1 = OPPOPD() + var result = value2 % value1 + + if (IS_OVERFLOW(result,DOUBLE_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,DOUBLE_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(DRETURN) + var objectref = OPPOPD() + return {return_object: objectref} +ENDDEF + +DEFOP(DSTORE) + var index = READ_NEXT(); + var value = OPPOPD(); + LOCAL_VAR(index) = value; +ENDDEF + +DEFALIAS(DSTORE_0) +DEFALIAS(DSTORE_1) +DEFALIAS(DSTORE_2) +DEFALIAS(DSTORE_3) +DEFNOP() + var index = OPCODE - DLOAD_0; + var value = OPPOPD(); + LOCAL_VAR(index) = value; +ENDDEF + +DEFOP(DSUB) + var value2 = OPPOPD() + var value1 = OPPOPD() + var result = value2 % value1 + + if (IS_OVERFLOW(result,DOUBLE_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,DOUBLE_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(DUP) + STACK_MOVE(0,1) +ENDDEF + +DEFOP(DUP_X1) + STACK_MOVE(0,1) + STACK_MOVE(1,2) + STACK_MOVE(2,0) +ENDDEF + +DEFOP(DUP_X2) + STACK_MOVE(0,1) + STACK_MOVE(1,2) + STACK_MOVE(2,3) + STACK_MOVE(3,0) +ENDDEF + +DEFOP(DUP2) + STACK_MOVE(0,2) + STACK_MOVE(1,3) +ENDDEF + +DEFOP(DUP2_X1) + STACK_MOVE(0,2) + STACK_MOVE(1,3) + STACK_MOVE(2,4) + STACK_MOVE(3,0) + STACK_MOVE(4,1) +ENDDEF + +DEFOP(DUP2) + STACK_MOVE(0, 2); + STACK_MOVE(1, 3); + STACK_MOVE(2, 4); + STACK_MOVE(3, 5); + STACK_MOVE(4, 0); + STACK_MOVE(5, 1); +ENDDEF + +DEFOP(F2D) + // No Op, can box in the same space. +ENDDEF + +DEFOP(F2I) + var value = OPPOPD(); + TO_INT(value); +ENDDEF + +DEFOP(F2L) + var value = OPPOPD(); + TO_LONG(value); +ENDDEF + +DEFOP(FADD) + var value1 = OPPOPD(); + var value2 = OPPOPD(); + var result = value1 + value2; + if (IS_OVERFLOW(result,FLOAT_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,FLOAT_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +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); + } + OPPUSHD(arrayref.value[index]); +ENDDEF + +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); + } + arrayref.value[index] = value; +ENDDEF + +DEFALIAS(FCMPG) +DEFALIAS(FCMPL) +DEFNOP() + var value2 = OPPOPD(); + var value1 = OPPOPD(); + if (isNaN(value1) || isNaN(value2)) { OPPUSH((OPCODE == FCMPG)?1:0)} + if (value1 > value2){ + OPPUSH(1); + }else if(value1 == value2){ + OPPUSH(0); + }else{ + OPPUSH(-1); + } +ENDDEF + +DEFALIAS(FCONST_1) +DEFALIAS(FCONST_0) +DEFNOP() + OPPUSHD(OPCODE-FCONST_0); +ENDDEF + +DEFOP(FDIV) + var value2 = OPPOPD(); + var value1 = OPPOPD(); + var result = value1*value2; + + if (IS_OVERFLOW(result,FLOAT_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,FLOAT_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(FLOAD) + var index = READ_NEXT(); + OPPUSHD(LOCAL_VAR(index)); +ENDDEF + +DEFALIAS(FLOAD_0) +DEFALIAS(FLOAD_1) +DEFALIAS(FLOAD_2) +DEFALIAS(FLOAD_3) +DEFNOP() + var index = OPCODE - FLOAD_0; + OPPUSHD(LOCAL_VAR(index)); +ENDDEF + +DEFOP(FMUL) + var value2 = OPPOPD(); + var value1 = OPPOPD(); + var result = value1*value2; + + if (IS_OVERFLOW(result,FLOAT_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,FLOAT_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(FNEG) + OPPUSHD(NEG(OPPOPD())); +ENDDEF + +DEFOP(FREM) + var value2 = OPPOPD() + var value1 = OPPOPD() + var result = value2 % value1 + + if (IS_OVERFLOW(result,FLOAT_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,FLOAT_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(FRETURN) + var objectref = OPPOPD() + return {return_object: objectref} +ENDDEF + +DEFOP(FSTORE) + var index = READ_NEXT(); + var value = OPPOPD(); + LOCAL_VAR(index) = value; +ENDDEF + +DEFALIAS(FSTORE_0) +DEFALIAS(FSTORE_1) +DEFALIAS(FSTORE_2) +DEFALIAS(FSTORE_3) +DEFNOP() + var index = OPCODE - DLOAD_0; + var value = OPPOPD(); + LOCAL_VAR(index) = value; +ENDDEF + +DEFOP(FSUB) + var value2 = OPPOPD() + var value1 = OPPOPD() + var result = value2 % value1 + + if (IS_OVERFLOW(result,FLOAT_MAX_VALUE)){ + OPPUSHD(POSITIVE_INF); + }else if(IS_UNDERFLOW(result,FLOAT_MIN_VALUE)){ + OPPUSHD(NEGATIVE_INF); + }else{ + OPPUSHD(result); + } +ENDDEF + +DEFOP(GETFIELD) + var indexbyte1 = READ_NEXT(); + var indexbyte2 = READ_NEXT(); + var objectref = OPPOP(); + + CHECK_NULL(objectref) + field = objectref["class"].constantPool[(indexbyte1 << 8) | indexbyte2]; + //check if static + OPPUSH(objectref[canonicalName(field.class_ref.name_ref.str) + " " + field.name_and_type_ref.name_ref.str]); +ENDDEF + +DEFOP(GETSTATIC) + +ENDDEF diff --git a/linearDatastream.js b/src/linearDatastream.js similarity index 100% rename from linearDatastream.js rename to src/linearDatastream.js diff --git a/main.js b/src/main.js similarity index 100% rename from main.js rename to src/main.js diff --git a/opcodes.js b/src/opcodes.js similarity index 100% rename from opcodes.js rename to src/opcodes.js diff --git a/preload.js b/src/preload.js similarity index 100% rename from preload.js rename to src/preload.js diff --git a/types.js b/src/types.js similarity index 100% rename from types.js rename to src/types.js diff --git a/app.py b/webserver/app.py similarity index 90% rename from app.py rename to webserver/app.py index 28a31b8..ca15781 100644 --- a/app.py +++ b/webserver/app.py @@ -27,10 +27,10 @@ class index: return "" if filename.endswith(".js"): web.header('Content-Type', 'text/javascript') - return commands.getstatusoutput("/usr/bin/cpp -P -undef -Wundef -std=c99 -nostdinc -Wtrigraphs -fdollars-in-identifiers " + filename)[1] + return commands.getstatusoutput("/usr/bin/cpp -P -undef -Wundef -std=c99 -nostdinc -Wtrigraphs -fdollars-in-identifiers ../src/" + filename)[1] if "testRuntime" in filename: alphex = filename[filename.rfind("/") + 1:]; - return file("runtime/" + alphex.replace(".","/") + ".class"); + return file("../runtime/" + alphex.replace(".","/") + ".class"); if filename == "": return file("index.html").read() try: diff --git a/index.html b/webserver/index.html similarity index 100% rename from index.html rename to webserver/index.html diff --git a/web/__init__.py b/webserver/web/__init__.py similarity index 100% rename from web/__init__.py rename to webserver/web/__init__.py diff --git a/web/application.py b/webserver/web/application.py similarity index 100% rename from web/application.py rename to webserver/web/application.py diff --git a/web/browser.py b/webserver/web/browser.py similarity index 100% rename from web/browser.py rename to webserver/web/browser.py diff --git a/web/contrib/__init__.py b/webserver/web/contrib/__init__.py similarity index 100% rename from web/contrib/__init__.py rename to webserver/web/contrib/__init__.py diff --git a/web/contrib/template.py b/webserver/web/contrib/template.py similarity index 100% rename from web/contrib/template.py rename to webserver/web/contrib/template.py diff --git a/web/db.py b/webserver/web/db.py similarity index 100% rename from web/db.py rename to webserver/web/db.py diff --git a/web/debugerror.py b/webserver/web/debugerror.py similarity index 100% rename from web/debugerror.py rename to webserver/web/debugerror.py diff --git a/web/form.py b/webserver/web/form.py similarity index 100% rename from web/form.py rename to webserver/web/form.py diff --git a/web/http.py b/webserver/web/http.py similarity index 100% rename from web/http.py rename to webserver/web/http.py diff --git a/web/httpserver.py b/webserver/web/httpserver.py similarity index 100% rename from web/httpserver.py rename to webserver/web/httpserver.py diff --git a/web/net.py b/webserver/web/net.py similarity index 100% rename from web/net.py rename to webserver/web/net.py diff --git a/web/session.py b/webserver/web/session.py similarity index 100% rename from web/session.py rename to webserver/web/session.py diff --git a/web/template.py b/webserver/web/template.py similarity index 100% rename from web/template.py rename to webserver/web/template.py diff --git a/web/test.py b/webserver/web/test.py similarity index 100% rename from web/test.py rename to webserver/web/test.py diff --git a/web/utils.py b/webserver/web/utils.py similarity index 100% rename from web/utils.py rename to webserver/web/utils.py diff --git a/web/webapi.py b/webserver/web/webapi.py similarity index 100% rename from web/webapi.py rename to webserver/web/webapi.py diff --git a/web/webopenid.py b/webserver/web/webopenid.py similarity index 100% rename from web/webopenid.py rename to webserver/web/webopenid.py diff --git a/web/wsgi.py b/webserver/web/wsgi.py similarity index 100% rename from web/wsgi.py rename to webserver/web/wsgi.py diff --git a/web/wsgiserver/LICENSE.txt b/webserver/web/wsgiserver/LICENSE.txt similarity index 100% rename from web/wsgiserver/LICENSE.txt rename to webserver/web/wsgiserver/LICENSE.txt diff --git a/web/wsgiserver/__init__.py b/webserver/web/wsgiserver/__init__.py similarity index 100% rename from web/wsgiserver/__init__.py rename to webserver/web/wsgiserver/__init__.py