From d8de95a7c7591f2e0fc4c1737952aa11b9e74f5a Mon Sep 17 00:00:00 2001 From: "vimil.varghese" Date: Sun, 22 Mar 2020 10:39:30 -0700 Subject: [PATCH] condy arrayindexoutofboundsexception fix --- .../asm/constantPool/ConstantPoolGeneration.java | 5 ++++- main/src/mockit/asm/constantPool/DynamicItem.java | 2 +- main/src/mockit/asm/util/BytecodeReader.java | 11 +++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/main/src/mockit/asm/constantPool/ConstantPoolGeneration.java b/main/src/mockit/asm/constantPool/ConstantPoolGeneration.java index f252f2503..7529b9626 100644 --- a/main/src/mockit/asm/constantPool/ConstantPoolGeneration.java +++ b/main/src/mockit/asm/constantPool/ConstantPoolGeneration.java @@ -390,7 +390,10 @@ public Item newConstItem(@Nonnull Object cst) { if (cst instanceof MethodHandle) { return newMethodHandleItem((MethodHandle) cst); } - + if(cst instanceof DynamicItem) { + DynamicItem dI = (DynamicItem)cst; + return createDynamicItem(dI.type, dI.name, dI.desc, dI.bsmIndex); + } throw new IllegalArgumentException("value " + cst); } diff --git a/main/src/mockit/asm/constantPool/DynamicItem.java b/main/src/mockit/asm/constantPool/DynamicItem.java index 2832de91b..f29e415fd 100644 --- a/main/src/mockit/asm/constantPool/DynamicItem.java +++ b/main/src/mockit/asm/constantPool/DynamicItem.java @@ -6,7 +6,7 @@ public final class DynamicItem extends TypeOrMemberItem { - @Nonnegative private int bsmIndex; + @Nonnegative int bsmIndex; public DynamicItem(@Nonnegative int index) { super(index); } diff --git a/main/src/mockit/asm/util/BytecodeReader.java b/main/src/mockit/asm/util/BytecodeReader.java index 40524b3c4..2d1aab881 100644 --- a/main/src/mockit/asm/util/BytecodeReader.java +++ b/main/src/mockit/asm/util/BytecodeReader.java @@ -2,6 +2,8 @@ import javax.annotation.*; +import mockit.asm.constantPool.DynamicItem; +import mockit.asm.jvmConstants.ConstantPoolTypes; import mockit.asm.types.*; import static mockit.asm.jvmConstants.ConstantPoolTypes.*; @@ -394,6 +396,15 @@ protected final Object readConst(@Nonnegative int itemIndex) { case MTYPE: String methodDesc = readNonnullUTF8(constCodeIndex); return MethodType.create(methodDesc); + case CONDY: { + int bsmStartIndex = readUnsignedShort(constCodeIndex); + int nameIndex = readItem(constCodeIndex + 2); + String name = readNonnullUTF8(nameIndex); + String desc = readNonnullUTF8(nameIndex + 2); + DynamicItem dynamicItem = new DynamicItem(itemIndex); + dynamicItem.set(ConstantPoolTypes.CONDY, name, desc, bsmStartIndex); + return dynamicItem; + } // case HANDLE_BASE + [1..9]: default: return readMethodHandle(constCodeIndex);