From 070c1f36adfb4152c860284a65ccbe4a3d5ec9f4 Mon Sep 17 00:00:00 2001 From: Andrey Loskutov Date: Wed, 8 Jun 2016 20:05:54 +0200 Subject: [PATCH] BCEL6: avoid exceptions on INVOKEDYNAMIC instructions, see #106 Created TODO's in the code to avoid analysis errors while visiting INVOKEDYNAMIC instructions. --- findbugs/src/java/edu/umd/cs/findbugs/ba/Hierarchy2.java | 5 +++++ .../src/java/edu/umd/cs/findbugs/ba/jsr305/Analysis.java | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/findbugs/src/java/edu/umd/cs/findbugs/ba/Hierarchy2.java b/findbugs/src/java/edu/umd/cs/findbugs/ba/Hierarchy2.java index 0ae4fcea28..804da44324 100644 --- a/findbugs/src/java/edu/umd/cs/findbugs/ba/Hierarchy2.java +++ b/findbugs/src/java/edu/umd/cs/findbugs/ba/Hierarchy2.java @@ -312,6 +312,11 @@ Set resolveMethodCallTargets(InvokeInstruction invokeInstruction, TypeF return Collections. emptySet(); } + // XXX handle INVOKEDYNAMIC + if (opcode == Constants.INVOKEDYNAMIC) { + return Collections. emptySet(); + } + Type receiverType; boolean receiverTypeIsExact; diff --git a/findbugs/src/java/edu/umd/cs/findbugs/ba/jsr305/Analysis.java b/findbugs/src/java/edu/umd/cs/findbugs/ba/jsr305/Analysis.java index d1c2d4dc37..d88926c346 100644 --- a/findbugs/src/java/edu/umd/cs/findbugs/ba/jsr305/Analysis.java +++ b/findbugs/src/java/edu/umd/cs/findbugs/ba/jsr305/Analysis.java @@ -27,6 +27,7 @@ import javax.annotation.meta.When; import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.INVOKEDYNAMIC; import org.apache.bcel.generic.Instruction; import org.apache.bcel.generic.InvokeInstruction; @@ -105,8 +106,12 @@ public static Collection> getRelevantTypeQualifiers(Method Location location = i.next(); Instruction ins = location.getHandle().getInstruction(); if (ins instanceof InvokeInstruction) { - XMethod called = XFactory.createXMethod((InvokeInstruction) ins, cpg); - addEffectiveRelevantQualifiers(result, called); + if (ins instanceof INVOKEDYNAMIC) { + // TODO handle INVOKEDYNAMIC + } else { + XMethod called = XFactory.createXMethod((InvokeInstruction) ins, cpg); + addEffectiveRelevantQualifiers(result, called); + } } if (DEBUG_FIND_EFFECTIVE_RELEVANT_QUALIFIERS) {