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.
1901 lines
36 KiB
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
|
|
|