From d8d15c1a1240808c257dd1585b510ab667e93dc0 Mon Sep 17 00:00:00 2001 From: Artur Ventura Date: Tue, 2 Aug 2011 14:08:37 +0100 Subject: [PATCH] Interpreter Ready --- src/cpu.js | 2 +- src/cpu.jsh | 2 + src/intrp.def | 326 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 328 insertions(+), 2 deletions(-) diff --git a/src/cpu.js b/src/cpu.js index 164baa2..8eb0dd3 100644 --- a/src/cpu.js +++ b/src/cpu.js @@ -100,6 +100,6 @@ function interpret(frame){ var temp = null; #endif switch(OPCODE){ -#include "intrp.def" +#include "intrp.def" } } diff --git a/src/cpu.jsh b/src/cpu.jsh index 23bb40f..805240f 100644 --- a/src/cpu.jsh +++ b/src/cpu.jsh @@ -53,4 +53,6 @@ function canonicalName(ref) {return ref.str.replace(/\//g,".");} +#define QWORD(byte1,byte2,byte3,byte4) ((byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4) + #endif //_CPU_JSH_ diff --git a/src/intrp.def b/src/intrp.def index eda7e2b..b0f0e25 100644 --- a/src/intrp.def +++ b/src/intrp.def @@ -62,7 +62,7 @@ DEFOP(ANEWARRAY) JVM_THROWS_NEW(java.lang.NegativeArraySizeException); } var clRef = frame.classRef.constantPool.get((indexbyte1 << 8) | indexbyte2); - var instance = {length:count, value:[], 'class':xl.jvm.classForName(clRef)}; + var instance = {length:count, dimensions:1, value:[], 'class':xl.jvm.classForName(clRef)}; OPPUSH(instance); ENDDEF @@ -1209,3 +1209,327 @@ DEFOP(LNEG) } ENDDEF +DEFOP(LOOKUPSWITCH) + var shift = PC % 4; + var instrPC = PC - 1 + if (shift != 0){ + switch(shift){ + case 1: + READ_NEXT(); + case 2: + READ_NEXT(); + case 3: + READ_NEXT(); + } + } + var stack_key = OPPOP(); + + var defaultbyte1 = READ_NEXT(); + var defaultbyte2 = READ_NEXT(); + var defaultbyte3 = READ_NEXT(); + var defaultbyte4 = READ_NEXT(); + var jmp = QWORD(defaultbyte1,defaultbyte2,defaultbyte3,defaultbyte4); + + var npair1 = READ_NEXT(); + var npair2 = READ_NEXT(); + var npair3 = READ_NEXT(); + var npair4 = READ_NEXT(); + var npair = QWORD(npair1,npair2,npair3,npair4); + + for(var i=0; i> (value2 & 0x1f); + + if (IS_OVERFLOW(result,LONG_MAX_VALUE) || IS_UNDERFLOW(result,LONG_MIN_VALUE)){ + OPPUSH(LONG_OVERFLOW(result)); + }else{ + OPPUSH(result); + } +ENDDEF + +DEFOP(LSTORE) + var index = READ_NEXT(); + LOCAL_VAR(index) = OPPOP(); +ENDDEF + +DEFALIAS(LSTORE_0) +DEFALIAS(LSTORE_1) +DEFALIAS(LSTORE_2) +DEFALIAS(LSTORE_3) +DEFNOP() + LOCAL_VAR(READ_NEXT()) = (OPCODE - LSTORE_0); +ENDDEF + +DEFOP(LSUB) + var value1 = OPPOP(); + var value2 = OPPOP(); + var result = value1 - value2; + if (IS_UNDERFLOW(result,LONG_MAX_VALUE)){ + OPPUSH(LONG_OVERFLOW(result)); + }else{ + OPPUSH(result); + } +ENDDEF + +DEFOP(LUSHR) + var value2 = OPPOP(); + var value1 = OPPOP(); + OPPUSH((value1<0)?(value1 >> (value2 & 0x1f)) + (2 << ~s):value1 >> (value2 & 0x1f)) +ENDDEF + +DEFOP(LXOR) + var value2 = OPPOP(); + var value1 = OPPOP(); + OPPUSH(LONG_OVERFLOW(value1 ^ value2)); +ENDDEF + +DEFOP(MONITORENTER) + PANIC("THREADING NOT IMPLEMENTED YET"); +ENDDEF + +DEFOP(MONITOREXIT) + PANIC("THREADING NOT IMPLEMENTED YET"); +ENDDEF + +DEFOP(MULTIANEWARRAY) + var indexbyte1 = READ_NEXT(); + var indexbyte2 = READ_NEXT(); + var dimensions = READ_NEXT(); + var counts = []; + for(var i=0; i high){ + var length = high - low + 2; + for(var i=0; i