mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 22:25:30 +00:00
1134 lines
57 KiB
C++
1134 lines
57 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#include "JavaBytecodes.h"
|
|
#include "MemoryAccess.h"
|
|
#include "ConstantPool.h"
|
|
#include "Attributes.h"
|
|
#include "DebugUtils.h"
|
|
|
|
// Kinds and sizes of normal bytecodes
|
|
const BytecodeControlInfo normalBytecodeControlInfos[256] =
|
|
{
|
|
{BytecodeControlInfo::bckNormal, 1}, // 00 nop
|
|
{BytecodeControlInfo::bckNormal, 1}, // 01 aconst_null
|
|
{BytecodeControlInfo::bckNormal, 1}, // 02 iconst_m1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 03 iconst_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 04 iconst_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 05 iconst_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 06 iconst_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 07 iconst_4
|
|
{BytecodeControlInfo::bckNormal, 1}, // 08 iconst_5
|
|
{BytecodeControlInfo::bckNormal, 1}, // 09 lconst_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 0A lconst_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 0B fconst_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 0C fconst_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 0D fconst_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 0E dconst_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 0F dconst_1
|
|
{BytecodeControlInfo::bckNormal, 2}, // 10 cc bipush c
|
|
{BytecodeControlInfo::bckNormal, 3}, // 11 cccc sipush c
|
|
{BytecodeControlInfo::bckNormal, 2}, // 12 ii ldc i
|
|
{BytecodeControlInfo::bckNormal, 3}, // 13 iiii ldc_w i
|
|
{BytecodeControlInfo::bckNormal, 3}, // 14 iiii ldc2_w i
|
|
{BytecodeControlInfo::bckNormal, 2}, // 15 vv iload v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 16 vv lload v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 17 vv fload v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 18 vv dload v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 19 vv aload v
|
|
{BytecodeControlInfo::bckNormal, 1}, // 1A iload_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 1B iload_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 1C iload_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 1D iload_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 1E lload_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 1F lload_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 20 lload_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 21 lload_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 22 fload_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 23 fload_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 24 fload_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 25 fload_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 26 dload_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 27 dload_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 28 dload_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 29 dload_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 2A aload_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 2B aload_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 2C aload_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 2D aload_3
|
|
{BytecodeControlInfo::bckExc, 1}, // 2E iaload
|
|
{BytecodeControlInfo::bckExc, 1}, // 2F laload
|
|
{BytecodeControlInfo::bckExc, 1}, // 30 faload
|
|
{BytecodeControlInfo::bckExc, 1}, // 31 daload
|
|
{BytecodeControlInfo::bckExc, 1}, // 32 aaload
|
|
{BytecodeControlInfo::bckExc, 1}, // 33 baload
|
|
{BytecodeControlInfo::bckExc, 1}, // 34 caload
|
|
{BytecodeControlInfo::bckExc, 1}, // 35 saload
|
|
{BytecodeControlInfo::bckNormal, 2}, // 36 vv istore v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 37 vv lstore v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 38 vv fstore v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 39 vv dstore v
|
|
{BytecodeControlInfo::bckNormal, 2}, // 3A vv astore v
|
|
{BytecodeControlInfo::bckNormal, 1}, // 3B istore_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 3C istore_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 3D istore_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 3E istore_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 3F lstore_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 40 lstore_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 41 lstore_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 42 lstore_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 43 fstore_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 44 fstore_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 45 fstore_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 46 fstore_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 47 dstore_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 48 dstore_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 49 dstore_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 4A dstore_3
|
|
{BytecodeControlInfo::bckNormal, 1}, // 4B astore_0
|
|
{BytecodeControlInfo::bckNormal, 1}, // 4C astore_1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 4D astore_2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 4E astore_3
|
|
{BytecodeControlInfo::bckExc, 1}, // 4F iastore
|
|
{BytecodeControlInfo::bckExc, 1}, // 50 lastore
|
|
{BytecodeControlInfo::bckExc, 1}, // 51 fastore
|
|
{BytecodeControlInfo::bckExc, 1}, // 52 dastore
|
|
{BytecodeControlInfo::bckExc, 1}, // 53 aastore
|
|
{BytecodeControlInfo::bckExc, 1}, // 54 bastore
|
|
{BytecodeControlInfo::bckExc, 1}, // 55 castore
|
|
{BytecodeControlInfo::bckExc, 1}, // 56 sastore
|
|
{BytecodeControlInfo::bckNormal, 1}, // 57 pop
|
|
{BytecodeControlInfo::bckNormal, 1}, // 58 pop2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 59 dup
|
|
{BytecodeControlInfo::bckNormal, 1}, // 5A dup_x1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 5B dup_x2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 5C dup2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 5D dup2_x1
|
|
{BytecodeControlInfo::bckNormal, 1}, // 5E dup2_x2
|
|
{BytecodeControlInfo::bckNormal, 1}, // 5F swap
|
|
{BytecodeControlInfo::bckNormal, 1}, // 60 iadd
|
|
{BytecodeControlInfo::bckNormal, 1}, // 61 ladd
|
|
{BytecodeControlInfo::bckNormal, 1}, // 62 fadd
|
|
{BytecodeControlInfo::bckNormal, 1}, // 63 dadd
|
|
{BytecodeControlInfo::bckNormal, 1}, // 64 isub
|
|
{BytecodeControlInfo::bckNormal, 1}, // 65 lsub
|
|
{BytecodeControlInfo::bckNormal, 1}, // 66 fsub
|
|
{BytecodeControlInfo::bckNormal, 1}, // 67 dsub
|
|
{BytecodeControlInfo::bckNormal, 1}, // 68 imul
|
|
{BytecodeControlInfo::bckNormal, 1}, // 69 lmul
|
|
{BytecodeControlInfo::bckNormal, 1}, // 6A fmul
|
|
{BytecodeControlInfo::bckNormal, 1}, // 6B dmul
|
|
{BytecodeControlInfo::bckExc, 1}, // 6C idiv
|
|
{BytecodeControlInfo::bckExc, 1}, // 6D ldiv
|
|
{BytecodeControlInfo::bckNormal, 1}, // 6E fdiv
|
|
{BytecodeControlInfo::bckNormal, 1}, // 6F ddiv
|
|
{BytecodeControlInfo::bckExc, 1}, // 70 irem
|
|
{BytecodeControlInfo::bckExc, 1}, // 71 lrem
|
|
{BytecodeControlInfo::bckNormal, 1}, // 72 frem
|
|
{BytecodeControlInfo::bckNormal, 1}, // 73 drem
|
|
{BytecodeControlInfo::bckNormal, 1}, // 74 ineg
|
|
{BytecodeControlInfo::bckNormal, 1}, // 75 lneg
|
|
{BytecodeControlInfo::bckNormal, 1}, // 76 fneg
|
|
{BytecodeControlInfo::bckNormal, 1}, // 77 dneg
|
|
{BytecodeControlInfo::bckNormal, 1}, // 78 ishl
|
|
{BytecodeControlInfo::bckNormal, 1}, // 79 lshl
|
|
{BytecodeControlInfo::bckNormal, 1}, // 7A ishr
|
|
{BytecodeControlInfo::bckNormal, 1}, // 7B lshr
|
|
{BytecodeControlInfo::bckNormal, 1}, // 7C iushr
|
|
{BytecodeControlInfo::bckNormal, 1}, // 7D lushr
|
|
{BytecodeControlInfo::bckNormal, 1}, // 7E iand
|
|
{BytecodeControlInfo::bckNormal, 1}, // 7F land
|
|
{BytecodeControlInfo::bckNormal, 1}, // 80 ior
|
|
{BytecodeControlInfo::bckNormal, 1}, // 81 lor
|
|
{BytecodeControlInfo::bckNormal, 1}, // 82 ixor
|
|
{BytecodeControlInfo::bckNormal, 1}, // 83 lxor
|
|
{BytecodeControlInfo::bckNormal, 3}, // 84 vv cc iinc v,c
|
|
{BytecodeControlInfo::bckNormal, 1}, // 85 i2l
|
|
{BytecodeControlInfo::bckNormal, 1}, // 86 i2f
|
|
{BytecodeControlInfo::bckNormal, 1}, // 87 i2d
|
|
{BytecodeControlInfo::bckNormal, 1}, // 88 l2i
|
|
{BytecodeControlInfo::bckNormal, 1}, // 89 l2f
|
|
{BytecodeControlInfo::bckNormal, 1}, // 8A l2d
|
|
{BytecodeControlInfo::bckNormal, 1}, // 8B f2i
|
|
{BytecodeControlInfo::bckNormal, 1}, // 8C f2l
|
|
{BytecodeControlInfo::bckNormal, 1}, // 8D f2d
|
|
{BytecodeControlInfo::bckNormal, 1}, // 8E d2i
|
|
{BytecodeControlInfo::bckNormal, 1}, // 8F d2l
|
|
{BytecodeControlInfo::bckNormal, 1}, // 90 d2f
|
|
{BytecodeControlInfo::bckNormal, 1}, // 91 i2b
|
|
{BytecodeControlInfo::bckNormal, 1}, // 92 i2c
|
|
{BytecodeControlInfo::bckNormal, 1}, // 93 i2s
|
|
{BytecodeControlInfo::bckNormal, 1}, // 94 lcmp
|
|
{BytecodeControlInfo::bckNormal, 1}, // 95 fcmpl
|
|
{BytecodeControlInfo::bckNormal, 1}, // 96 fcmpg
|
|
{BytecodeControlInfo::bckNormal, 1}, // 97 dcmpl
|
|
{BytecodeControlInfo::bckNormal, 1}, // 98 dcmpg
|
|
{BytecodeControlInfo::bckIf, 3}, // 99 dddd ifeq
|
|
{BytecodeControlInfo::bckIf, 3}, // 9A dddd ifne
|
|
{BytecodeControlInfo::bckIf, 3}, // 9B dddd iflt
|
|
{BytecodeControlInfo::bckIf, 3}, // 9C dddd ifge
|
|
{BytecodeControlInfo::bckIf, 3}, // 9D dddd ifgt
|
|
{BytecodeControlInfo::bckIf, 3}, // 9E dddd ifle
|
|
{BytecodeControlInfo::bckIf, 3}, // 9F dddd if_icmpeq
|
|
{BytecodeControlInfo::bckIf, 3}, // A0 dddd if_icmpne
|
|
{BytecodeControlInfo::bckIf, 3}, // A1 dddd if_icmplt
|
|
{BytecodeControlInfo::bckIf, 3}, // A2 dddd if_icmpge
|
|
{BytecodeControlInfo::bckIf, 3}, // A3 dddd if_icmpgt
|
|
{BytecodeControlInfo::bckIf, 3}, // A4 dddd if_icmple
|
|
{BytecodeControlInfo::bckIf, 3}, // A5 dddd if_acmpeq
|
|
{BytecodeControlInfo::bckIf, 3}, // A6 dddd if_acmpne
|
|
{BytecodeControlInfo::bckGoto, 3}, // A7 dddd goto
|
|
{BytecodeControlInfo::bckJsr, 3}, // A8 dddd jsr
|
|
{BytecodeControlInfo::bckRet, 2}, // A9 vv ret v
|
|
{BytecodeControlInfo::bckTableSwitch, 1}, // AA ... tableswitch
|
|
{BytecodeControlInfo::bckLookupSwitch, 1}, // AB ... lookupswitch
|
|
{BytecodeControlInfo::bckReturn, 1}, // AC ireturn
|
|
{BytecodeControlInfo::bckReturn, 1}, // AD lreturn
|
|
{BytecodeControlInfo::bckReturn, 1}, // AE freturn
|
|
{BytecodeControlInfo::bckReturn, 1}, // AF dreturn
|
|
{BytecodeControlInfo::bckReturn, 1}, // B0 areturn
|
|
{BytecodeControlInfo::bckReturn, 1}, // B1 return
|
|
{BytecodeControlInfo::bckNormal, 3}, // B2 iiii getstatic
|
|
{BytecodeControlInfo::bckNormal, 3}, // B3 iiii putstatic
|
|
{BytecodeControlInfo::bckExc, 3}, // B4 iiii getfield
|
|
{BytecodeControlInfo::bckExc, 3}, // B5 iiii putfield
|
|
{BytecodeControlInfo::bckExc, 3}, // B6 iiii invokevirtual
|
|
{BytecodeControlInfo::bckExc, 3}, // B7 iiii invokespecial
|
|
{BytecodeControlInfo::bckExc, 3}, // B8 iiii invokestatic
|
|
{BytecodeControlInfo::bckExc, 5}, // B9 iiii nn00 invokeinterface
|
|
{BytecodeControlInfo::bckIllegal, 1}, // BA unused
|
|
{BytecodeControlInfo::bckExc, 3}, // BB iiii new
|
|
{BytecodeControlInfo::bckExc, 2}, // BC tt newarray
|
|
{BytecodeControlInfo::bckExc, 3}, // BD iiii anewarray
|
|
{BytecodeControlInfo::bckExc, 1}, // BE arraylength
|
|
{BytecodeControlInfo::bckThrow, 1}, // BF athrow
|
|
{BytecodeControlInfo::bckExc, 3}, // C0 iiii checkcast
|
|
{BytecodeControlInfo::bckNormal, 3}, // C1 iiii instanceof
|
|
{BytecodeControlInfo::bckExc, 1}, // C2 monitorenter
|
|
{BytecodeControlInfo::bckExc, 1}, // C3 monitorexit
|
|
{BytecodeControlInfo::bckNormal, 0}, // C4 ... wide
|
|
{BytecodeControlInfo::bckExc, 4}, // C5 iiii nn multianewarray
|
|
{BytecodeControlInfo::bckIf, 3}, // C6 dddd ifnull
|
|
{BytecodeControlInfo::bckIf, 3}, // C7 dddd ifnonnull
|
|
{BytecodeControlInfo::bckGoto_W, 5}, // C8 dddddddd goto_w
|
|
{BytecodeControlInfo::bckJsr_W, 5}, // C9 dddddddd jsr_w
|
|
{BytecodeControlInfo::bckExc, 1}, // CA breakpoint
|
|
{BytecodeControlInfo::bckIllegal, 1}, // CB unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // CC unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // CD unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // CE unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // CF unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D0 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D1 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D2 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D3 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D4 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D5 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D6 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D7 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D8 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // D9 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // DA unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // DB unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // DC unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // DD unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // DE unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // DF unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E0 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E1 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E2 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E3 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E4 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E5 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E6 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E7 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E8 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // E9 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // EA unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // EB unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // EC unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // ED unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // EE unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // EF unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F0 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F1 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F2 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F3 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F4 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F5 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F6 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F7 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F8 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // F9 unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // FA unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // FB unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // FC unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // FD unused
|
|
{BytecodeControlInfo::bckIllegal, 1}, // FE unused
|
|
{BytecodeControlInfo::bckIllegal, 1} // FF unused
|
|
};
|
|
|
|
// Kinds and sizes of wide bytecodes
|
|
const BytecodeControlInfo wideBytecodeControlInfos[256] =
|
|
{
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 00 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 01 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 02 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 03 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 04 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 05 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 06 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 07 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 08 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 09 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 0A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 0B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 0C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 0D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 0E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 0F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 10 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 11 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 12 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 13 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 14 wide unused
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 15 vvvv wide iload v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 16 vvvv wide lload v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 17 vvvv wide fload v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 18 vvvv wide dload v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 19 vvvv wide aload v
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 1A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 1B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 1C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 1D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 1E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 1F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 20 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 21 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 22 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 23 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 24 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 25 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 26 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 27 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 28 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 29 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 2A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 2B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 2C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 2D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 2E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 2F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 30 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 31 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 32 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 33 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 34 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 35 wide unused
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 36 vvvv wide istore v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 37 vvvv wide lstore v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 38 vvvv wide fstore v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 39 vvvv wide dstore v
|
|
{BytecodeControlInfo::bckNormal, 4}, // C4 3A vvvv wide astore v
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 3B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 3C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 3D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 3E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 3F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 40 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 41 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 42 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 43 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 44 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 45 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 46 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 47 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 48 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 49 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 4A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 4B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 4C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 4D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 4E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 4F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 50 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 51 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 52 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 53 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 54 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 55 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 56 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 57 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 58 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 59 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 5A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 5B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 5C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 5D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 5E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 5F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 60 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 61 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 62 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 63 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 64 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 65 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 66 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 67 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 68 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 69 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 6A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 6B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 6C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 6D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 6E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 6F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 70 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 71 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 72 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 73 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 74 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 75 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 76 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 77 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 78 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 79 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 7A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 7B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 7C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 7D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 7E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 7F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 80 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 81 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 82 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 83 wide unused
|
|
{BytecodeControlInfo::bckNormal, 6}, // C4 84 vvvv cccc wide iinc v,c
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 85 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 86 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 87 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 88 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 89 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 8A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 8B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 8C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 8D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 8E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 8F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 90 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 91 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 92 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 93 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 94 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 95 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 96 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 97 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 98 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 99 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 9A wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 9B wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 9C wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 9D wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 9E wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 9F wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A0 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A1 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A2 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A3 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A4 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A5 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A6 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A7 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 A8 wide unused
|
|
{BytecodeControlInfo::bckRet_W, 4}, // C4 A9 vvvv wide ret v
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 AA wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 AB wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 AC wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 AD wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 AE wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 AF wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B0 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B1 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B2 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B3 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B4 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B5 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B6 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B7 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B8 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 B9 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 BA wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 BB wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 BC wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 BD wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 BE wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 BF wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C0 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C1 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C2 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C3 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C4 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C5 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C6 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C7 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C8 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 C9 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 CA wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 CB wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 CC wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 CD wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 CE wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 CF wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D0 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D1 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D2 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D3 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D4 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D5 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D6 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D7 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D8 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 D9 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 DA wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 DB wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 DC wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 DD wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 DE wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 DF wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E0 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E1 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E2 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E3 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E4 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E5 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E6 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E7 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E8 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 E9 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 EA wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 EB wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 EC wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 ED wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 EE wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 EF wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F0 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F1 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F2 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F3 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F4 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F5 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F6 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F7 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F8 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 F9 wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 FA wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 FB wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 FC wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 FD wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2}, // C4 FE wide unused
|
|
{BytecodeControlInfo::bckIllegal, 2} // C4 FF wide unused
|
|
};
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
#ifdef DEBUG_LOG
|
|
struct BytecodeDisasmInfo
|
|
{
|
|
enum ArgFormat // Formats of arguments
|
|
{
|
|
afNone, // No arguments
|
|
afSByte, // One signed byte
|
|
afSHalf, // One signed halfword
|
|
afByteConstIndex, // One unsigned byte constant table index
|
|
afHalfConstIndex, // One unsigned halfword constant table index
|
|
afVar, // One unsigned byte (or halfword if wide) local variable index
|
|
afIInc, // Arguments for iinc or wide iinc
|
|
afDisp, // One signed halfword branch displacement
|
|
afWideDisp, // One signed word branch displacement
|
|
afTableSwitch, // Arguments for tableswitch
|
|
afLookupSwitch, // Arguments for lookupswitch
|
|
afInvokeInterface, // Arguments for invokeinterface
|
|
afNewArray, // Argument for newarray
|
|
afMultiANewArray, // Argument for multianewarray
|
|
afWide, // Wide instruction prefix
|
|
afIllegal // Any bytecode that's not defined by the Java spec
|
|
};
|
|
|
|
ArgFormat format; // Kind of bytecode
|
|
char name[16]; // Name of bytecode
|
|
};
|
|
|
|
|
|
// Disassembly table for normal bytecodes
|
|
static BytecodeDisasmInfo bytecodeDisasmInfos[256] =
|
|
{
|
|
{BytecodeDisasmInfo::afNone, "nop"}, // 00 nop
|
|
{BytecodeDisasmInfo::afNone, "aconst_null"}, // 01 aconst_null
|
|
{BytecodeDisasmInfo::afNone, "iconst_m1"}, // 02 iconst_m1
|
|
{BytecodeDisasmInfo::afNone, "iconst_0"}, // 03 iconst_0
|
|
{BytecodeDisasmInfo::afNone, "iconst_1"}, // 04 iconst_1
|
|
{BytecodeDisasmInfo::afNone, "iconst_2"}, // 05 iconst_2
|
|
{BytecodeDisasmInfo::afNone, "iconst_3"}, // 06 iconst_3
|
|
{BytecodeDisasmInfo::afNone, "iconst_4"}, // 07 iconst_4
|
|
{BytecodeDisasmInfo::afNone, "iconst_5"}, // 08 iconst_5
|
|
{BytecodeDisasmInfo::afNone, "lconst_0"}, // 09 lconst_0
|
|
{BytecodeDisasmInfo::afNone, "lconst_1"}, // 0A lconst_1
|
|
{BytecodeDisasmInfo::afNone, "fconst_0"}, // 0B fconst_0
|
|
{BytecodeDisasmInfo::afNone, "fconst_1"}, // 0C fconst_1
|
|
{BytecodeDisasmInfo::afNone, "fconst_2"}, // 0D fconst_2
|
|
{BytecodeDisasmInfo::afNone, "dconst_0"}, // 0E dconst_0
|
|
{BytecodeDisasmInfo::afNone, "dconst_1"}, // 0F dconst_1
|
|
{BytecodeDisasmInfo::afSByte, "bipush"}, // 10 cc bipush c
|
|
{BytecodeDisasmInfo::afSHalf, "sipush"}, // 11 cccc sipush c
|
|
{BytecodeDisasmInfo::afByteConstIndex, "ldc"}, // 12 ii ldc i
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "ldc_w"}, // 13 iiii ldc_w i
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "ldc2_w"}, // 14 iiii ldc2_w i
|
|
{BytecodeDisasmInfo::afVar, "iload"}, // 15 vv iload v
|
|
{BytecodeDisasmInfo::afVar, "lload"}, // 16 vv lload v
|
|
{BytecodeDisasmInfo::afVar, "fload"}, // 17 vv fload v
|
|
{BytecodeDisasmInfo::afVar, "dload"}, // 18 vv dload v
|
|
{BytecodeDisasmInfo::afVar, "aload"}, // 19 vv aload v
|
|
{BytecodeDisasmInfo::afNone, "iload_0"}, // 1A iload_0
|
|
{BytecodeDisasmInfo::afNone, "iload_1"}, // 1B iload_1
|
|
{BytecodeDisasmInfo::afNone, "iload_2"}, // 1C iload_2
|
|
{BytecodeDisasmInfo::afNone, "iload_3"}, // 1D iload_3
|
|
{BytecodeDisasmInfo::afNone, "lload_0"}, // 1E lload_0
|
|
{BytecodeDisasmInfo::afNone, "lload_1"}, // 1F lload_1
|
|
{BytecodeDisasmInfo::afNone, "lload_2"}, // 20 lload_2
|
|
{BytecodeDisasmInfo::afNone, "lload_3"}, // 21 lload_3
|
|
{BytecodeDisasmInfo::afNone, "fload_0"}, // 22 fload_0
|
|
{BytecodeDisasmInfo::afNone, "fload_1"}, // 23 fload_1
|
|
{BytecodeDisasmInfo::afNone, "fload_2"}, // 24 fload_2
|
|
{BytecodeDisasmInfo::afNone, "fload_3"}, // 25 fload_3
|
|
{BytecodeDisasmInfo::afNone, "dload_0"}, // 26 dload_0
|
|
{BytecodeDisasmInfo::afNone, "dload_1"}, // 27 dload_1
|
|
{BytecodeDisasmInfo::afNone, "dload_2"}, // 28 dload_2
|
|
{BytecodeDisasmInfo::afNone, "dload_3"}, // 29 dload_3
|
|
{BytecodeDisasmInfo::afNone, "aload_0"}, // 2A aload_0
|
|
{BytecodeDisasmInfo::afNone, "aload_1"}, // 2B aload_1
|
|
{BytecodeDisasmInfo::afNone, "aload_2"}, // 2C aload_2
|
|
{BytecodeDisasmInfo::afNone, "aload_3"}, // 2D aload_3
|
|
{BytecodeDisasmInfo::afNone, "iaload"}, // 2E iaload
|
|
{BytecodeDisasmInfo::afNone, "laload"}, // 2F laload
|
|
{BytecodeDisasmInfo::afNone, "faload"}, // 30 faload
|
|
{BytecodeDisasmInfo::afNone, "daload"}, // 31 daload
|
|
{BytecodeDisasmInfo::afNone, "aaload"}, // 32 aaload
|
|
{BytecodeDisasmInfo::afNone, "baload"}, // 33 baload
|
|
{BytecodeDisasmInfo::afNone, "caload"}, // 34 caload
|
|
{BytecodeDisasmInfo::afNone, "saload"}, // 35 saload
|
|
{BytecodeDisasmInfo::afVar, "istore"}, // 36 vv istore v
|
|
{BytecodeDisasmInfo::afVar, "lstore"}, // 37 vv lstore v
|
|
{BytecodeDisasmInfo::afVar, "fstore"}, // 38 vv fstore v
|
|
{BytecodeDisasmInfo::afVar, "dstore"}, // 39 vv dstore v
|
|
{BytecodeDisasmInfo::afVar, "astore"}, // 3A vv astore v
|
|
{BytecodeDisasmInfo::afNone, "istore_0"}, // 3B istore_0
|
|
{BytecodeDisasmInfo::afNone, "istore_1"}, // 3C istore_1
|
|
{BytecodeDisasmInfo::afNone, "istore_2"}, // 3D istore_2
|
|
{BytecodeDisasmInfo::afNone, "istore_3"}, // 3E istore_3
|
|
{BytecodeDisasmInfo::afNone, "lstore_0"}, // 3F lstore_0
|
|
{BytecodeDisasmInfo::afNone, "lstore_1"}, // 40 lstore_1
|
|
{BytecodeDisasmInfo::afNone, "lstore_2"}, // 41 lstore_2
|
|
{BytecodeDisasmInfo::afNone, "lstore_3"}, // 42 lstore_3
|
|
{BytecodeDisasmInfo::afNone, "fstore_0"}, // 43 fstore_0
|
|
{BytecodeDisasmInfo::afNone, "fstore_1"}, // 44 fstore_1
|
|
{BytecodeDisasmInfo::afNone, "fstore_2"}, // 45 fstore_2
|
|
{BytecodeDisasmInfo::afNone, "fstore_3"}, // 46 fstore_3
|
|
{BytecodeDisasmInfo::afNone, "dstore_0"}, // 47 dstore_0
|
|
{BytecodeDisasmInfo::afNone, "dstore_1"}, // 48 dstore_1
|
|
{BytecodeDisasmInfo::afNone, "dstore_2"}, // 49 dstore_2
|
|
{BytecodeDisasmInfo::afNone, "dstore_3"}, // 4A dstore_3
|
|
{BytecodeDisasmInfo::afNone, "astore_0"}, // 4B astore_0
|
|
{BytecodeDisasmInfo::afNone, "astore_1"}, // 4C astore_1
|
|
{BytecodeDisasmInfo::afNone, "astore_2"}, // 4D astore_2
|
|
{BytecodeDisasmInfo::afNone, "astore_3"}, // 4E astore_3
|
|
{BytecodeDisasmInfo::afNone, "iastore"}, // 4F iastore
|
|
{BytecodeDisasmInfo::afNone, "lastore"}, // 50 lastore
|
|
{BytecodeDisasmInfo::afNone, "fastore"}, // 51 fastore
|
|
{BytecodeDisasmInfo::afNone, "dastore"}, // 52 dastore
|
|
{BytecodeDisasmInfo::afNone, "aastore"}, // 53 aastore
|
|
{BytecodeDisasmInfo::afNone, "bastore"}, // 54 bastore
|
|
{BytecodeDisasmInfo::afNone, "castore"}, // 55 castore
|
|
{BytecodeDisasmInfo::afNone, "sastore"}, // 56 sastore
|
|
{BytecodeDisasmInfo::afNone, "pop"}, // 57 pop
|
|
{BytecodeDisasmInfo::afNone, "pop2"}, // 58 pop2
|
|
{BytecodeDisasmInfo::afNone, "dup"}, // 59 dup
|
|
{BytecodeDisasmInfo::afNone, "dup_x1"}, // 5A dup_x1
|
|
{BytecodeDisasmInfo::afNone, "dup_x2"}, // 5B dup_x2
|
|
{BytecodeDisasmInfo::afNone, "dup2"}, // 5C dup2
|
|
{BytecodeDisasmInfo::afNone, "dup2_x1"}, // 5D dup2_x1
|
|
{BytecodeDisasmInfo::afNone, "dup2_x2"}, // 5E dup2_x2
|
|
{BytecodeDisasmInfo::afNone, "swap"}, // 5F swap
|
|
{BytecodeDisasmInfo::afNone, "iadd"}, // 60 iadd
|
|
{BytecodeDisasmInfo::afNone, "ladd"}, // 61 ladd
|
|
{BytecodeDisasmInfo::afNone, "fadd"}, // 62 fadd
|
|
{BytecodeDisasmInfo::afNone, "dadd"}, // 63 dadd
|
|
{BytecodeDisasmInfo::afNone, "isub"}, // 64 isub
|
|
{BytecodeDisasmInfo::afNone, "lsub"}, // 65 lsub
|
|
{BytecodeDisasmInfo::afNone, "fsub"}, // 66 fsub
|
|
{BytecodeDisasmInfo::afNone, "dsub"}, // 67 dsub
|
|
{BytecodeDisasmInfo::afNone, "imul"}, // 68 imul
|
|
{BytecodeDisasmInfo::afNone, "lmul"}, // 69 lmul
|
|
{BytecodeDisasmInfo::afNone, "fmul"}, // 6A fmul
|
|
{BytecodeDisasmInfo::afNone, "dmul"}, // 6B dmul
|
|
{BytecodeDisasmInfo::afNone, "idiv"}, // 6C idiv
|
|
{BytecodeDisasmInfo::afNone, "ldiv"}, // 6D ldiv
|
|
{BytecodeDisasmInfo::afNone, "fdiv"}, // 6E fdiv
|
|
{BytecodeDisasmInfo::afNone, "ddiv"}, // 6F ddiv
|
|
{BytecodeDisasmInfo::afNone, "irem"}, // 70 irem
|
|
{BytecodeDisasmInfo::afNone, "lrem"}, // 71 lrem
|
|
{BytecodeDisasmInfo::afNone, "frem"}, // 72 frem
|
|
{BytecodeDisasmInfo::afNone, "drem"}, // 73 drem
|
|
{BytecodeDisasmInfo::afNone, "ineg"}, // 74 ineg
|
|
{BytecodeDisasmInfo::afNone, "lneg"}, // 75 lneg
|
|
{BytecodeDisasmInfo::afNone, "fneg"}, // 76 fneg
|
|
{BytecodeDisasmInfo::afNone, "dneg"}, // 77 dneg
|
|
{BytecodeDisasmInfo::afNone, "ishl"}, // 78 ishl
|
|
{BytecodeDisasmInfo::afNone, "lshl"}, // 79 lshl
|
|
{BytecodeDisasmInfo::afNone, "ishr"}, // 7A ishr
|
|
{BytecodeDisasmInfo::afNone, "lshr"}, // 7B lshr
|
|
{BytecodeDisasmInfo::afNone, "iushr"}, // 7C iushr
|
|
{BytecodeDisasmInfo::afNone, "lushr"}, // 7D lushr
|
|
{BytecodeDisasmInfo::afNone, "iand"}, // 7E iand
|
|
{BytecodeDisasmInfo::afNone, "land"}, // 7F land
|
|
{BytecodeDisasmInfo::afNone, "ior"}, // 80 ior
|
|
{BytecodeDisasmInfo::afNone, "lor"}, // 81 lor
|
|
{BytecodeDisasmInfo::afNone, "ixor"}, // 82 ixor
|
|
{BytecodeDisasmInfo::afNone, "lxor"}, // 83 lxor
|
|
{BytecodeDisasmInfo::afIInc, "iinc"}, // 84 vv cc iinc v,c
|
|
{BytecodeDisasmInfo::afNone, "i2l"}, // 85 i2l
|
|
{BytecodeDisasmInfo::afNone, "i2f"}, // 86 i2f
|
|
{BytecodeDisasmInfo::afNone, "i2d"}, // 87 i2d
|
|
{BytecodeDisasmInfo::afNone, "l2i"}, // 88 l2i
|
|
{BytecodeDisasmInfo::afNone, "l2f"}, // 89 l2f
|
|
{BytecodeDisasmInfo::afNone, "l2d"}, // 8A l2d
|
|
{BytecodeDisasmInfo::afNone, "f2i"}, // 8B f2i
|
|
{BytecodeDisasmInfo::afNone, "f2l"}, // 8C f2l
|
|
{BytecodeDisasmInfo::afNone, "f2d"}, // 8D f2d
|
|
{BytecodeDisasmInfo::afNone, "d2i"}, // 8E d2i
|
|
{BytecodeDisasmInfo::afNone, "d2l"}, // 8F d2l
|
|
{BytecodeDisasmInfo::afNone, "d2f"}, // 90 d2f
|
|
{BytecodeDisasmInfo::afNone, "i2b"}, // 91 i2b
|
|
{BytecodeDisasmInfo::afNone, "i2c"}, // 92 i2c
|
|
{BytecodeDisasmInfo::afNone, "i2s"}, // 93 i2s
|
|
{BytecodeDisasmInfo::afNone, "lcmp"}, // 94 lcmp
|
|
{BytecodeDisasmInfo::afNone, "fcmpl"}, // 95 fcmpl
|
|
{BytecodeDisasmInfo::afNone, "fcmpg"}, // 96 fcmpg
|
|
{BytecodeDisasmInfo::afNone, "dcmpl"}, // 97 dcmpl
|
|
{BytecodeDisasmInfo::afNone, "dcmpg"}, // 98 dcmpg
|
|
{BytecodeDisasmInfo::afDisp, "ifeq"}, // 99 dddd ifeq
|
|
{BytecodeDisasmInfo::afDisp, "ifne"}, // 9A dddd ifne
|
|
{BytecodeDisasmInfo::afDisp, "iflt"}, // 9B dddd iflt
|
|
{BytecodeDisasmInfo::afDisp, "ifge"}, // 9C dddd ifge
|
|
{BytecodeDisasmInfo::afDisp, "ifgt"}, // 9D dddd ifgt
|
|
{BytecodeDisasmInfo::afDisp, "ifle"}, // 9E dddd ifle
|
|
{BytecodeDisasmInfo::afDisp, "if_icmpeq"}, // 9F dddd if_icmpeq
|
|
{BytecodeDisasmInfo::afDisp, "if_icmpne"}, // A0 dddd if_icmpne
|
|
{BytecodeDisasmInfo::afDisp, "if_icmplt"}, // A1 dddd if_icmplt
|
|
{BytecodeDisasmInfo::afDisp, "if_icmpge"}, // A2 dddd if_icmpge
|
|
{BytecodeDisasmInfo::afDisp, "if_icmpgt"}, // A3 dddd if_icmpgt
|
|
{BytecodeDisasmInfo::afDisp, "if_icmple"}, // A4 dddd if_icmple
|
|
{BytecodeDisasmInfo::afDisp, "if_acmpeq"}, // A5 dddd if_acmpeq
|
|
{BytecodeDisasmInfo::afDisp, "if_acmpne"}, // A6 dddd if_acmpne
|
|
{BytecodeDisasmInfo::afDisp, "goto"}, // A7 dddd goto
|
|
{BytecodeDisasmInfo::afDisp, "jsr"}, // A8 dddd jsr
|
|
{BytecodeDisasmInfo::afVar, "ret"}, // A9 vv ret v
|
|
{BytecodeDisasmInfo::afTableSwitch, "tableswitch"}, // AA ... tableswitch
|
|
{BytecodeDisasmInfo::afLookupSwitch, "lookupswitch"}, // AB ... lookupswitch
|
|
{BytecodeDisasmInfo::afNone, "ireturn"}, // AC ireturn
|
|
{BytecodeDisasmInfo::afNone, "lreturn"}, // AD lreturn
|
|
{BytecodeDisasmInfo::afNone, "freturn"}, // AE freturn
|
|
{BytecodeDisasmInfo::afNone, "dreturn"}, // AF dreturn
|
|
{BytecodeDisasmInfo::afNone, "areturn"}, // B0 areturn
|
|
{BytecodeDisasmInfo::afNone, "return"}, // B1 return
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "getstatic"}, // B2 iiii getstatic
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "putstatic"}, // B3 iiii putstatic
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "getfield"}, // B4 iiii getfield
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "putfield"}, // B5 iiii putfield
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "invokevirtual"}, // B6 iiii invokevirtual
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "invokespecial"}, // B7 iiii invokespecial
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "invokestatic"}, // B8 iiii invokestatic
|
|
{BytecodeDisasmInfo::afInvokeInterface, "invokeinterface"}, // B9 iiii nn00 invokeinterface
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // BA unused
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "new"}, // BB iiii new
|
|
{BytecodeDisasmInfo::afNewArray, "newarray"}, // BC tt newarray
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "anewarray"}, // BD iiii anewarray
|
|
{BytecodeDisasmInfo::afNone, "arraylength"}, // BE arraylength
|
|
{BytecodeDisasmInfo::afNone, "athrow"}, // BF athrow
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "checkcast"}, // C0 iiii checkcast
|
|
{BytecodeDisasmInfo::afHalfConstIndex, "instanceof"}, // C1 iiii instanceof
|
|
{BytecodeDisasmInfo::afNone, "monitorenter"}, // C2 monitorenter
|
|
{BytecodeDisasmInfo::afNone, "monitorexit"}, // C3 monitorexit
|
|
{BytecodeDisasmInfo::afWide, "wide"}, // C4 ... wide
|
|
{BytecodeDisasmInfo::afMultiANewArray, "multianewarray"}, // C5 iiii nn multianewarray
|
|
{BytecodeDisasmInfo::afDisp, "ifnull"}, // C6 dddd ifnull
|
|
{BytecodeDisasmInfo::afDisp, "ifnonnull"}, // C7 dddd ifnonnull
|
|
{BytecodeDisasmInfo::afWideDisp, "goto_w"}, // C8 dddddddd goto_w
|
|
{BytecodeDisasmInfo::afWideDisp, "jsr_w"}, // C9 dddddddd jsr_w
|
|
{BytecodeDisasmInfo::afNone, "breakpoint"}, // CA breakpoint
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // CB unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // CC unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // CD unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // CE unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // CF unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D0 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D1 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D2 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D3 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D4 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D5 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D6 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D7 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D8 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // D9 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // DA unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // DB unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // DC unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // DD unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // DE unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // DF unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E0 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E1 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E2 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E3 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E4 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E5 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E6 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E7 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E8 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // E9 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // EA unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // EB unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // EC unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // ED unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // EE unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // EF unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F0 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F1 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F2 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F3 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F4 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F5 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F6 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F7 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F8 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // F9 unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // FA unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // FB unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // FC unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // FD unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"}, // FE unused
|
|
{BytecodeDisasmInfo::afIllegal, "????"} // FF unused
|
|
};
|
|
|
|
|
|
//
|
|
// If c is non-nil, disassemble the constant pool index symbolically using the information
|
|
// in c. If c is nil, print the index preceded by an '@' sign.
|
|
//
|
|
static void printConstantPoolIndex(LogModuleObject &f, Uint32 index, const ConstantPool *c)
|
|
{
|
|
if (c)
|
|
c->printItem(f, index);
|
|
else
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("@%u", index));
|
|
}
|
|
|
|
|
|
//
|
|
// Disassemble the alignment bytes and default target for a tableswitch
|
|
// or lookupswitch instruction and print them on the output stream f.
|
|
// origin is the address of the first bytecode in the function (and must
|
|
// be word-aligned). bc is base+1. The base and the instruction's first
|
|
// byte has already been printed on f.
|
|
// Return the address of the npairs or lowbyte word.
|
|
//
|
|
static const bytecode *disasmAlignAndDefault(LogModuleObject &f, const bytecode *bc, const bytecode *base,
|
|
const bytecode *origin, const char *name, int margin)
|
|
{
|
|
int nPadBytes = -(int)bc & 3;
|
|
for (int i = 0; i != 3; i++)
|
|
if (i < nPadBytes) {
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X ", *(Uint8 *)bc));
|
|
bc++;
|
|
} else
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, (" "));
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, (" %s\n", name));
|
|
|
|
printMargin(f, margin);
|
|
Int32 d = readBigSWord(bc);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X: %.8X default -> 0x%.4X\n", bc - origin, d, d + (base - origin)));
|
|
bc += 4;
|
|
printMargin(f, margin);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X: ", bc - origin));
|
|
return bc;
|
|
}
|
|
|
|
|
|
//
|
|
// Disassemble a single Java tableswitch bytecode starting at base and print it
|
|
// on the output stream f. origin is the address of the first bytecode in
|
|
// the function (and must be word-aligned). bc is base+1. The base and the
|
|
// instruction's first byte has already been printed on f.
|
|
// Return the address of the next bytecode.
|
|
//
|
|
static const bytecode *disasmTableSwitch(LogModuleObject &f, const bytecode *bc, const bytecode *base, const bytecode *origin, int margin)
|
|
{
|
|
bc = disasmAlignAndDefault(f, bc, base, origin, "tableswitch", margin);
|
|
Int32 low = readBigSWord(bc);
|
|
bc += 4;
|
|
Int32 high = readBigSWord(bc);
|
|
bc += 4;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.8X %.8X", low, high));
|
|
if (low <= high)
|
|
while (true) {
|
|
Int32 d = readBigSWord(bc);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("\n"));
|
|
printMargin(f, margin);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X: %.8X %d -> 0x%.4X", bc - origin, d, low, d + (base - origin)));
|
|
bc += 4;
|
|
if (low == high)
|
|
break;
|
|
low++;
|
|
}
|
|
return bc;
|
|
}
|
|
|
|
|
|
//
|
|
// Disassemble a single Java lookupswitch bytecode starting at base and print it
|
|
// on the output stream f. origin is the address of the first bytecode in
|
|
// the function (and must be word-aligned). bc is base+1. The base and the
|
|
// instruction's first byte has already been printed on f.
|
|
// Return the address of the next bytecode.
|
|
//
|
|
static const bytecode *disasmLookupSwitch(LogModuleObject &f, const bytecode *bc, const bytecode *base, const bytecode *origin, int margin)
|
|
{
|
|
bc = disasmAlignAndDefault(f, bc, base, origin, "lookupswitch", margin);
|
|
Int32 nPairs = readBigSWord(bc);
|
|
bc += 4;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.8X", nPairs));
|
|
while (nPairs > 0) {
|
|
Int32 match = readBigSWord(bc);
|
|
Int32 d = readBigSWord(bc + 4);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("\n"));
|
|
printMargin(f, margin);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X: %.8X %.8X %d -> 0x%.4X", bc - origin, match, d, match, d + (base - origin)));
|
|
bc += 8;
|
|
nPairs--;
|
|
}
|
|
return bc;
|
|
}
|
|
|
|
|
|
//
|
|
// Disassemble a single Java bytecode starting at bc and print it as a complete
|
|
// line on the output stream f. origin is the address of the first bytecode in
|
|
// the function (and must be word-aligned).
|
|
// If c is non-nil, disassemble constant pool indices symbolically using the information
|
|
// in c.
|
|
// Return the address of the next bytecode.
|
|
//
|
|
const bytecode *disassembleBytecode(LogModuleObject &f, const bytecode *bc, const bytecode *origin,
|
|
const ConstantPool *c, int margin)
|
|
{
|
|
assert(((size_t)origin & 3) == 0); // Make sure that origin is word-aligned.
|
|
|
|
const bytecode *base = bc;
|
|
bytecode b = *bc++;
|
|
printMargin(f, margin);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X: %.2X ", base - origin, b));
|
|
const BytecodeDisasmInfo &bdi = bytecodeDisasmInfos[b];
|
|
Int32 i;
|
|
Uint32 u;
|
|
Uint32 n;
|
|
const char *s;
|
|
|
|
switch (bdi.format) {
|
|
|
|
case BytecodeDisasmInfo::afSByte:
|
|
i = *(Int8 *)bc;
|
|
bc++;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X %s %d", i & 0xFF, bdi.name, i));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afSHalf:
|
|
i = readBigSHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X %s %d", i & 0xFFFF, bdi.name, i));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afByteConstIndex:
|
|
u = *(Uint8 *)bc;
|
|
bc++;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X %s ", u, bdi.name));
|
|
printConstantPoolIndex(f, u, c);
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afHalfConstIndex:
|
|
u = readBigUHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X %s ", u, bdi.name));
|
|
printConstantPoolIndex(f, u, c);
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afVar:
|
|
u = *(Uint8 *)bc;
|
|
bc++;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X %s %u", u, bdi.name, u));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afIInc:
|
|
u = *(Uint8 *)bc;
|
|
bc++;
|
|
i = *(Int8 *)bc;
|
|
bc++;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X %.2X %s %u,%d", u, i & 0xFF, bdi.name, u, i));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afDisp:
|
|
i = readBigSHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X %s 0x%.4X", i & 0xFFFF, bdi.name, i + (base - origin)));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afWideDisp:
|
|
i = readBigSWordUnaligned(bc);
|
|
bc += 4;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.8X %s 0x%.4X", i, bdi.name, i + (base - origin)));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afTableSwitch:
|
|
bc = disasmTableSwitch(f, bc, base, origin, margin);
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afLookupSwitch:
|
|
bc = disasmLookupSwitch(f, bc, base, origin, margin);
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afInvokeInterface:
|
|
u = readBigUHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
n = *(Uint8 *)bc;
|
|
bc++;
|
|
i = *(Uint8 *)bc;
|
|
bc++;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X %.2X %.2X %s ", u, n, i, bdi.name));
|
|
printConstantPoolIndex(f, u, c);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, (", %d", n));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afNewArray:
|
|
u = *(Uint8 *)bc;
|
|
bc++;
|
|
switch (u) {
|
|
case 4: s = "T_BOOLEAN"; break;
|
|
case 5: s = "T_CHAR"; break;
|
|
case 6: s = "T_FLOAT"; break;
|
|
case 7: s = "T_DOUBLE"; break;
|
|
case 8: s = "T_BYTE"; break;
|
|
case 9: s = "T_SHORT"; break;
|
|
case 10: s = "T_INT"; break;
|
|
case 11: s = "T_LONG"; break;
|
|
default: s = "????";
|
|
}
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X %s %s", u, bdi.name, s));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afMultiANewArray:
|
|
u = readBigUHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
n = *(Uint8 *)bc;
|
|
bc++;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X %.2X %s ", u, n, bdi.name));
|
|
printConstantPoolIndex(f, u, c);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, (", %d", n));
|
|
break;
|
|
|
|
case BytecodeDisasmInfo::afWide:
|
|
{
|
|
b = *bc++;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X ", b));
|
|
const BytecodeDisasmInfo &bdi = bytecodeDisasmInfos[b];
|
|
switch (bdi.format) {
|
|
case BytecodeDisasmInfo::afVar:
|
|
u = readBigUHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X wide %s %d", u, bdi.name, u));
|
|
break;
|
|
case BytecodeDisasmInfo::afIInc:
|
|
u = readBigUHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
i = readBigSHalfwordUnaligned(bc);
|
|
bc += 2;
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.2X %.2X wide %s %u,%d", u, i & 0xFFFF, bdi.name, u, i));
|
|
break;
|
|
default:
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, (" wide ????"));
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, (" %s", bdi.name));
|
|
}
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("\n"));
|
|
return bc;
|
|
}
|
|
|
|
|
|
//
|
|
// Disassemble Java bytecodes starting from begin (inclusive) up to end (exclusive)
|
|
// and print them as complete lines on the output stream f. origin is the address
|
|
// of the first bytecode in the function (and must be word-aligned).
|
|
// If c is non-nil, disassemble constant pool indices symbolically using the information
|
|
// in c.
|
|
//
|
|
void disassembleBytecodes(LogModuleObject &f, const bytecode *begin, const bytecode *end, const bytecode *origin,
|
|
const ConstantPool *c, int margin)
|
|
{
|
|
while (begin < end)
|
|
begin = disassembleBytecode(f, begin, origin, c, margin);
|
|
assert(begin == end);
|
|
}
|
|
|
|
|
|
//
|
|
// Disassemble nExceptionEntries exception entries starting at exceptionEntries
|
|
// and print them on the output stream f.
|
|
// If c is non-nil, disassemble constant pool indices symbolically using the information
|
|
// in c.
|
|
//
|
|
void disassembleExceptions(LogModuleObject &f, Uint32 nExceptionEntries, const ExceptionItem *exceptionEntries,
|
|
const ConstantPool *c, int margin)
|
|
{
|
|
if (nExceptionEntries) {
|
|
printMargin(f, margin);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("Exception handlers:\n"));
|
|
while (nExceptionEntries--) {
|
|
printMargin(f, margin + 4);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, ("%.4X-%.4X, ", exceptionEntries->startPc, exceptionEntries->endPc));
|
|
printConstantPoolIndex(f, exceptionEntries->catchType, c);
|
|
UT_OBJECTLOG(f, PR_LOG_ALWAYS, (" -> %.4X\n", exceptionEntries->handlerPc));
|
|
exceptionEntries++;
|
|
}
|
|
}
|
|
}
|
|
#endif
|