/******************************************************************************* * Copyright (c) 2009, 2010 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.equinox.p2.internal.repository.comparator.java; public class CodeAttribute extends ClassFileAttribute { private static final ExceptionTableEntry[] NO_EXCEPTION_TABLE = new ExceptionTableEntry[0]; private ClassFileAttribute[] attributes; private int attributesCount; private byte[] bytecodes; private byte[] classFileBytes; private long codeLength; private int codeOffset; private ConstantPool constantPool; private ExceptionTableEntry[] exceptionTableEntries; private int exceptionTableLength; private int maxLocals; private int maxStack; CodeAttribute(byte[] classFileBytes, ConstantPool constantPool, int offset) throws ClassFormatException { super(classFileBytes, constantPool, offset); this.classFileBytes = classFileBytes; this.constantPool = constantPool; this.maxStack = u2At(classFileBytes, 6, offset); this.maxLocals = u2At(classFileBytes, 8, offset); this.codeLength = u4At(classFileBytes, 10, offset); this.codeOffset = offset + 14; int readOffset = (int) (14 + this.codeLength); this.exceptionTableLength = u2At(classFileBytes, readOffset, offset); readOffset += 2; this.exceptionTableEntries = NO_EXCEPTION_TABLE; if (this.exceptionTableLength != 0) { this.exceptionTableEntries = new ExceptionTableEntry[this.exceptionTableLength]; for (int i = 0; i < this.exceptionTableLength; i++) { this.exceptionTableEntries[i] = new ExceptionTableEntry(classFileBytes, constantPool, offset + readOffset); readOffset += 8; } } this.attributesCount = u2At(classFileBytes, readOffset, offset); this.attributes = ClassFileAttribute.NO_ATTRIBUTES; if (this.attributesCount != 0) { this.attributes = new ClassFileAttribute[this.attributesCount]; } readOffset += 2; for (int i = 0; i < this.attributesCount; i++) { ConstantPoolEntry constantPoolEntry = constantPool.decodeEntry(u2At(classFileBytes, readOffset, offset)); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Utf8) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } readOffset += (6 + u4At(classFileBytes, readOffset + 2, offset)); } } /* * @see ICodeAttribute#getAttributes() */ public ClassFileAttribute[] getAttributes() { return this.attributes; } /* * @see ICodeAttribute#getAttributesCount() */ public int getAttributesCount() { return this.attributesCount; } /* * @see ICodeAttribute#getBytecodes() */ public byte[] getBytecodes() { if (this.bytecodes == null) { System.arraycopy(this.classFileBytes, this.codeOffset, (this.bytecodes = new byte[(int) this.codeLength]), 0, (int) this.codeLength); } return this.bytecodes; } /* * @see ICodeAttribute#getCodeLength() */ public long getCodeLength() { return this.codeLength; } /* * @see ICodeAttribute#getExceptionTable() */ public ExceptionTableEntry[] getExceptionTable() { return this.exceptionTableEntries; } /* * @see ICodeAttribute#getExceptionTableLength() */ public int getExceptionTableLength() { return this.exceptionTableLength; } /* * @see ICodeAttribute#getMaxLocals() */ public int getMaxLocals() { return this.maxLocals; } /* * @see ICodeAttribute#getMaxStack() */ public int getMaxStack() { return this.maxStack; } /* * @see ICodeAttribute#traverse(IBytecodeVisitor visitor) */ public void traverse(DefaultBytecodeVisitor visitor) throws ClassFormatException { int pc = this.codeOffset; int opcode, index, _const, branchOffset; ConstantPoolEntry constantPoolEntry; while (true) { opcode = u1At(this.classFileBytes, 0, pc); switch (opcode) { case IOpcodeMnemonics.NOP : visitor._nop(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ACONST_NULL : visitor._aconst_null(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ICONST_M1 : visitor._iconst_m1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ICONST_0 : visitor._iconst_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ICONST_1 : visitor._iconst_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ICONST_2 : visitor._iconst_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ICONST_3 : visitor._iconst_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ICONST_4 : visitor._iconst_4(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ICONST_5 : visitor._iconst_5(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LCONST_0 : visitor._lconst_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LCONST_1 : visitor._lconst_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FCONST_0 : visitor._fconst_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FCONST_1 : visitor._fconst_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FCONST_2 : visitor._fconst_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DCONST_0 : visitor._dconst_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DCONST_1 : visitor._dconst_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.BIPUSH : visitor._bipush(pc - this.codeOffset, (byte) i1At(this.classFileBytes, 1, pc)); pc += 2; break; case IOpcodeMnemonics.SIPUSH : visitor._sipush(pc - this.codeOffset, (short) i2At(this.classFileBytes, 1, pc)); pc += 3; break; case IOpcodeMnemonics.LDC : index = u1At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Float && constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Integer && constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_String && constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Class) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._ldc(pc - this.codeOffset, index, constantPoolEntry); pc += 2; break; case IOpcodeMnemonics.LDC_W : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Float && constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Integer && constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_String && constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Class) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._ldc_w(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.LDC2_W : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Double && constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Long) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._ldc2_w(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.ILOAD : index = u1At(this.classFileBytes, 1, pc); visitor._iload(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.LLOAD : index = u1At(this.classFileBytes, 1, pc); visitor._lload(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.FLOAD : index = u1At(this.classFileBytes, 1, pc); visitor._fload(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.DLOAD : index = u1At(this.classFileBytes, 1, pc); visitor._dload(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.ALOAD : index = u1At(this.classFileBytes, 1, pc); visitor._aload(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.ILOAD_0 : visitor._iload_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ILOAD_1 : visitor._iload_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ILOAD_2 : visitor._iload_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ILOAD_3 : visitor._iload_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LLOAD_0 : visitor._lload_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LLOAD_1 : visitor._lload_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LLOAD_2 : visitor._lload_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LLOAD_3 : visitor._lload_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FLOAD_0 : visitor._fload_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FLOAD_1 : visitor._fload_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FLOAD_2 : visitor._fload_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FLOAD_3 : visitor._fload_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DLOAD_0 : visitor._dload_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DLOAD_1 : visitor._dload_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DLOAD_2 : visitor._dload_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DLOAD_3 : visitor._dload_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ALOAD_0 : visitor._aload_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ALOAD_1 : visitor._aload_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ALOAD_2 : visitor._aload_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ALOAD_3 : visitor._aload_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IALOAD : visitor._iaload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LALOAD : visitor._laload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FALOAD : visitor._faload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DALOAD : visitor._daload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.AALOAD : visitor._aaload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.BALOAD : visitor._baload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.CALOAD : visitor._caload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.SALOAD : visitor._saload(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ISTORE : index = u1At(this.classFileBytes, 1, pc); visitor._istore(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.LSTORE : index = u1At(this.classFileBytes, 1, pc); visitor._lstore(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.FSTORE : index = u1At(this.classFileBytes, 1, pc); visitor._fstore(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.DSTORE : index = u1At(this.classFileBytes, 1, pc); visitor._dstore(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.ASTORE : index = u1At(this.classFileBytes, 1, pc); visitor._astore(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.ISTORE_0 : visitor._istore_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ISTORE_1 : visitor._istore_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ISTORE_2 : visitor._istore_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ISTORE_3 : visitor._istore_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LSTORE_0 : visitor._lstore_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LSTORE_1 : visitor._lstore_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LSTORE_2 : visitor._lstore_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LSTORE_3 : visitor._lstore_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FSTORE_0 : visitor._fstore_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FSTORE_1 : visitor._fstore_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FSTORE_2 : visitor._fstore_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FSTORE_3 : visitor._fstore_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DSTORE_0 : visitor._dstore_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DSTORE_1 : visitor._dstore_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DSTORE_2 : visitor._dstore_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DSTORE_3 : visitor._dstore_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ASTORE_0 : visitor._astore_0(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ASTORE_1 : visitor._astore_1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ASTORE_2 : visitor._astore_2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ASTORE_3 : visitor._astore_3(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IASTORE : visitor._iastore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LASTORE : visitor._lastore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FASTORE : visitor._fastore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DASTORE : visitor._dastore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.AASTORE : visitor._aastore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.BASTORE : visitor._bastore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.CASTORE : visitor._castore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.SASTORE : visitor._sastore(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.POP : visitor._pop(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.POP2 : visitor._pop2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DUP : visitor._dup(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DUP_X1 : visitor._dup_x1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DUP_X2 : visitor._dup_x2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DUP2 : visitor._dup2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DUP2_X1 : visitor._dup2_x1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DUP2_X2 : visitor._dup2_x2(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.SWAP : visitor._swap(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IADD : visitor._iadd(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LADD : visitor._ladd(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FADD : visitor._fadd(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DADD : visitor._dadd(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ISUB : visitor._isub(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LSUB : visitor._lsub(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FSUB : visitor._fsub(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DSUB : visitor._dsub(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IMUL : visitor._imul(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LMUL : visitor._lmul(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FMUL : visitor._fmul(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DMUL : visitor._dmul(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IDIV : visitor._idiv(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LDIV : visitor._ldiv(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FDIV : visitor._fdiv(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DDIV : visitor._ddiv(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IREM : visitor._irem(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LREM : visitor._lrem(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FREM : visitor._frem(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DREM : visitor._drem(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.INEG : visitor._ineg(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LNEG : visitor._lneg(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FNEG : visitor._fneg(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DNEG : visitor._dneg(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ISHL : visitor._ishl(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LSHL : visitor._lshl(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ISHR : visitor._ishr(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LSHR : visitor._lshr(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IUSHR : visitor._iushr(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LUSHR : visitor._lushr(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IAND : visitor._iand(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LAND : visitor._land(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IOR : visitor._ior(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LOR : visitor._lor(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IXOR : visitor._ixor(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LXOR : visitor._lxor(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IINC : index = u1At(this.classFileBytes, 1, pc); _const = i1At(this.classFileBytes, 2, pc); visitor._iinc(pc - this.codeOffset, index, _const); pc += 3; break; case IOpcodeMnemonics.I2L : visitor._i2l(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.I2F : visitor._i2f(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.I2D : visitor._i2d(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.L2I : visitor._l2i(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.L2F : visitor._l2f(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.L2D : visitor._l2d(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.F2I : visitor._f2i(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.F2L : visitor._f2l(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.F2D : visitor._f2d(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.D2I : visitor._d2i(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.D2L : visitor._d2l(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.D2F : visitor._d2f(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.I2B : visitor._i2b(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.I2C : visitor._i2c(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.I2S : visitor._i2s(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LCMP : visitor._lcmp(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FCMPL : visitor._fcmpl(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FCMPG : visitor._fcmpg(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DCMPL : visitor._dcmpl(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DCMPG : visitor._dcmpg(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IFEQ : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._ifeq(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IFNE : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._ifne(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IFLT : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._iflt(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IFGE : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._ifge(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IFGT : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._ifgt(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IFLE : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._ifle(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ICMPEQ : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_icmpeq(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ICMPNE : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_icmpne(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ICMPLT : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_icmplt(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ICMPGE : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_icmpge(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ICMPGT : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_icmpgt(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ICMPLE : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_icmple(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ACMPEQ : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_acmpeq(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IF_ACMPNE : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._if_acmpne(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.GOTO : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._goto(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.JSR : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._jsr(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.RET : index = u1At(this.classFileBytes, 1, pc); visitor._ret(pc - this.codeOffset, index); pc += 2; break; case IOpcodeMnemonics.TABLESWITCH : int startpc = pc; pc++; while (((pc - this.codeOffset) & 0x03) != 0) { // faster than % 4 pc++; } int defaultOffset = i4At(this.classFileBytes, 0, pc); pc += 4; int low = i4At(this.classFileBytes, 0, pc); pc += 4; int high = i4At(this.classFileBytes, 0, pc); pc += 4; int length = high - low + 1; int[] jumpOffsets = new int[length]; for (int i = 0; i < length; i++) { jumpOffsets[i] = i4At(this.classFileBytes, 0, pc); pc += 4; } visitor._tableswitch(startpc - this.codeOffset, defaultOffset, low, high, jumpOffsets); break; case IOpcodeMnemonics.LOOKUPSWITCH : startpc = pc; pc++; while (((pc - this.codeOffset) & 0x03) != 0) { pc++; } defaultOffset = i4At(this.classFileBytes, 0, pc); pc += 4; int npairs = (int) u4At(this.classFileBytes, 0, pc); int[][] offset_pairs = new int[npairs][2]; pc += 4; for (int i = 0; i < npairs; i++) { offset_pairs[i][0] = i4At(this.classFileBytes, 0, pc); pc += 4; offset_pairs[i][1] = i4At(this.classFileBytes, 0, pc); pc += 4; } visitor._lookupswitch(startpc - this.codeOffset, defaultOffset, npairs, offset_pairs); break; case IOpcodeMnemonics.IRETURN : visitor._ireturn(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.LRETURN : visitor._lreturn(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.FRETURN : visitor._freturn(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.DRETURN : visitor._dreturn(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ARETURN : visitor._areturn(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.RETURN : visitor._return(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.GETSTATIC : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Fieldref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._getstatic(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.PUTSTATIC : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Fieldref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._putstatic(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.GETFIELD : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Fieldref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._getfield(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.PUTFIELD : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Fieldref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._putfield(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.INVOKEVIRTUAL : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Methodref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._invokevirtual(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.INVOKESPECIAL : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Methodref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._invokespecial(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.INVOKESTATIC : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Methodref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._invokestatic(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.INVOKEINTERFACE : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_InterfaceMethodref) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } byte count = (byte) u1At(this.classFileBytes, 3, pc); int extraArgs = u1At(this.classFileBytes, 4, pc); if (extraArgs != 0) { throw new ClassFormatException(ClassFormatException.INVALID_ARGUMENTS_FOR_INVOKEINTERFACE); } visitor._invokeinterface(pc - this.codeOffset, index, count, constantPoolEntry); pc += 5; break; case IOpcodeMnemonics.NEW : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Class) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._new(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.NEWARRAY : int atype = u1At(this.classFileBytes, 1, pc); visitor._newarray(pc - this.codeOffset, atype); pc += 2; break; case IOpcodeMnemonics.ANEWARRAY : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Class) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._anewarray(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.ARRAYLENGTH : visitor._arraylength(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.ATHROW : visitor._athrow(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.CHECKCAST : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Class) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._checkcast(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.INSTANCEOF : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Class) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } visitor._instanceof(pc - this.codeOffset, index, constantPoolEntry); pc += 3; break; case IOpcodeMnemonics.MONITORENTER : visitor._monitorenter(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.MONITOREXIT : visitor._monitorexit(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.WIDE : opcode = u1At(this.classFileBytes, 1, pc); if (opcode == IOpcodeMnemonics.IINC) { index = u2At(this.classFileBytes, 2, pc); _const = i2At(this.classFileBytes, 4, pc); visitor._wide(pc - this.codeOffset, opcode, index, _const); pc += 6; } else { index = u2At(this.classFileBytes, 2, pc); visitor._wide(pc - this.codeOffset, opcode, index); pc += 4; } break; case IOpcodeMnemonics.MULTIANEWARRAY : index = u2At(this.classFileBytes, 1, pc); constantPoolEntry = this.constantPool.decodeEntry(index); if (constantPoolEntry.getKind() != ConstantPoolConstant.CONSTANT_Class) { throw new ClassFormatException(ClassFormatException.INVALID_CONSTANT_POOL_ENTRY); } int dimensions = u1At(this.classFileBytes, 3, pc); visitor._multianewarray(pc - this.codeOffset, index, dimensions, constantPoolEntry); pc += 4; break; case IOpcodeMnemonics.IFNULL : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._ifnull(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.IFNONNULL : branchOffset = i2At(this.classFileBytes, 1, pc); visitor._ifnonnull(pc - this.codeOffset, branchOffset); pc += 3; break; case IOpcodeMnemonics.GOTO_W : branchOffset = i4At(this.classFileBytes, 1, pc); visitor._goto_w(pc - this.codeOffset, branchOffset); pc += 5; break; case IOpcodeMnemonics.JSR_W : branchOffset = i4At(this.classFileBytes, 1, pc); visitor._jsr_w(pc - this.codeOffset, branchOffset); pc += 5; break; case IOpcodeMnemonics.BREAKPOINT : visitor._breakpoint(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IMPDEP1 : visitor._impdep1(pc - this.codeOffset); pc++; break; case IOpcodeMnemonics.IMPDEP2 : visitor._impdep2(pc - this.codeOffset); pc++; break; default : throw new ClassFormatException(ClassFormatException.INVALID_BYTECODE); } if (pc >= (this.codeLength + this.codeOffset)) { break; } } } }