From 2974cc303e8a3cc331378dbbe85951eb3a05a6ad Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Thu, 19 Jun 2014 16:40:17 -0700 Subject: [PATCH] work in progress --- .../src/org/aspectj/weaver/ReferenceType.java | 3 ++- .../src/org/aspectj/weaver/ResolvedType.java | 11 ++++++++- tests/bugs181/433351/ClassProj1.java | 8 +++++++ tests/bugs181/433351/ClassProj2.java | 9 +++++++ tests/bugs181/433351/Extender2.aj | 10 ++++++++ tests/bugs181/433351/Extender3.aj | 10 ++++++++ .../systemtest/ajc181/Ajc181Tests.java | 12 ++++++++++ .../org/aspectj/systemtest/ajc181/ajc181.xml | 24 ++++++++++++++++++- .../org/aspectj/weaver/bcel/BcelWeaver.java | 10 +++++++- 9 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 tests/bugs181/433351/ClassProj1.java create mode 100644 tests/bugs181/433351/ClassProj2.java create mode 100644 tests/bugs181/433351/Extender2.aj create mode 100644 tests/bugs181/433351/Extender3.aj diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java b/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java index 538bd940f..891250525 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java @@ -1156,6 +1156,7 @@ public class ReferenceType extends ResolvedType { annotations = null; annotationTypes = null; newSuperclass = null; + bits = 0; // clears the hierarchy complete tag (amongst other things) newInterfaces = null; typeVariables = null; parameterizedInterfaces.clear(); @@ -1163,7 +1164,7 @@ public class ReferenceType extends ResolvedType { if (getDelegate() != null) { delegate.ensureConsistent(); } - if (isRawType()) { + if (isParameterizedOrRawType()) { ReferenceType genericType = getGenericType(); if (genericType != null) { genericType.ensureConsistent(); diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java index 9746fea81..688a5aa3d 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java @@ -50,7 +50,7 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl protected World world; - private int bits; + protected int bits; private static int AnnotationBitsInitialized = 0x0001; private static int AnnotationMarkedInherited = 0x0002; @@ -2798,10 +2798,19 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl } public void tagAsTypeHierarchyComplete() { + if (isParameterizedOrRawType()) { + ReferenceType genericType = this.getGenericType(); + genericType.tagAsTypeHierarchyComplete(); + return; + } bits |= TypeHierarchyCompleteBit; } public boolean isTypeHierarchyComplete() { + if (isParameterizedOrRawType()) { + ReferenceType genericType = this.getGenericType(); + return genericType.isTypeHierarchyComplete(); + } return (bits & TypeHierarchyCompleteBit) != 0; } diff --git a/tests/bugs181/433351/ClassProj1.java b/tests/bugs181/433351/ClassProj1.java new file mode 100644 index 000000000..ce06e88ab --- /dev/null +++ b/tests/bugs181/433351/ClassProj1.java @@ -0,0 +1,8 @@ +package test; + +public abstract class ClassProj1 implements InterfaceProj1 { + + public int aMethod() { + return 1; + } +} diff --git a/tests/bugs181/433351/ClassProj2.java b/tests/bugs181/433351/ClassProj2.java new file mode 100644 index 000000000..2aca8b08e --- /dev/null +++ b/tests/bugs181/433351/ClassProj2.java @@ -0,0 +1,9 @@ +package test.extender; + +public abstract class ClassProj2 implements InterfaceProj2 { + + public int bMethod() { + return 2; + } + +} diff --git a/tests/bugs181/433351/Extender2.aj b/tests/bugs181/433351/Extender2.aj new file mode 100644 index 000000000..351c70eeb --- /dev/null +++ b/tests/bugs181/433351/Extender2.aj @@ -0,0 +1,10 @@ +package test.extender; +import test.*; + +public aspect Extender2 { + + declare parents: InterfaceProj1 extends java.io.Serializable; + +// declare parents: test.ClassProj1 extends ClassProj2; + +} diff --git a/tests/bugs181/433351/Extender3.aj b/tests/bugs181/433351/Extender3.aj new file mode 100644 index 000000000..9fcda9e52 --- /dev/null +++ b/tests/bugs181/433351/Extender3.aj @@ -0,0 +1,10 @@ +package test.extender; +import test.*; + +public aspect Extender3 { + + declare parents: InterfaceProj1 extends InterfaceProj2; + + declare parents: test.ClassProj1 extends ClassProj2; + +} diff --git a/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java b/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java index 24c07b03f..44120eb47 100644 --- a/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java @@ -22,6 +22,18 @@ import org.aspectj.testing.XMLBasedAjcTestCase; */ public class Ajc181Tests extends org.aspectj.testing.XMLBasedAjcTestCase { + public void testJarWeaving_433351_4() { + runTest("jar weaving 4"); + } + + public void testJarWeaving_433351_3() { + runTest("jar weaving 3"); + } + + public void testJarWeaving_433351_2() { + runTest("jar weaving 2"); + } + public void testJarWeaving_433351() { runTest("jar weaving"); } diff --git a/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml b/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml index 314aaf712..576c741f6 100644 --- a/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml +++ b/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml @@ -3,12 +3,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java index 815becde0..ee232d082 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java @@ -1297,6 +1297,10 @@ public class BcelWeaver { // resolve it if the caller could not pass in the resolved type resolvedTypeToWeave = world.resolve(typeToWeave); } +// if (resolvedTypeToWeave.isTypeHierarchyComplete()) { +// typesForWeaving.remove(typeToWeave); +// return; +// } ResolvedType superclassType = resolvedTypeToWeave.getSuperclass(); String superclassTypename = (superclassType == null ? null : superclassType.getName()); @@ -1319,7 +1323,11 @@ public class BcelWeaver { } ContextToken tok = CompilationAndWeavingContext.enteringPhase(CompilationAndWeavingContext.PROCESSING_DECLARE_PARENTS, resolvedTypeToWeave.getName()); - weaveParentTypeMungers(resolvedTypeToWeave); + // If A was processed before B (and was declared 'class A implements B') then there is no need to complete B again, it + // will have been done whilst processing A. + if (!resolvedTypeToWeave.isTypeHierarchyComplete()) { + weaveParentTypeMungers(resolvedTypeToWeave); + } CompilationAndWeavingContext.leavingPhase(tok); typesForWeaving.remove(typeToWeave); resolvedTypeToWeave.tagAsTypeHierarchyComplete(); -- 2.39.5