/* -*- 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.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 */

#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
