From 2b0e11d8633c84e8b0827e0eb77b4639fe0914e4 Mon Sep 17 00:00:00 2001 From: Andrew Clement Date: Tue, 15 Apr 2025 15:26:29 -0700 Subject: Fix more "Attempt to push null on operand stack" variants 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 --- .../ajdt/internal/compiler/ast/AdviceDeclaration.java | 7 +++---- tests/bugs1924/336/Bang.java | 17 +++++++++++++++++ tests/bugs1924/337/X.aj | 12 ++++++++++++ .../test/java/org/aspectj/systemtest/AllTests19.java | 4 +++- .../org/aspectj/systemtest/ajc1924/Bugs1924Tests.java | 8 ++++++++ .../systemtest/ajc1924/Java24PreviewFeaturesTests.java | 4 +--- .../org/aspectj/systemtest/ajc1924/ajc1924.xml | 10 ++++++++++ 7 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 tests/bugs1924/336/Bang.java create mode 100644 tests/bugs1924/337/X.aj 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 @@ + + + + + + + + + + -- cgit v1.2.3