From 03521bccd41b8b9673c5354ed4cb31b8a14c7611 Mon Sep 17 00:00:00 2001 From: Artur Ventura Date: Thu, 21 Jul 2011 16:10:43 +0100 Subject: [PATCH] more intrp code. this never ends... --- src/class.js | 4 +- src/intrp.def | 160 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 157 insertions(+), 7 deletions(-) diff --git a/src/class.js b/src/class.js index f78199e..88ca29e 100644 --- a/src/class.js +++ b/src/class.js @@ -253,11 +253,13 @@ ClassDefinition.prototype.calculateEffectiveMembers = function(){ this.effectiveMethods = {} for(var k in superEffective[1]){ this.effectiveMethods[k] = superEffective[1][k]; + this[k] = superEffective[1][k]; } for(var i=0; i value2){ var branchoffset = (branchbyte1 << 8) | branchbyte2; PC = PC + branchoffset; } ENDDEF -DEFOP(IF_ICMPLE) +DEFOP(IF_ICMPGE) var branchbyte1 = READ_NEXT(); var branchbyte2 = READ_NEXT(); var value1 = OPPOP(); var value2 = OPPOP(); - if (value1 <= value2){ + if (value1 >= value2){ var branchoffset = (branchbyte1 << 8) | branchbyte2; PC = PC + branchoffset; } -ENDDEF \ No newline at end of file +ENDDEF + +DEFOP(IFEQ) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value == 0){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IFNE) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value != 0){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IFLT) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value < 0){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IFLE) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value <= 0){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IFGT) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value > 0){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IFGE) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value >= 0){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IFNONNULL) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value != NULL){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IFNULL) + var branchbyte1 = READ_NEXT(); + var branchbyte2 = READ_NEXT(); + var value = OPPOP(); + + if (value != NULL){ + var branchoffset = (branchbyte1 << 8) | branchbyte2; + PC = PC + branchoffset; + } +ENDDEF + +DEFOP(IINC) + var index = READ_NEXT(); + var aConst = READ_NEXT(); + LOCAL_VAR(index)++; +ENDDEF + +DEFOP(ILOAD) + var index = READ_NEXT(); + OPPUSH(LOCAL_VAR(index)); +ENDDEF + +DEFALIAS(ILOAD_0) +DEFALIAS(ILOAD_1) +DEFALIAS(ILOAD_2) +DEFALIAS(ILOAD_3) +DEFNOP() + OPPUSH(OPCODE - ILOAD_0); +ENDDEF + +DEFOP(IMUL) + var value1 = OPPOP(); + var value2 = OPPOP(); + var result = value1 * value2; + if (IS_OVERFLOW(result,INT_MAX_VALUE)){ + OPPUSH(INT_OVERFLOW(result)); + }else{ + OPPUSH(result); + } +ENDDEF + +DEFOP(INEG) + var value = OPPOP(); + var result = 0 - value; + if (IS_OVERFLOW(result,INT_MAX_VALUE) || IS_UNDERFLOW(result,INT_MINVALUE)){ + OPPUSH(INT_OVERFLOW(result)); + }else{ + OPPUSH(result); + } +ENDDEF + +DEFOP(INSTANCEOF) + var indexbyte1 = READ_NEXT(); + var indexbyte2 = READ_NEXT(); + + var objectref = OPPOP(); + + var className = canonicalName(this_method_class.constantPool[(indexbyte1 << 8) | indexbyte2].name_ref.str); + + objectref["class"].isAssignable(jvm.classForName(className); +ENDDEF + +DEFOP(INVOKEINTERFACE) + var indexbyte1 = READ_NEXT(); + var indexbyte2 = READ_NEXT(); + var count = READ_NEXT(); + /* expected 0*/ READ_NEXT(); + + var method = this_method_class.constantPool[(indexbyte1 << 8) | indexbyte2] +ENDDEF