From ba41fae6547688e8714d01be27bc81dbbe850f55 Mon Sep 17 00:00:00 2001 From: jhugunin Date: Wed, 2 Jul 2003 23:12:18 +0000 Subject: [PATCH] tests and fixes for two awful error message bugs: [Bug 39458] New: Compiler crash in ajc 1.1 [Bug 39460] New: Missing import crashes compiler --- .../compiler/ast/AccessForInlineVisitor.java | 15 +++------ .../compiler/ast/AdviceDeclaration.java | 2 +- .../compiler/lookup/PrivilegedHandler.java | 9 +++-- tests/ajcTests.xml | 20 +++++++++++ tests/ajcTestsFailing.xml | 1 + tests/bugs/MissingImport.java | 22 +++++++++++++ tests/bugs/NewVoid.java | 33 +++++++++++++++++++ 7 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 tests/bugs/MissingImport.java create mode 100644 tests/bugs/NewVoid.java diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java index 76acd7306..c692d1b4c 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java @@ -100,7 +100,7 @@ public class AccessForInlineVisitor extends AbstractSyntaxTreeVisitorAdapter { } public void endVisit(MessageSend send, BlockScope scope) { if (send instanceof Proceed) return; - if (send.binding == null) return; + if (send.binding == null || !send.binding.isValidBinding()) return; if (send.isSuperAccess() && !send.binding.isStatic()) { send.receiver = new ThisReference(send.sourceStart, send.sourceEnd); @@ -111,7 +111,7 @@ public class AccessForInlineVisitor extends AbstractSyntaxTreeVisitorAdapter { } } public void endVisit(AllocationExpression send, BlockScope scope) { - if (send.binding == null) return; + if (send.binding == null || !send.binding.isValidBinding()) return; //XXX TBD if (isPublic(send.binding)) return; makePublic(send.binding.declaringClass); @@ -121,14 +121,14 @@ public class AccessForInlineVisitor extends AbstractSyntaxTreeVisitorAdapter { QualifiedTypeReference ref, BlockScope scope) { - makePublic(ref.getTypeBinding(scope)); //??? might be trouble + makePublic(ref.resolvedType); //getTypeBinding(scope)); //??? might be trouble } public void endVisit( SingleTypeReference ref, BlockScope scope) { - makePublic(ref.getTypeBinding(scope)); //??? might be trouble + makePublic(ref.resolvedType); //getTypeBinding(scope)); //??? might be trouble } private FieldBinding getAccessibleField(FieldBinding binding) { @@ -208,16 +208,11 @@ public class AccessForInlineVisitor extends AbstractSyntaxTreeVisitorAdapter { return; } } - /* (non-Javadoc) - * @see org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor#endVisit(org.eclipse.jdt.internal.compiler.ast.AssertStatement, org.eclipse.jdt.internal.compiler.lookup.BlockScope) - */ + public void endVisit(AssertStatement assertStatement, BlockScope scope) { isInlinable = false; } - /* (non-Javadoc) - * @see org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor#endVisit(org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess, org.eclipse.jdt.internal.compiler.lookup.BlockScope) - */ public void endVisit(ClassLiteralAccess classLiteral, BlockScope scope) { isInlinable = false; } diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java index aabc84624..122760fc2 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java @@ -156,7 +156,7 @@ public class AdviceDeclaration extends MethodDeclaration { PrivilegedHandler handler = (PrivilegedHandler)upperScope.referenceContext.binding.privilegedHandler; if (handler == null) { handler = new PrivilegedHandler((AspectDeclaration)upperScope.referenceContext); - upperScope.referenceContext.binding.privilegedHandler = handler; + //upperScope.referenceContext.binding.privilegedHandler = handler; } this.traverse(new MakeDeclsPublicVisitor(), (ClassScope)null); diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java index 3343e0634..ac410b896 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java @@ -19,6 +19,7 @@ import java.util.Iterator; import java.util.Map; import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration; +import org.aspectj.ajdt.internal.compiler.ast.AstUtil; import org.aspectj.bridge.ISourceLocation; import org.aspectj.weaver.AjcMemberMaker; import org.aspectj.weaver.Lint; @@ -55,19 +56,21 @@ public class PrivilegedHandler implements IPrivilegedHandler { public MethodBinding getPrivilegedAccessMethod(MethodBinding baseMethod, AstNode location) { if (baseMethod.alwaysNeedsAccessMethod()) return baseMethod; - ResolvedMember key = inAspect.factory.makeResolvedMember(baseMethod); + ResolvedMember key = EclipseFactory.makeResolvedMember(baseMethod); if (accessors.containsKey(key)) return (MethodBinding)accessors.get(key); MethodBinding ret; if (baseMethod.isConstructor()) { - ret = baseMethod; + ret = new MethodBinding(baseMethod, baseMethod.declaringClass); + ret.modifiers = AstUtil.makePublic(ret.modifiers); } else { ret = inAspect.factory.makeMethodBinding( AjcMemberMaker.privilegedAccessMethodForMethod(inAspect.typeX, key) ); } checkWeaveAccess(key.getDeclaringType(), location); - //new PrivilegedMethodBinding(inAspect, baseMethod); + //System.err.println(ret); + //Thread.dumpStack(); accessors.put(key, ret); return ret; } diff --git a/tests/ajcTests.xml b/tests/ajcTests.xml index 1419fc198..8cf4bbc76 100644 --- a/tests/ajcTests.xml +++ b/tests/ajcTests.xml @@ -6388,4 +6388,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/tests/ajcTestsFailing.xml b/tests/ajcTestsFailing.xml index 50d4ab090..cb741c1e0 100644 --- a/tests/ajcTestsFailing.xml +++ b/tests/ajcTestsFailing.xml @@ -4,4 +4,5 @@ + diff --git a/tests/bugs/MissingImport.java b/tests/bugs/MissingImport.java new file mode 100644 index 000000000..c70129e50 --- /dev/null +++ b/tests/bugs/MissingImport.java @@ -0,0 +1,22 @@ +import org.aspectj.lang.*; +import org.aspectj.lang.reflect.*; +import java.lang.reflect.Method; +//import java.lang.reflect.InvocationTargetException; <- crash with this line commented out + +public aspect MissingImport { + Object around() : + call(* *(..)) && !within(ImposterProcessing+) { + MethodSignature sig = (MethodSignature)thisJoinPoint.getSignature(); + try { + Method meth = ImposterProcessing.class.getMethod("dynamicThrow", new Class[] { Throwable.class }); + meth.invoke(this, new Object[] { null }); + } catch (InvocationTargetException e) { // expect CE + throw new RuntimeException("framework error in throwing test exception ", e); + } catch (IllegalAccessException e) { + throw new RuntimeException("framework error in throwing test exception ", e); + } + return null; + } +} + +class ImposterProcessing { } \ No newline at end of file diff --git a/tests/bugs/NewVoid.java b/tests/bugs/NewVoid.java new file mode 100644 index 000000000..0162b5313 --- /dev/null +++ b/tests/bugs/NewVoid.java @@ -0,0 +1,33 @@ +import org.aspectj.lang.*; +import org.aspectj.lang.reflect.*; +import java.lang.reflect.Method; + +public aspect NewVoid { + Object around() : + call(new(..)) { + return proceed(); + } + + + Object around() : + call(* *(..)) { + MethodSignature sig = (MethodSignature)thisJoinPoint.getSignature(); + Class returnType = sig.getReturnType(); + if (returnType == java.lang.Void.TYPE) { + return new java.lang.Void(); // expect CE here + } else { + String s = "hi"; + Xyz xyz = null; // expect CE here + int x = s.count; // expect CE here + return proceed(); + } + } +} +privileged aspect PrivCheck { + Object around() : call(* *(..)) { + Xyz xyz = null; // expect CE here + Object o = new Void(); // expect warning here + int x = "goo".count; // expect warning here + return null; + } +} \ No newline at end of file -- 2.39.5