2011-07-15 02:50:47 +01:00
|
|
|
/* -*- 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
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2011-07-18 00:56:41 +01:00
|
|
|
#include "opcodes.js"
|
|
|
|
|
2011-07-15 02:50:47 +01:00
|
|
|
DEFOP(AALOAD)
|
2011-07-18 00:56:41 +01:00
|
|
|
var index = OPPOP();
|
|
|
|
var arrayref = OPPOP();
|
2011-07-15 02:50:47 +01:00
|
|
|
|
|
|
|
if (arrayref == NULL){
|
|
|
|
JVM_THROWS_NEW(java.lang.NullPointerException);
|
|
|
|
}
|
|
|
|
if (index >= arrayref.length){
|
|
|
|
JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException);
|
|
|
|
}
|
2011-07-18 00:56:41 +01:00
|
|
|
OPPUSH(arrayref.value[index.value]);
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(AASTORE)
|
2011-07-18 00:56:41 +01:00
|
|
|
var value = OPPOP();
|
|
|
|
var index = OPPOP();
|
|
|
|
var arrayref = OPPOP();
|
2011-07-15 02:50:47 +01:00
|
|
|
|
|
|
|
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)
|
2011-07-18 00:56:41 +01:00
|
|
|
OPPUSH(null);
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(ALOAD)
|
2011-07-18 00:56:41 +01:00
|
|
|
var i = OPPOP();
|
|
|
|
OPPUSH(LOCAL_VAR(i))
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
2011-07-18 00:56:41 +01:00
|
|
|
DEFALIAS(ALOAD_0)
|
|
|
|
DEFALIAS(ALOAD_1)
|
|
|
|
DEFALIAS(ALOAD_2)
|
|
|
|
DEFALIAS(ALOAD_3)
|
|
|
|
DEFNOP()
|
|
|
|
OPPUSH(LOCAL_VAR(OPCODE - ALOAD_0));
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(ANEWARRAY)
|
2011-07-18 00:56:41 +01:00
|
|
|
var indexbyte1 = READ_NEXT();
|
|
|
|
var indexbyte2 = READ_NEXT();
|
|
|
|
var count = OPPOP();
|
2011-07-15 02:50:47 +01:00
|
|
|
if (count < 0){
|
|
|
|
JVM_THROWS_NEW(java.lang.NegativeArraySizeException);
|
|
|
|
}
|
|
|
|
var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2);
|
2011-07-18 00:56:41 +01:00
|
|
|
var instance = {length:count, value:[], 'class':this.jvm.classForName(clRef)};
|
|
|
|
OPPUSH(instance);
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(ARETURN)
|
2011-07-18 00:56:41 +01:00
|
|
|
var objectref = OPPOP();
|
2011-07-17 18:42:58 +01:00
|
|
|
return {return_object: objectref}
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(ARRAYLENGTH)
|
2011-07-18 00:56:41 +01:00
|
|
|
var arrayref = OPPOP();
|
|
|
|
OPPUSH(arrayref.length);
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(ASTORE)
|
2011-07-18 00:56:41 +01:00
|
|
|
var objectref = OPPOP();
|
|
|
|
LOCAL_VAR(READ_NEXT()) = objectref;
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
2011-07-18 00:56:41 +01:00
|
|
|
DEFALIAS(ASTORE_0)
|
|
|
|
DEFALIAS(ASTORE_1)
|
|
|
|
DEFALIAS(ASTORE_2)
|
|
|
|
DEFALIAS(ASTORE_3)
|
|
|
|
DEFNOP()
|
|
|
|
var objectref = OPPOP();
|
|
|
|
LOCAL_VAR(OPCODE-ASTORE_0) = objectref;
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
|
|
|
|
DEFOP(ATHROW)
|
2011-07-18 00:56:41 +01:00
|
|
|
var objectref = OPPOP();
|
2011-07-15 02:50:47 +01:00
|
|
|
if (objectref == null){
|
|
|
|
JVM_THROWS_NEW(java.lang.NullPointerException);
|
|
|
|
}
|
|
|
|
throw [objectref.classRef.name_ref.str,objectref];
|
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(BALOAD)
|
2011-07-18 00:56:41 +01:00
|
|
|
var value = OPPOP();
|
|
|
|
var index = OPPOP();
|
|
|
|
var arrayref = OPPOP();
|
2011-07-15 02:50:47 +01:00
|
|
|
|
|
|
|
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)
|
2011-07-18 00:56:41 +01:00
|
|
|
OPPUSH(code.pop());
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(CALOAD)
|
2011-07-18 00:56:41 +01:00
|
|
|
var index = OPPOP();
|
|
|
|
var arrayref = OPPOP();
|
2011-07-15 02:50:47 +01:00
|
|
|
|
2011-07-18 00:56:41 +01:00
|
|
|
OPPUSH(arrayref.value[index]);
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(CASTORE)
|
2011-07-18 00:56:41 +01:00
|
|
|
var value = OPPOP();
|
|
|
|
var index = OPPOP();
|
|
|
|
var arrayref = OPPOP();
|
2011-07-15 02:50:47 +01:00
|
|
|
|
|
|
|
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)
|
2011-07-18 00:56:41 +01:00
|
|
|
var objectref = OPPOP();
|
|
|
|
var indexbyte1 = READ_NEXT();
|
|
|
|
var indexbyte2 = READ_NEXT();
|
2011-07-15 02:50:47 +01:00
|
|
|
var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2);
|
|
|
|
if (objectref.classRef.isAssignable(clRef)){
|
2011-07-18 00:56:41 +01:00
|
|
|
OPPUSH(objectref);
|
2011-07-15 02:50:47 +01:00
|
|
|
}else{
|
|
|
|
JVM_THROWS_NEW(java.lang.ClassCastException);
|
|
|
|
}
|
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(D2F)
|
2011-07-18 00:56:41 +01:00
|
|
|
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);
|
|
|
|
}
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
2011-07-18 00:56:41 +01:00
|
|
|
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));
|
|
|
|
}
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(D2L)
|
2011-07-18 00:56:41 +01:00
|
|
|
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));
|
|
|
|
}
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|
|
|
|
DEFOP(DADD)
|
2011-07-18 00:56:41 +01:00
|
|
|
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);
|
2011-07-15 02:50:47 +01:00
|
|
|
ENDDEF
|
|
|
|
|