Mirror of the JODE repository
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
jode/jode/jode/jvm/Interpreter.j

1901 lines
36 KiB

; Interpreter Copyright (C) 1999 Jochen Hoenicke.
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2, or (at your option)
; any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; see the file COPYING. If not, write to
; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;
; $Id$
; This class is a java virtual machine written in java :-). Well not
; exactly. It does only handle a subset of the opcodes and is mainly
; written do deobfuscate Strings.
;
; @author Jochen Hoenicke
.class public jode/jvm/Interpreter
.super java/lang/Object
.implements jode/bytecode/Opcodes
.method public static interpretMethod(Ljode/jvm/RuntimeEnvironment;Ljode/bytecode/BytecodeInfo;[Ljode/jvm/Value;)Ljava/lang/Object;
.throws jode/jvm/InterpreterException
.throws java/lang/reflect/InvocationTargetException
.limit locals 9
.limit stack 10
.catch java/lang/RuntimeException from aload_start to aload_end using wrapexception_handler
.catch java/lang/RuntimeException from aastore_start to aastore_end using wrapexception_handler
.catch java/lang/RuntimeException from zastore_start to zastore_end using wrapexception_handler
.catch java/lang/RuntimeException from bastore_start to bastore_end using wrapexception_handler
.catch java/lang/RuntimeException from sastore_start to sastore_end using wrapexception_handler
.catch java/lang/RuntimeException from castore_start to castore_end using wrapexception_handler
.catch java/lang/ArithmeticException from idiv_start to idiv_end using wrapexception_handler
.catch java/lang/ArithmeticException from irem_start to irem_end using wrapexception_handler
.catch java/lang/ArithmeticException from ldiv_start to ldiv_end using wrapexception_handler
.catch java/lang/ArithmeticException from lrem_start to lrem_end using wrapexception_handler
.catch java/lang/NullPointerException from arrlength_start to arrlength_end using wrapexception_handler
.catch java/lang/NegativeArraySizeException from newarray_start to newarray_end using wrapexception_handler
.catch java/lang/reflect/InvocationTargetException from newinstance_start to newinstance_end using invocationtarget_handler
.catch java/lang/reflect/InvocationTargetException from invoke_start to invoke_end using invocationtarget_handler
aload_1
dup
invokevirtual jode/bytecode/BytecodeInfo/getMaxStack()I
dup
anewarray jode/jvm/Value
dup_x1
astore_3
goto initstack_enter
initstack_loop:
dup2
new jode/jvm/Value
dup
invokenonvirtual jode/jvm/Value/<init>()V
aastore
initstack_enter:
iconst_1
isub
dup
ifge initstack_loop
pop2
invokevirtual jode/bytecode/BytecodeInfo/getInstructions()Ljava.util.List;
iconst_0
invokevirtual java/util/List/get(I)Ljava/lang/Object;
checkcast jode/bytecode/Instruction;
astore 4
iconst_0
istore 5
; 0 == env
; 1 == code
; 2 == stack
; 3 == locals
; 4 == pc
; 5 == stacktop
big_loop:
; ========= DEBUGGING OUTPUT ===============================
getstatic jode/GlobalOptions/debuggingFlags I
sipush 0x400
iand
ifeq skip_debugging
getstatic jode/GlobalOptions/err Ljava/io/PrintStream;
dup
aload 4
invokevirtual jode/bytecode/Instruction/getDescription()Ljava/lang/String;
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
dup
new java/lang/StringBuffer
dup
ldc "stack: ["
invokenonvirtual java/lang/StringBuffer/<init>(Ljava/lang/String;)V
; stack contains:
; addr+": ["
; System.err
; System.err
iconst_0
istore 6
iload 5 ; stacktop
ifgt stackenter_1
goto stackdone_1
; stringbuffer
; System.err
; System.err
stackloop_1:
ldc ","
invokevirtual java/lang/StringBuffer/append(Ljava/lang/String;)Ljava/lang/StringBuffer;
stackenter_1:
aload_3
iload 6
aaload
dup
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
instanceof [C
ifeq add_object
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
checkcast [C
invokevirtual java/lang/StringBuffer/append([C)Ljava/lang/StringBuffer;
goto added_object
add_object:
invokevirtual java/lang/StringBuffer/append(Ljava/lang/Object;)Ljava/lang/StringBuffer;
added_object:
iinc 6 1
iload 6 ; stackindex
iload 5 ; stacktop
if_icmplt stackloop_1
; stringbuffer
; System.err
stackdone_1:
ldc "]"
invokevirtual java/lang/StringBuffer/append(Ljava/lang/String;)Ljava/lang/StringBuffer;
invokevirtual java/lang/StringBuffer/toString()Ljava/lang/String;
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
new java/lang/StringBuffer
dup
ldc "local: ["
invokenonvirtual java/lang/StringBuffer/<init>(Ljava/lang/String;)V
; stack contains:
; addr+": ["
; System.err
iconst_0
istore 6
aload 2
arraylength ; maxlocals
ifgt localenter_2
goto localdone_2
; stringbuffer
; System.err
localloop_2:
ldc ","
invokevirtual java/lang/StringBuffer/append(Ljava/lang/String;)Ljava/lang/StringBuffer;
localenter_2:
aload_2
iload 6
aaload
dup
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
instanceof [C
ifeq add_object2
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
checkcast [C
invokevirtual java/lang/StringBuffer/append([C)Ljava/lang/StringBuffer;
goto added_object2
add_object2:
invokevirtual java/lang/StringBuffer/append(Ljava/lang/Object;)Ljava/lang/StringBuffer;
added_object2:
iinc 6 1
iload 6 ; stackindex
aload 2
arraylength ; maxlocals
if_icmplt localloop_2
; stringbuffer
; System.err
localdone_2:
ldc "]"
invokevirtual java/lang/StringBuffer/append(Ljava/lang/String;)Ljava/lang/StringBuffer;
invokevirtual java/lang/StringBuffer/toString()Ljava/lang/String;
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
; ========= DEBUGGING OUTPUT ENDS ===============================
skip_debugging:
aload 4
dup
astore 6
dup
invokevirtual jode/bytecode/Instruction/getNextByAddr()Ljode/bytecode/Instruction;
astore 4
invokevirtual jode/bytecode/Instruction/getOpcode()I
; stack:
; instr.opcode
dup
sipush 153
if_icmpge if_or_special_instr
dup
bipush 87
if_icmpge no_const_store_load_instr
dup
bipush 20
if_icmpgt load_store_instr
dup
ifeq nop_instr
; ====== LDC / LDC2_W
aload_3 ; stack
iload 5 ; stacktop
aaload
iinc 5 1
aload 6
invokevirtual jode/bytecode/Instruction/getConstant()Ljava/lang/Object;
; Stack:
; instr.objData
; stack_value
; opcode
invokevirtual jode/jvm/Value/setObject(Ljava/lang/Object;)V
bipush 20 ; opc_ldc2_w
if_icmpne big_loop
iinc 5 1
goto big_loop
illegal_instr:
nop_instr:
popI_big_loop:
pop
goto big_loop
; ====== LOAD / STORE INSTRUCTIONS
load_store_instr:
dup
bipush 54
if_icmpge store_instr
dup
bipush 46
if_icmpge array_load_instr
; ====== LOAD INSTRUCTIONS
aload_3 ; stack
iload 5 ; stacktop
aaload
iinc 5 1
aload_2 ; locals
aload 6
invokevirtual jode/bytecode/Instruction/getLocalSlot()I
aaload
invokevirtual jode/jvm/Value/setValue(Ljode/jvm/Value;)V
iconst_1
iand ; opcode & 1
ifne big_loop
iinc 5 1
goto big_loop
array_load_instr:
iinc 5 -1
aload_3
iload 5
iconst_m1
iadd
aaload
dup_x1
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/intValue()I
aload_start:
invokestatic java/lang/reflect/Array/get(Ljava/lang/Object;I)Ljava/lang/Object;
aload_end:
; Stack:
; element (of wrong type)
; opcode
; value (for result)
swap
bipush 51
if_icmplt set_object_big_loop
; Stack:
; element (of wrong type)
; value (for result)
dup
instanceof java/lang/Number
ifne number_convert
dup
instanceof java/lang/Character
ifne char_convert
boolean_convert:
checkcast java/lang/Boolean
invokevirtual java/lang/Boolean/booleanValue()Z
goto pack_integer
char_convert:
checkcast java/lang/Character
invokevirtual java/lang/Character/charValue()C
goto pack_integer
number_convert:
checkcast java/lang/Number
invokevirtual java/lang/Number/intValue()I
pack_integer:
new java/lang/Integer
dup_x1
swap
invokenonvirtual java/lang/Integer/<init>(I)V
set_object_big_loop:
invokevirtual jode/jvm/Value/setObject(Ljava/lang/Object;)V
goto big_loop
; ====== STORE INSTRUCTIONS
store_instr:
dup
bipush 79
if_icmpge array_store_instr
pop ; opcode
aload_2 ; locals
aload 6
invokevirtual jode/bytecode/Instruction/getLocalSlot()I
aaload
iinc 5 -1
aload_3 ; stack
iload 5 ; stacktop
aaload
invokevirtual jode/jvm/Value/setValue(Ljode/jvm/Value;)V
goto big_loop
array_store_instr:
istore 7
iinc 5 -2
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/intValue()I
; stack:
; index
aload_3
iload 5
iconst_1
iadd
aaload
; stack:
; store-value
; index
; swap
; dup_x1
; invokestatic java/lang/String/valueOf(I)Ljava/lang/String;
; getstatic java/lang/System/err Ljava/io/PrintStream;
; swap
; invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
; work around for mysterious bug in virtual machine XXX
astore 8
istore 6
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
dup
; stack:
; array
; store-value
; index
; array
instanceof [Z
ifne bool_array_store
iload 6
aload 8
iload 7
tableswitch 84
byte_array_store
char_array_store
short_array_store
default: normal_array_store
; stack:
; store-value
; index
; array
normal_array_store:
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
aastore_start:
invokestatic java/lang/reflect/Array/set(Ljava/lang/Object;ILjava/lang/Object;)V
aastore_end:
goto big_loop
bool_array_store:
iload 6
aload 8
invokevirtual jode/jvm/Value/intValue()I
zastore_start:
invokestatic java/lang/reflect/Array/setBoolean(Ljava/lang/Object;IZ)V
zastore_end:
goto big_loop
byte_array_store:
invokevirtual jode/jvm/Value/intValue()I
bastore_start:
invokestatic java/lang/reflect/Array/setByte(Ljava/lang/Object;IB)V
bastore_end:
goto big_loop
char_array_store:
invokevirtual jode/jvm/Value/intValue()I
castore_start:
invokestatic java/lang/reflect/Array/setChar(Ljava/lang/Object;IC)V
castore_end:
goto big_loop
short_array_store:
invokevirtual jode/jvm/Value/intValue()I
sastore_start:
invokestatic java/lang/reflect/Array/setShort(Ljava/lang/Object;IS)V
sastore_end:
goto big_loop
; =================
no_const_store_load_instr:
dup
bipush 96 ; opc_iadd
if_icmpge arith_instr
dup
bipush 92
if_icmpge dup2_swap_instr
dup
bipush 89
if_icmpge dup_instr
; ==== POP INSTRUCTION
bipush 86
isub ; pop count
ineg
iload 5 ; stacktop
iadd
istore 5 ; stacktop
goto big_loop
; ==== DUP INSTRUCTION
dup_instr:
bipush 88
isub ; dup depth+1
istore 7
aload_3
iload 5
aaload ; stack[stacktop]
iload 5
next_loop_dup1:
; Stack:
; stacktop-i
; stack[stacktop]
iinc 7 -1
dup
aload_3
swap
aaload
; Stack:
; stack[stacktop-i]
; stacktop-i
; stack[stacktop]
swap
iconst_1
isub
dup_x1
; Stack:
; stacktop-(i+1)
; stack[stacktop-i]
; stacktop-(i+1)
; stack[stacktop]
aload_3
swap
aaload
; Stack:
; stack[stacktop-(i+1)]
; stack[stacktop-i]
; stacktop-(i+1)
; stack[stacktop]
invokevirtual jode/jvm/Value/setValue(Ljode/jvm/Value;)V
iload 7
ifne next_loop_dup1
; Stack:
; stacktop-(depth+1)
; stack[stacktop]
aload_3
swap
aaload
swap
invokevirtual jode/jvm/Value/setValue(Ljode/jvm/Value;)V
iinc 5 1
goto big_loop
dup2_swap_instr:
dup
bipush 95 ; opc_swap
if_icmpne dup2_instr
; ==== SWAP INSTRUCTION
pop
aload_3
iload 5
iconst_1
isub
dup2
aaload
astore 7
; Stack:
; stacktop-1
; stack
dup2
iconst_1
isub
dup2_x2
; stacktop-2
; stack
; stacktop-1
; stack
; stacktop-2
; stack
aaload
aastore
aload 7
aastore
goto big_loop
; ==== DUP2 INSTRUCTION
dup2_instr:
bipush 90
isub ; dup depth+2
istore 7
aload_3
iload 5
dup2
aaload ; stack[stacktop]
astore 8
iconst_1
iadd
aaload ; stack[stacktop+1]
iload 5
next_loop_dup2:
; Stack:
; stacktop-i
; stack[stacktop+1]
iinc 7 -1
dup
aload_3
swap
iconst_1
iadd
aaload
; Stack:
; stack[stacktop-i+1]
; stacktop-i
; stack[stacktop+1]
swap
iconst_1
isub
dup_x1
; Stack:
; stacktop-i-1
; stack[stacktop-i+1]
; stacktop-i-1
; stack[stacktop+1]
aload_3
swap
aaload
; Stack:
; stack[stacktop-i-1]
; stack[stacktop-i]
; stacktop-i-1
; stack[stacktop+1]
invokevirtual jode/jvm/Value/setValue(Ljode/jvm/Value;)V
iload 7
ifne next_loop_dup2
; Stack:
; stacktop-depth-2
; stack[stacktop+1]
aload_3
swap
dup2
aaload
aload 8
; Stack:
; stack[stacktop]
; stack[stacktop-depth-2]
; stacktop-depth-2
; stack
; stack[stacktop+1]
invokevirtual jode/jvm/Value/setValue(Ljode/jvm/Value;)V
iconst_1
iadd
aaload
swap
invokevirtual jode/jvm/Value/setValue(Ljode/jvm/Value;)V
iinc 5 2
goto big_loop
; ========== ARITHMETICS
arith_instr:
dup
sipush 132 ; opc_iinc
if_icmpge convert_or_cmp_or_iinc_instr
dup
bipush 126 ; opc_iand
if_icmpge binary_op_instr
dup
bipush 116 ; opc_ineg
if_icmpge neg_or_shift_instr
dup
iconst_1
iand
ifeq binary_op_instr
iinc 5 -1 ; stacktop--;
binary_op_instr:
iinc 5 -1 ; stacktop--;
dup
iconst_1
iand
iconst_1
iadd ; long ? 2 : 1
aload_3
iload 5
dup2_x1
aaload
astore 7 ; local_7 = stack[stacktop]
isub
goto arith_do_instr
iinc_instr:
pop2
aload_2
aload 6
invokevirtual jode/bytecode/Instruction/getLocalSlot()I
aaload
dup
invokevirtual jode/jvm/Value/intValue()I
aload 6
invokevirtual jode/bytecode/Instruction/getIncrement()I
iadd
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
convert_or_cmp_or_iinc_instr:
dup
sipush 133
isub
dup
iflt iinc_instr
iconst_1
swap
ishl
dup
sipush 0x7FFF
iand
ifeq two_op_instr
aconst_null
goto second_op_done
two_op_instr:
iinc 5 -1 ; stacktop--;
ldc 0x30000
iand
iconst_2
swap
ifne second_op_single
iinc 5 -1
iconst_2
ishl
second_op_single:
aload_3
iload 5
aaload
second_op_done:
; Stack:
; second_op
; opcode mask
; opcode
astore 7
dup
sipush 0x0E38
iand
iinc 5 -1
ifeq first_op_single
iinc 5 -1
first_op_single:
; opcode mask
; opcode
sipush 0x05A5
iand
aload_3
iload 5
aaload
swap
iinc 5 1
ifeq result_single
iinc 5 1
result_single:
goto arith_do_instr_no_aaload
neg_or_shift_instr:
dup
bipush 120 ; opc_ishl
if_icmpge binary_op_instr
unary_instr:
aconst_null
astore 7
dup
iconst_1
iand
iconst_1
iadd ; long instr ? 2 : 1
ineg
iload 5
iadd
aload_3
swap
; Local:
; 7 == stack[op2] / null
; Stack:
; op/result1 stackindex
; stack
; opcode
arith_do_instr:
aaload
arith_do_instr_no_aaload:
dup_x1
swap
tableswitch 96
iadd_instr
ladd_instr
fadd_instr
dadd_instr
isub_instr
lsub_instr
fsub_instr
dsub_instr
imul_instr
lmul_instr
fmul_instr
dmul_instr
idiv_instr
ldiv_instr
fdiv_instr
ddiv_instr
irem_instr
lrem_instr
frem_instr
drem_instr
ineg_instr
fneg_instr
lneg_instr
dneg_instr
ishl_instr
lshl_instr
ishr_instr
lshr_instr
iushr_instr
lushr_instr
iand_instr
land_instr
ior_instr
lor_instr
ixor_instr
lxor_instr
lxor_instr ; opc_iinc
i2l_instr
i2f_instr
i2d_instr
l2i_instr
l2f_instr
l2d_instr
f2i_instr
f2l_instr
f2d_instr
d2i_instr
d2l_instr
d2f_instr
i2b_instr
i2c_instr
i2s_instr
lcmp_instr
fcmpl_instr
fcmpg_instr
dcmpl_instr
dcmpg_instr
default: iadd_instr
iadd_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
iadd
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
isub_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
isub
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
imul_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
imul
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
idiv_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
idiv_start:
idiv
idiv_end:
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
irem_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
irem_start:
irem
irem_end:
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
ineg_instr:
invokevirtual jode/jvm/Value/intValue()I
ineg
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
ishl_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
ishl
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
ishr_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
ishr
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
iushr_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
iushr
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
iand_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
iand
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
ior_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
ior
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
ixor_instr:
invokevirtual jode/jvm/Value/intValue()I
aload 7
invokevirtual jode/jvm/Value/intValue()I
ixor
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
ladd_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
ladd
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lsub_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
lsub
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lmul_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
lmul
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
ldiv_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
ldiv_start:
ldiv
ldiv_end:
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lrem_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
lrem_start:
lrem
lrem_end:
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lneg_instr:
invokevirtual jode/jvm/Value/longValue()J
lneg
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lshl_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/intValue()I
lshl
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lshr_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/intValue()I
lshr
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lushr_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/intValue()I
lushr
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
land_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
land
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lor_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
lor
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
lxor_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
lxor
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
fadd_instr:
invokevirtual jode/jvm/Value/floatValue()F
aload 7
invokevirtual jode/jvm/Value/floatValue()F
fadd
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
fsub_instr:
invokevirtual jode/jvm/Value/floatValue()F
aload 7
invokevirtual jode/jvm/Value/floatValue()F
fsub
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
fmul_instr:
invokevirtual jode/jvm/Value/floatValue()F
aload 7
invokevirtual jode/jvm/Value/floatValue()F
fmul
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
fdiv_instr:
invokevirtual jode/jvm/Value/floatValue()F
aload 7
invokevirtual jode/jvm/Value/floatValue()F
fdiv
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
frem_instr:
invokevirtual jode/jvm/Value/floatValue()F
aload 7
invokevirtual jode/jvm/Value/floatValue()F
frem
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
fneg_instr:
invokevirtual jode/jvm/Value/floatValue()F
fneg
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
dadd_instr:
invokevirtual jode/jvm/Value/doubleValue()D
aload 7
invokevirtual jode/jvm/Value/doubleValue()D
dadd
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
dsub_instr:
invokevirtual jode/jvm/Value/doubleValue()D
aload 7
invokevirtual jode/jvm/Value/doubleValue()D
dsub
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
dmul_instr:
invokevirtual jode/jvm/Value/doubleValue()D
aload 7
invokevirtual jode/jvm/Value/doubleValue()D
dmul
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
ddiv_instr:
invokevirtual jode/jvm/Value/doubleValue()D
aload 7
invokevirtual jode/jvm/Value/doubleValue()D
ddiv
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
drem_instr:
invokevirtual jode/jvm/Value/doubleValue()D
aload 7
invokevirtual jode/jvm/Value/doubleValue()D
drem
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
dneg_instr:
invokevirtual jode/jvm/Value/doubleValue()D
dneg
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
i2f_instr:
invokevirtual jode/jvm/Value/intValue()I
i2f
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
i2l_instr:
invokevirtual jode/jvm/Value/intValue()I
i2l
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
i2d_instr:
invokevirtual jode/jvm/Value/intValue()I
i2d
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
l2i_instr:
invokevirtual jode/jvm/Value/longValue()J
l2i
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
l2f_instr:
invokevirtual jode/jvm/Value/longValue()J
l2f
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
l2d_instr:
invokevirtual jode/jvm/Value/longValue()J
l2d
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
f2i_instr:
invokevirtual jode/jvm/Value/floatValue()F
f2i
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
f2l_instr:
invokevirtual jode/jvm/Value/floatValue()F
f2l
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
f2d_instr:
invokevirtual jode/jvm/Value/floatValue()F
f2d
invokevirtual jode/jvm/Value/setDouble(D)V
goto big_loop
d2i_instr:
invokevirtual jode/jvm/Value/doubleValue()D
d2i
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
d2f_instr:
invokevirtual jode/jvm/Value/doubleValue()D
d2f
invokevirtual jode/jvm/Value/setFloat(F)V
goto big_loop
d2l_instr:
invokevirtual jode/jvm/Value/doubleValue()D
d2l
invokevirtual jode/jvm/Value/setLong(J)V
goto big_loop
i2b_instr:
invokevirtual jode/jvm/Value/intValue()I
i2b
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
i2c_instr:
invokevirtual jode/jvm/Value/intValue()I
i2c
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
i2s_instr:
invokevirtual jode/jvm/Value/intValue()I
i2s
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
lcmp_instr:
invokevirtual jode/jvm/Value/longValue()J
aload 7
invokevirtual jode/jvm/Value/longValue()J
lcmp
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
fcmpl_instr:
invokevirtual jode/jvm/Value/floatValue()F
aload 7
invokevirtual jode/jvm/Value/floatValue()F
fcmpl
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
fcmpg_instr:
invokevirtual jode/jvm/Value/floatValue()F
aload 7
invokevirtual jode/jvm/Value/floatValue()F
fcmpg
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
dcmpl_instr:
invokevirtual jode/jvm/Value/doubleValue()D
aload 7
invokevirtual jode/jvm/Value/doubleValue()D
dcmpl
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
dcmpg_instr:
invokevirtual jode/jvm/Value/doubleValue()D
aload 7
invokevirtual jode/jvm/Value/doubleValue()D
dcmpg
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
; ============================================
; IF AND SPECIAL INSTR
; ============================================
if_or_special_instr:
dup
tableswitch 153
ifunary_instr
ifunary_instr
ifunary_instr
ifunary_instr
ifunary_instr
ifunary_instr
ifbinary_instr
ifbinary_instr
ifbinary_instr
ifbinary_instr
ifbinary_instr
ifbinary_instr
ifabinary_instr
ifabinary_instr
goto_instr
jsr_instr
ret_instr
illegal_instr
lookupswitch_instr
areturn_instr
lreturn_instr
areturn_instr
lreturn_instr
areturn_instr
return_instr
getstatic_instr
putstatic_instr
getfield_instr
putfield_instr
invoke_instr
invoke_instr
invokestatic_instr
invoke_instr
illegal_instr
new_instr
illegal_instr
illegal_instr
arraylength_instr
athrow_instr
checkcast_instr
instanceof_instr
monitorenter_instr
monitorexit_instr
illegal_instr
multianewarray_instr
ifaunary_instr
ifaunary_instr
default: illegal_instr
ifabinary_instr:
iconst_1
iadd
iconst_1
iand
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
goto ifacmp
ifaunary_instr:
iconst_1
iand
aconst_null
ifacmp:
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
if_acmpeq ifacmp_equal
ifeq big_loop
goto jump_succ
ifacmp_equal:
ifne big_loop
goto jump_succ
ifbinary_instr:
sipush 133 ; opc_if_icmple - 31
isub
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/intValue()I
goto ificmp
ifunary_instr:
bipush 127 ; opc_ifle - 31
isub
iconst_0
ificmp:
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/intValue()I
dup2
if_icmplt ificmp_greater ; Note, that operands are swapped
if_icmpeq ificmp_equal
ificmp_less:
bipush 0x19 ; ne,lt,le
goto ificmp_final
ificmp_equal:
bipush 0x25 ; eq,ge,le
goto ificmp_final
ificmp_greater:
pop2
bipush 0x16 ; ne,ge,gt
ificmp_final:
swap
ishl
ifge big_loop
jump_succ:
aload 6
invokevirtual jode/bytecode/Instruction/getSingleSucc()Ljode/bytecode/Instruction;
astore 4
goto big_loop
jsr_instr:
aload_3
iload 5
aaload
aload 6
invokevirtual jode/jvm/Value/setObject(Ljava/lang/Object;)V
iinc 5 1
goto_instr:
pop
goto jump_succ
ret_instr:
pop
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
checkcast jode/bytecode/Instruction
astore 4
goto big_loop
lookupswitch_instr:
pop
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/intValue()I
aload 6
invokevirtual jode/bytecode/Instruction/getValues()[I
iconst_0
; Stack:
; i
; objData
; value
lookup_loop:
dup2_x1
iaload
istore 7
dup_x2
iload 7
if_icmpeq lookup_found
iconst_1
iadd
dup2
swap
arraylength
if_icmplt lookup_loop
lookup_found:
; Stack:
; i
; objData
; value
istore 7
pop2
aload 6
invokevirtual jode/bytecode/Instruction/getSuccs()[Ljode/bytecode/Instruction;
iload 7
aaload
astore 4
goto big_loop
lreturn_instr:
iinc 5 -1
areturn_instr:
pop
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
areturn
return_instr:
pop
aconst_null
areturn
putfield_object:
pop
goto putfield_normal
putstatic_instr:
putfield_instr:
istore 7
aload_0
aload 6
invokevirtual jode/bytecode/Instruction/getReference()Ljode/bytecode/Reference;
dup
invokevirtual jode/bytecode/Reference/getType()Ljava/lang/String;
dup
invokevirtual java/lang/String/length()I
iconst_1
if_icmpne putfield_object
iconst_0
invokevirtual java/lang/String/charAt(I)C
dup
bipush 74 ; 'J'
if_icmpeq putfield_long
bipush 68 ; 'D'
if_icmpne putfield_normal
iconst_0
putfield_long:
iinc 5 -1
pop
; Stack:
; Reference
; env
putfield_normal:
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
; Stack:
; value
; Reference
; env
aconst_null
iload 7
sipush 179 ; opc_putstatic
if_icmpeq putfield_static
pop
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
dup
ifnull popLLLL_create_nullexc
putfield_static:
swap
invokeinterface jode/jvm/RuntimeEnvironment/putField(Ljode/bytecode/Reference;Ljava/lang/Object;Ljava/lang/Object;)V 4
goto big_loop
getstatic_instr:
pop
aload_3
iload 5
iinc 5 1
aaload
aconst_null
astore 7
goto getfield_do
getfield_instr:
pop
aload_3
iload 5
iconst_m1
iadd
aaload
dup
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
dup
ifnull popLL_create_nullexc
astore 7
getfield_do:
aload_0
aload 6
invokevirtual jode/bytecode/Instruction/getReference()Ljode/bytecode/Reference;
dup_x2
aload 7
getfield_start:
invokeinterface jode/jvm/RuntimeEnvironment/getField(Ljode/bytecode/Reference;Ljava/lang/Object;)Ljava/lang/Object; 3
getfield_end:
invokevirtual jode/jvm/Value/setObject(Ljava/lang/Object;)V
invokevirtual jode/bytecode/Reference/getType()Ljava/lang/String;
dup
invokevirtual java/lang/String/length()I
iconst_1
if_icmpne popL_big_loop
iconst_0
invokevirtual java/lang/String/charAt(I)C
dup
bipush 74 ; 'J'
if_icmpeq getfield_long
bipush 68 ; 'D'
if_icmpne big_loop
iconst_0
getfield_long:
pop
iinc 5 1
goto big_loop
invokestatic_instr:
invoke_instr:
istore 7
aload_0
aload 6
invokevirtual jode/bytecode/Instruction/getReference()Ljode/bytecode/Reference;
dup
invokevirtual jode/bytecode/Reference/getType()Ljava/lang/String;
invokestatic jode/type/Type/tType(Ljava/lang/String;)Ljode/type/Type;
checkcast jode/type/MethodType
; Stack:
; methodType
; ref
; env
dup_x2
; Stack:
; methodType
; ref
; env
; methodType
invokevirtual jode/type/MethodType/getParameterTypes()[Ljode/type/Type;
dup
arraylength
dup
anewarray java/lang/Object
dup_x2
pop
goto invoke_test
; Stack:
; i
; paramTypes
; args
; ref
; env
; methodType
invoke_loop:
; dup
; invokestatic java/lang/String/valueOf(I)Ljava/lang/String;
; getstatic java/lang/System/err Ljava/io/PrintStream;
; swap
; invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
dup2_x1
aaload
; paramTypes[i]
; args
; i
; paramTypes
; ref
; env
; methodType
invokevirtual jode/type/Type/stackSize()I
ineg
iload 5
iadd
istore 5
dup_x2
swap
dup_x1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
aastore
; Stack:
; i
; paramTypes
; args
; ref
; env
; methodType
invoke_test:
iconst_1
isub
dup
ifge invoke_loop
pop2
astore 6
dup
invokevirtual jode/bytecode/Reference/getName()Ljava/lang/String;
; Stack:
; name
; ref
; env
; methodType
; Locals:
; 6 = args
; 7 = opcode
ldc "<init>"
invokevirtual java/lang/String/equals(Ljava/lang/Object;)Z
ifeq invoke_normalmethod
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/getNewObject()Ljode/jvm/NewObject;
dup_x2
pop
aload 6
newinstance_start:
invokeinterface jode/jvm/RuntimeEnvironment/invokeConstructor(Ljode/bytecode/Reference;[Ljava/lang/Object;)Ljava/lang/Object; 3
newinstance_end:
invokevirtual jode/jvm/NewObject/setObject(Ljava/lang/Object;)V
popL_big_loop:
pop ; MethodType
goto big_loop
invoke_normalmethod:
iload 7
sipush 184 ; opc_invokestatic
if_icmpne invoke_nonstatic
iconst_0
aconst_null
goto invoke_do
invoke_nonstatic:
iconst_1
iload 7
sipush 183 ; opc_invokespecial
if_icmpne invoke_nonspecial
iconst_1
ixor
invoke_nonspecial:
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
dup
ifnull popLILLL_create_nullexc
invoke_do:
aload 6
invoke_start:
invokeinterface jode/jvm/RuntimeEnvironment/invokeMethod(Ljode/bytecode/Reference;ZLjava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; 5
invoke_end:
astore 6
; Stack:
; methodType
invokevirtual jode/type/MethodType/getReturnType()Ljode/type/Type;
invokevirtual jode/type/Type/stackSize()I
dup
ifeq popI_big_loop
aload_3
iload 5
dup_x1
aaload
aload 6
invokevirtual jode/jvm/Value/setObject(Ljava/lang/Object;)V
iadd
istore 5
goto big_loop
new_instr:
pop
aload_3
iload 5
aaload
new jode/jvm/NewObject
dup
aload 6
invokevirtual jode/bytecode/Instruction/getClazzType()Ljava/lang/String;
invokenonvirtual jode/jvm/NewObject/<init>(Ljava/lang/String;)V
invokevirtual jode/jvm/Value/setNewObject(Ljode/jvm/NewObject;)V
iinc 5 1
goto big_loop
arraylength_instr:
pop
aload_3
iload 5
iconst_m1
iadd
aaload
dup
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
arrlength_start:
invokestatic java/lang/reflect/Array/getLength(Ljava/lang/Object;)I
arrlength_end:
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
athrow_instr:
pop
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
dup
ifnull popL_create_nullexc
checkcast java/lang/Throwable
goto throw_exception
popLILLL_create_nullexc:
pop2
pop
goto popLL_create_nullexc
popLLLL_create_nullexc:
pop2
popLL_create_nullexc:
pop
popL_create_nullexc:
pop
create_nullexc:
new java/lang/NullPointerException
dup
invokenonvirtual java/lang/NullPointerException/<init>()V
goto throw_exception
checkcast_instr:
pop
aload_0
aload_3
iload 5
iconst_m1
iadd
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
dup
ifnull popLL_big_loop
aload 6
invokevirtual jode/bytecode/Instruction/getClazzType()Ljava/lang/String;
invokeinterface jode/jvm/RuntimeEnvironment/instanceOf(Ljava/lang/Object;Ljava/lang/String;)Z 3
ifne big_loop
new java/lang/ClassCastException
dup
invokenonvirtual java/lang/ClassCastException/<init>()V
goto throw_exception
popLL_big_loop:
pop2
goto big_loop
instanceof_instr:
pop
aload_0
aload_3
iload 5
iconst_m1
iadd
aaload
dup_x1
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
aload 6
invokevirtual jode/bytecode/Instruction/getClazzType()Ljava/lang/String;
invokeinterface jode/jvm/RuntimeEnvironment/instanceOf(Ljava/lang/Object;Ljava/lang/String;)Z 3
invokevirtual jode/jvm/Value/setInt(I)V
goto big_loop
monitorenter_instr:
pop
aload_0
aload_3
iinc 5 -1
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
invokeinterface jode/jvm/RuntimeEnvironment/enterMonitor(Ljava/lang/Object;)V 2
goto big_loop
monitorexit_instr:
pop
aload_0
aload_3
iinc 5 -1
iload 5
aaload
invokevirtual jode/jvm/Value/objectValue()Ljava/lang/Object;
invokeinterface jode/jvm/RuntimeEnvironment/exitMonitor(Ljava/lang/Object;)V 2
goto big_loop
multianewarray_instr:
pop
aload 6
invokevirtual jode/bytecode/Instruction/getDimensions()I
dup
istore 7
newarray int
goto newarray_test
newarray_loop:
dup
iload 7
iinc 5 -1
aload_3
iload 5
aaload
invokevirtual jode/jvm/Value/intValue()I
iastore
newarray_test:
iinc 7 -1
iload 7
ifge newarray_loop
astore 7
aload_3
iload 5
aaload
iinc 5 1
aload_0
aload 6
invokevirtual jode/bytecode/Instruction/getClazzType()Ljava/lang/String;
aload 7
newarray_start:
invokeinterface jode/jvm/RuntimeEnvironment/newArray(Ljava/lang/String;[I)Ljava/lang/Object; 3
newarray_end:
invokevirtual jode/jvm/Value/setObject(Ljava/lang/Object;)V
goto big_loop
wrapexception_handler:
goto throw_exception
throw_exception:
aconst_null
astore 6
goto handle_exception
invocationtarget_handler:
dup
astore 6
invokevirtual java/lang/reflect/InvocationTargetException/getTargetException()Ljava/lang/Throwable;
handle_exception:
astore 8
aload_1
invokevirtual jode/bytecode/BytecodeInfo/getExceptionHandlers()[Ljode/bytecode/Handler;
dup
arraylength
dup
ifeq nohandlers
istore 7
aload 4
invokevirtual jode/bytecode/Instruction/getAddr()I
istore 4
iconst_0
; Stack:
; index
; handlers
handler_loop:
dup2
aaload
dup
getfield jode/bytecode/Handler/start Ljode/bytecode/Instruction;
invokevirtual jode/bytecode/Instruction/getAddr()I
iload 4
if_icmplt wrong_handler_pop
dup
getfield jode/bytecode/Handler/end Ljode/bytecode/Instruction;
invokevirtual jode/bytecode/Instruction/getAddr()I
iload 4
if_icmplt wrong_handler_pop
dup
getfield jode/bytecode/Handler/type Ljava/lang/String;
aload_0
swap
aload 8
swap
invokeinterface jode/jvm/RuntimeEnvironment/instanceOf(Ljava/lang/Object;Ljava/lang/String;)Z 3
ifne wrong_handler_pop
getfield jode/bytecode/Handler/catcher Ljode/bytecode/Instruction;
astore 4
pop2
iconst_1
istore 5
aload_3
iconst_0
aaload
aload 8
invokevirtual jode/jvm/Value/setObject(Ljava/lang/Object;)V
goto big_loop
wrong_handler_pop:
pop
iconst_1
iadd
dup
iload 7
if_icmplt handler_loop
nohandlers:
pop2
aload 6
ifnull wrap_exc
aload 6
athrow
wrap_exc:
new java/lang/reflect/InvocationTargetException
dup
aload 8
invokenonvirtual java/lang/reflect/InvocationTargetException/<init>(Ljava/lang/Throwable;)V
athrow
.end method