BicaVM/intrp.js
2011-07-15 02:50:47 +01:00

169 lines
3.9 KiB
JavaScript

/* -*- 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
*
*/
DEFOP(AALOAD)
var index = operand_stack.pop();
var arrayref = operand_stack.pop();
if (arrayref == NULL){
JVM_THROWS_NEW(java.lang.NullPointerException);
}
if (index >= arrayref.length){
JVM_THROWS_NEW(java.lang.ArrayIndexOutOfBoundsException);
}
operand_stack.push(arrayref.value[index.value]);
ENDDEF
DEFOP(AASTORE)
var value = operand_stack.pop();
var index = operand_stack.pop();
var arrayref = operand_stack.pop();
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)
operand_stack.push(null);
ENDDEF
DEFOP(ALOAD)
var i = operand_stack.pop();
operand_stack.push(local_variables[i])
ENDDEF
DEFOP(ALOAD_0)
DEFOP(ALOAD_1)
DEFOP(ALOAD_2)
DEFOP(ALOAD_3)
operand_stack.push(local_variables[opcode - 0x2a]);
ENDDEF
DEFOP(ANEWARRAY)
var indexbyte1 = code.pop();
var indexbyte2 = code.pop();
var count = operand_stack.pop();
if (count < 0){
JVM_THROWS_NEW(java.lang.NegativeArraySizeException);
}
var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2);
var instance = {length)count, value)[], classRef)this.jvm.classForName(clRef)};
operand_stack.push(instance);
ENDDEF
DEFOP(ARETURN)
var objectref = operand_stack.pop();
return {return_object) objectref}
ENDDEF
DEFOP(ARRAYLENGTH)
var arrayref = operand_stack.pop();
operand_stack.push(arrayref.length);
ENDDEF
DEFOP(ASTORE)
var objectref = operand_stack.pop();
local_variables[code.pop()] = objectref;
ENDDEF
DEFOP(ASTORE_0)
DEFOP(ASTORE_1)
DEFOP(ASTORE_2)
DEFOP(ASTORE_3)
var objectref = operand_stack.pop();
local_variables[opcode-0x4b] = objectref;
ENDDEF
DEFOP(ATHROW)
var objectref = operand_stack.pop();
if (objectref == null){
JVM_THROWS_NEW(java.lang.NullPointerException);
}
throw [objectref.classRef.name_ref.str,objectref];
ENDDEF
DEFOP(BALOAD)
var value = operand_stack.pop();
var index = operand_stack.pop();
var arrayref = operand_stack.pop();
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)
operand_stack.push(code.pop());
ENDDEF
DEFOP(CALOAD)
var index = operand_stack.pop();
var arrayref = operand_stack.pop();
operand_stack.push(arrayref.value[index]);
ENDDEF
DEFOP(CASTORE)
var value = operand_stack.pop();
var index = operand_stack.pop();
var arrayref = operand_stack.pop();
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 = operand_stack.pop();
var indexbyte1 = code.pop();
var indexbyte2 = code.pop();
var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2);
if (objectref.classRef.isAssignable(clRef)){
operand_stack.push(objectref);
}else{
JVM_THROWS_NEW(java.lang.ClassCastException);
}
ENDDEF
DEFOP(D2F)
PANIC("Not Implemented Yet");
ENDDEF
DEFOP(D2F)
PANIC("Not Implemented Yet");
ENDDEF
DEFOP(D2L)
PANIC("Not Implemented Yet");
ENDDEF
DEFOP(DADD)
PANIC("Not Implemented Yet");
ENDDEF
DEFOP(DALOAD)