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){
|
if (this.super_class && !this.super_class_ref.inited){
|
||||||
this.super_class_ref.initializeClass();
|
this.super_class_ref.initializeClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.calculateEffectiveMembers();
|
this.calculateEffectiveMembers();
|
||||||
|
var that = this
|
||||||
|
this.effectiveFields.each()
|
||||||
// call <cinit>
|
// call <cinit>
|
||||||
this.inited = true;
|
this.inited = true;
|
||||||
}
|
}
|
@ -27,16 +27,19 @@
|
|||||||
#define OPPOP() operand_stack.pop()
|
#define OPPOP() operand_stack.pop()
|
||||||
#define OPPUSH(v) operand_stack.push(v)
|
#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 LOCAL_VAR(v) local_variables[v]
|
||||||
#define OPCODE opcode
|
#define OPCODE opcode
|
||||||
#define PC pc
|
#define PC pc
|
||||||
|
#define STACK_MOVE(y,x) OPSTACK(OPSTACK_LENGTH()-y) = OPSTACK(OPSTACK_LENGTH()-x)
|
||||||
#define READ_NEXT() code[++pc]
|
#define READ_NEXT() code[++pc]
|
||||||
|
|
||||||
|
#define canonicalName(ref) ref.str.replace(/\//g,".")
|
||||||
|
|
||||||
function canonicalName(ref){
|
|
||||||
return ref.str.replace(/\//g,".")
|
|
||||||
}
|
|
||||||
|
|
||||||
var JVM = function(params,args){
|
var JVM = function(params,args){
|
||||||
this.nativeMappingTable = {}
|
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 ""
|
return ""
|
||||||
if filename.endswith(".js"):
|
if filename.endswith(".js"):
|
||||||
web.header('Content-Type', 'text/javascript')
|
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:
|
if "testRuntime" in filename:
|
||||||
alphex = filename[filename.rfind("/") + 1:];
|
alphex = filename[filename.rfind("/") + 1:];
|
||||||
return file("runtime/" + alphex.replace(".","/") + ".class");
|
return file("../runtime/" + alphex.replace(".","/") + ".class");
|
||||||
if filename == "":
|
if filename == "":
|
||||||
return file("index.html").read()
|
return file("index.html").read()
|
||||||
try:
|
try:
|
Loading…
x
Reference in New Issue
Block a user