diff options
author | Andrew Clement <aclement@vmware.com> | 2025-04-15 15:26:29 -0700 |
---|---|---|
committer | Andrew Clement <aclement@vmware.com> | 2025-04-15 15:26:29 -0700 |
commit | 2b0e11d8633c84e8b0827e0eb77b4639fe0914e4 (patch) | |
tree | 1a7973c688df646a7d7d6db43d5f7d95c63f3feb | |
parent | e0d2b60288f20d00071cf5e0134a31b5758bb006 (diff) | |
download | aspectj-master.tar.gz aspectj-master.zip |
This change fixes more cases in the *Declaration classes that generate code.
Both #336 and #337 are due to the same piece of code not correctly computing
the resolved position because of copying it from a source method when it needs
recomputing for the method being generated. In particular primitive types
and/or double slot types (like long or double) cause the code to miscompute
the resolved positions or set the wrong type of expected type on the stack.
Fixes #336
Fixes #337
7 files changed, 54 insertions, 8 deletions
diff --git a/org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java b/org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java index c91e1a424..10dc68406 100644 --- a/org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java +++ b/org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java @@ -196,7 +196,6 @@ public class AdviceDeclaration extends AjMethodDeclaration { private void generateProceedMethod(ClassScope classScope, ClassFile classFile) { MethodBinding binding = proceedMethodBinding; - classFile.generateMethodInfoHeader(binding); int methodAttributeOffset = classFile.contentsOffset; int attributeNumber = classFile.generateMethodInfoAttributes(binding, AstUtil.getAjSyntheticAttribute()); @@ -214,16 +213,17 @@ public class AdviceDeclaration extends AjMethodDeclaration { Argument[] arguments = this.arguments; if (arguments != null) { + int rp = 0; for (Argument argument: arguments) { LocalVariableBinding lvb = argument.binding; LocalVariableBinding lvbCopy = new LocalVariableBinding(lvb.name, lvb.type, lvb.modifiers, true); lvbCopy.declaration = new LocalDeclaration(argument.name, 0, 0); codeStream.record(lvbCopy); lvbCopy.recordInitializationStartPC(0); - lvbCopy.resolvedPosition = lvb.resolvedPosition; + lvbCopy.resolvedPosition = rp; + rp += InterTypeMethodDeclaration.getSlotSize(lvb.type.id); } } - codeStream.aload(closureIndex); // build the Object[] @@ -242,7 +242,6 @@ public class AdviceDeclaration extends AjMethodDeclaration { if (type.isBaseType()) { codeStream.invoke(Opcodes.OPC_invokestatic, AjTypeConstants.getConversionMethodToObject(classScope, type), null); } - codeStream.aastore(); } diff --git a/tests/bugs1924/336/Bang.java b/tests/bugs1924/336/Bang.java new file mode 100644 index 000000000..276484c51 --- /dev/null +++ b/tests/bugs1924/336/Bang.java @@ -0,0 +1,17 @@ +public class Bang { + +public static void main(String[] argv) { + new Bang().m("a",1,"b"); +} + + public int m(String a, int i, String b) { + return 42; + } + +} + +aspect X { + int around(String a, int b, String d): execution(* m(..)) && args(a,b,d) { + return proceed(a,b,d); + } +} diff --git a/tests/bugs1924/337/X.aj b/tests/bugs1924/337/X.aj new file mode 100644 index 000000000..922a6ab67 --- /dev/null +++ b/tests/bugs1924/337/X.aj @@ -0,0 +1,12 @@ +public aspect X {
+ pointcut p(long l): call(* F.m(..)) && args(l);
+ Object around (long id): p(id) { return null; }
+
+ public static void main(String []argv) {
+ new F().m(3L);
+ }
+}
+
+class F {
+ public void m(long r) {}
+}
diff --git a/tests/src/test/java/org/aspectj/systemtest/AllTests19.java b/tests/src/test/java/org/aspectj/systemtest/AllTests19.java index 494b051e3..b19cddff1 100644 --- a/tests/src/test/java/org/aspectj/systemtest/AllTests19.java +++ b/tests/src/test/java/org/aspectj/systemtest/AllTests19.java @@ -15,6 +15,7 @@ import org.aspectj.systemtest.ajc1920.AllTestsAspectJ1920; import org.aspectj.systemtest.ajc1921.AllTestsAspectJ1921; import org.aspectj.systemtest.ajc1922.AllTestsAspectJ1922; import org.aspectj.systemtest.ajc1923.AllTestsAspectJ1923; +import org.aspectj.systemtest.ajc1924.AllTestsAspectJ1924; import org.aspectj.systemtest.ajc193.AllTestsAspectJ193; import org.aspectj.systemtest.ajc195.AllTestsAspectJ195; import org.aspectj.systemtest.ajc196.AllTestsAspectJ196; @@ -47,8 +48,9 @@ public class AllTests19 { suite.addTest(AllTestsAspectJ1920.suite()); suite.addTest(AllTestsAspectJ1921.suite()); suite.addTest(AllTestsAspectJ1922.suite()); - // AspectJ_JDK_Update suite.addTest(AllTestsAspectJ1923.suite()); + // AspectJ_JDK_Update + suite.addTest(AllTestsAspectJ1924.suite()); suite.addTest(AllTests18.suite()); // $JUnit-END$ return suite; diff --git a/tests/src/test/java/org/aspectj/systemtest/ajc1924/Bugs1924Tests.java b/tests/src/test/java/org/aspectj/systemtest/ajc1924/Bugs1924Tests.java index e186993b2..aeb283c02 100644 --- a/tests/src/test/java/org/aspectj/systemtest/ajc1924/Bugs1924Tests.java +++ b/tests/src/test/java/org/aspectj/systemtest/ajc1924/Bugs1924Tests.java @@ -21,6 +21,14 @@ public class Bugs1924Tests extends XMLBasedAjcTestCase { public void testNothing() { } + + public void testGh336_ProceedCodeGenProblem() { + runTest("proceed code gen problem 1"); + } + + public void testGh337_ProceedCodeGenProblem() { + runTest("proceed code gen problem 2"); + } @Override protected java.net.URL getSpecFile() { diff --git a/tests/src/test/java/org/aspectj/systemtest/ajc1924/Java24PreviewFeaturesTests.java b/tests/src/test/java/org/aspectj/systemtest/ajc1924/Java24PreviewFeaturesTests.java index 3e95d587e..1143e604c 100644 --- a/tests/src/test/java/org/aspectj/systemtest/ajc1924/Java24PreviewFeaturesTests.java +++ b/tests/src/test/java/org/aspectj/systemtest/ajc1924/Java24PreviewFeaturesTests.java @@ -25,9 +25,7 @@ public class Java24PreviewFeaturesTests extends JavaVersionSpecificXMLBasedAjcTe return XMLBasedAjcTestCase.loadSuite(Java24PreviewFeaturesTests.class); } - public void testJep455PrimitivePatternsSwitch1() { - fail(); -// runTest("primitive types patterns - switch"); + public void testNothing() { } @Override diff --git a/tests/src/test/resources/org/aspectj/systemtest/ajc1924/ajc1924.xml b/tests/src/test/resources/org/aspectj/systemtest/ajc1924/ajc1924.xml index 137932609..000719f38 100644 --- a/tests/src/test/resources/org/aspectj/systemtest/ajc1924/ajc1924.xml +++ b/tests/src/test/resources/org/aspectj/systemtest/ajc1924/ajc1924.xml @@ -45,5 +45,15 @@ </run> </ajc-test> + <ajc-test dir="bugs1924/336" vm="24" title="proceed code gen problem 1"> + <compile files="Bang.java" options="-17"/> + <run class="Bang"/> + </ajc-test> + + <ajc-test dir="bugs1924/337" vm="24" title="proceed code gen problem 2"> + <compile files="X.aj" options="-17"/> + <run class="X"/> + </ajc-test> + </suite> |