From a1cfe944a602101d144c8efd7df217ab20e4b9ee Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Mon, 23 Mar 2015 12:54:54 -0700 Subject: 462821: invokedynamic detection in hierarchy of aspects --- weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'weaver/src') diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java index 668a0b2dc..64d6a1054 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java @@ -241,12 +241,27 @@ class BcelAdvice extends Advice { if (boType.javaClass.getMajor() == Constants.MAJOR_1_8) { if (containsInvokedynamic == 0) { containsInvokedynamic = 1; - LazyMethodGen lmg = boType.getLazyClassGen().getLazyMethodGen(this.signature); - InstructionList ilist = lmg.getBody(); - for (InstructionHandle src = ilist.getStart(); src != null; src = src.getNext()) { - if (src.getInstruction().opcode == Constants.INVOKEDYNAMIC) { - containsInvokedynamic = 2; - break; + LazyMethodGen lmg = boType.getLazyClassGen().getLazyMethodGen(this.signature.getName(), this.signature.getSignature(), true); + // Check Java8 supertypes + while (lmg == null) { + ResolvedType superType = boType.getSuperclass(); + if (superType == null) break; + ReferenceTypeDelegate rtd = ((ReferenceType)superType).getDelegate(); + if (rtd instanceof BcelObjectType) { + BcelObjectType bot = (BcelObjectType)rtd; + if (bot.javaClass.getMajor() < Constants.MAJOR_1_8) { + break; + } + lmg = bot.getLazyClassGen().getLazyMethodGen(this.signature.getName(), this.signature.getSignature(), true); + } + } + if (lmg != null) { + InstructionList ilist = lmg.getBody(); + for (InstructionHandle src = ilist.getStart(); src != null; src = src.getNext()) { + if (src.getInstruction().opcode == Constants.INVOKEDYNAMIC) { + containsInvokedynamic = 2; + break; + } } } } -- cgit v1.2.3