restructuring the project folder and adding a makefile
This commit is contained in:
parent
97c1b8669f
commit
2025c82c99
BIN
Test.class
BIN
Test.class
Binary file not shown.
253
intrp.js
253
intrp.js
@ -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
|
||||
|
15
makefile
Normal file
15
makefile
Normal file
@ -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
|
||||
|
@ -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 <cinit>
|
||||
this.inited = true;
|
||||
}
|
@ -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 = {}
|
542
src/intrp.js
Normal file
542
src/intrp.js
Normal file
@ -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
|
@ -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:
|
Loading…
x
Reference in New Issue
Block a user