From 6ae463a7494a0e04878e2d265a3505dd0d32cc4a Mon Sep 17 00:00:00 2001 From: aclement Date: Fri, 5 Aug 2011 16:17:39 +0000 Subject: [PATCH] 354022 --- .../aspectj/weaver/bcel/BcelClassWeaver.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java index eb8597925..8b0ec5ecf 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java @@ -495,7 +495,8 @@ class BcelClassWeaver implements IClassWeaver { // Repeat next step until nothing left to inline...cant go on // infinetly as compiler will have detected and reported // "Recursive constructor invocation" - while (inlineSelfConstructors(methodGens)) { + List recursiveCtors = new ArrayList(); + while (inlineSelfConstructors(methodGens, recursiveCtors)) { } positionAndImplement(initializationShadows); } @@ -1526,8 +1527,9 @@ class BcelClassWeaver implements IClassWeaver { return aspectsAffectingType; } - private boolean inlineSelfConstructors(List methodGens) { + private boolean inlineSelfConstructors(List methodGens, List recursiveCtors) { boolean inlinedSomething = false; + List newRecursiveCtors = new ArrayList(); for (LazyMethodGen methodGen : methodGens) { if (!methodGen.getName().equals("")) { continue; @@ -1535,10 +1537,17 @@ class BcelClassWeaver implements IClassWeaver { InstructionHandle ih = findSuperOrThisCall(methodGen); if (ih != null && isThisCall(ih)) { LazyMethodGen donor = getCalledMethod(ih); - inlineMethod(donor, methodGen, ih); - inlinedSomething = true; + if (donor.equals(methodGen)) { + newRecursiveCtors.add(donor); + } else { + if (!recursiveCtors.contains(donor)) { + inlineMethod(donor, methodGen, ih); + inlinedSomething = true; + } + } } } + recursiveCtors.addAll(newRecursiveCtors); return inlinedSomething; } @@ -3094,7 +3103,7 @@ class BcelClassWeaver implements IClassWeaver { && s.charAt(4) == 'a' && (s.equals("org.aspectj.runtime.internal.CFlowCounter") || s.equals("org.aspectj.runtime.internal.CFlowStack") || s - .equals("org.aspectj.runtime.reflect.Factory"))) { + .equals("org.aspectj.runtime.reflect.Factory"))) { proceed = false; } else { if (methodName.equals("aspectOf")) { -- 2.39.5