aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhugunin <jhugunin>2003-07-02 23:12:18 +0000
committerjhugunin <jhugunin>2003-07-02 23:12:18 +0000
commitba41fae6547688e8714d01be27bc81dbbe850f55 (patch)
tree942e8dfd6ff41b9c2c7d64485734020d9b38b48d
parent2e3c9191a9cb753ff54cf20592dcd0ef14bfc83a (diff)
downloadaspectj-ba41fae6547688e8714d01be27bc81dbbe850f55.tar.gz
aspectj-ba41fae6547688e8714d01be27bc81dbbe850f55.zip
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
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java15
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java2
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java9
-rw-r--r--tests/ajcTests.xml20
-rw-r--r--tests/ajcTestsFailing.xml1
-rw-r--r--tests/bugs/MissingImport.java22
-rw-r--r--tests/bugs/NewVoid.java33
7 files changed, 88 insertions, 14 deletions
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 @@
<compile files="TrySwitch.java"/>
<run class="TrySwitch"/>
</ajc-test>
+
+ <ajc-test dir="bugs" pr="39458"
+ title="Compiler crash in ajc 1.1 - terrible error for inaccessible constructor">
+ <compile files="NewVoid.java">
+ <message kind="error" line="17"/>
+ <message kind="error" line="20"/>
+ <message kind="error" line="21"/>
+
+ <message kind="error" line="28"/>
+ <message kind="warning" line="29"/>
+ <message kind="warning" line="30"/>
+ </compile>
+ </ajc-test>
+
+ <ajc-test dir="bugs" pr="39460"
+ title="Missing import crashes compiler">
+ <compile files="MissingImport.java">
+ <message kind="error" line="13"/>
+ </compile>
+ </ajc-test>
</suite>
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 @@
<!-- contains valid tests that the compiler has never passed -->
<suite>
+
</suite>
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