diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2014-09-16 15:27:54 +0200 |
---|---|---|
committer | mikaelpeltier <mikaelpeltier@google.com> | 2014-09-22 09:41:58 +0200 |
commit | da7d63ab98c2f62cafd28f1135e8fadc91ae7c28 (patch) | |
tree | 941ae52cec6fc67235fa636abd629922b9160b01 | |
parent | bd2d95ccb1f7169aa50820f3112facc88c1b90cd (diff) | |
download | toolchain_jack-da7d63ab98c2f62cafd28f1135e8fadc91ae7c28.zip toolchain_jack-da7d63ab98c2f62cafd28f1135e8fadc91ae7c28.tar.gz toolchain_jack-da7d63ab98c2f62cafd28f1135e8fadc91ae7c28.tar.bz2 |
Add an AST checker
- Currently ast checker, check only parents
- Now, parent checking is more precise since it use the checkValidity
method that checks also type of parent node.
Bug: 14101350
Change-Id: I5ba04a40cb5d14e7272df3e1768126b5b3f58a98
30 files changed, 234 insertions, 33 deletions
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java index be20715..02838ad 100644 --- a/jack/src/com/android/jack/Jack.java +++ b/jack/src/com/android/jack/Jack.java @@ -226,8 +226,8 @@ import com.android.jack.transformations.flow.FlowNormalizer; import com.android.jack.transformations.flow.FlowNormalizerSchedulingSeparator; import com.android.jack.transformations.parent.DeclaredTypePackageChecker; import com.android.jack.transformations.parent.PackageChecker; -import com.android.jack.transformations.parent.ParentChecker; -import com.android.jack.transformations.parent.TypeParentChecker; +import com.android.jack.transformations.parent.AstChecker; +import com.android.jack.transformations.parent.TypeAstChecker; import com.android.jack.transformations.renamepackage.PackageRenamer; import com.android.jack.transformations.rop.cast.RopCastLegalizer; import com.android.jack.transformations.threeaddresscode.ThreeAddressCodeBuilder; @@ -884,7 +884,7 @@ public abstract class Jack { } if (hasSanityChecks) { - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); } { @@ -1129,13 +1129,13 @@ public abstract class Jack { } } if (hasSanityChecks) { - typePlan5.append(TypeParentChecker.class); + typePlan5.append(TypeAstChecker.class); } typePlan5.append(OneDexPerTypeWriter.class); } if (hasSanityChecks) { - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); { SubPlanBuilder<JDefinedClassOrInterface> typePlan = planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); @@ -1167,7 +1167,7 @@ public abstract class Jack { appendMultiDexAndShrobStartPlan(planBuilder); if (hasSanityChecks) { - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); } { SubPlanBuilder<JDefinedClassOrInterface> typePlan7 = @@ -1396,7 +1396,7 @@ public abstract class Jack { appendMultiDexAndShrobStartPlan(planBuilder); if (hasSanityChecks) { - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); } { SubPlanBuilder<JDefinedClassOrInterface> typePlan3 = @@ -1529,13 +1529,13 @@ public abstract class Jack { } } if (hasSanityChecks) { - typePlan5.append(TypeParentChecker.class); + typePlan5.append(TypeAstChecker.class); } typePlan5.append(OneDexPerTypeWriter.class); } if (hasSanityChecks) { - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); } } diff --git a/jack/src/com/android/jack/ir/InternalCompilerException.java b/jack/src/com/android/jack/ir/InternalCompilerException.java index 8f38077..6e6ccbc 100644 --- a/jack/src/com/android/jack/ir/InternalCompilerException.java +++ b/jack/src/com/android/jack/ir/InternalCompilerException.java @@ -20,6 +20,8 @@ import com.android.jack.ir.sourceinfo.SourceInfo; import java.util.ArrayList; import java.util.List; +import javax.annotation.Nonnull; + /** * Indicates the compiler encountered an unexpected and unsupported state of * operation. @@ -73,6 +75,7 @@ public class InternalCompilerException extends RuntimeException { /** * Tracks if there's a pending addNode() to avoid recursion sickness. */ + @Nonnull private static final ThreadLocal<InternalCompilerException> pendingICE = new ThreadLocal<InternalCompilerException>(); @@ -87,34 +90,44 @@ public class InternalCompilerException extends RuntimeException { pendingICE.set(pendingICE.get()); } + @Nonnull private final List<NodeInfo> nodeTrace = new ArrayList<NodeInfo>(); /** * Constructs a new exception with the specified node, message, and cause. */ - public InternalCompilerException(HasSourceInfo node, String message, Throwable cause) { + public InternalCompilerException(@Nonnull HasSourceInfo node, @Nonnull String message, + @Nonnull Throwable cause) { this(message, cause); addNode(node); } /** + * Constructs a new exception with the specified node and message. + */ + public InternalCompilerException(@Nonnull HasSourceInfo node, @Nonnull String message) { + this(message); + addNode(node); + } + + /** * Constructs a new exception with the specified message. */ - public InternalCompilerException(String message) { + public InternalCompilerException(@Nonnull String message) { super(message); } /** * Constructs a new exception with the specified cause. */ - public InternalCompilerException(Throwable cause) { + public InternalCompilerException(@Nonnull Throwable cause) { super(cause); } /** * Constructs a new exception with the specified message and cause. */ - public InternalCompilerException(String message, Throwable cause) { + public InternalCompilerException(@Nonnull String message, @Nonnull Throwable cause) { super(message, cause); } @@ -122,7 +135,7 @@ public class InternalCompilerException extends RuntimeException { * Adds a node to the end of the node trace. This is similar to how a stack * trace works. */ - public void addNode(HasSourceInfo node) { + public void addNode(@Nonnull HasSourceInfo node) { InternalCompilerException other = pendingICE.get(); if (other != null) { // Avoiding recursion sickness: Yet Another ICE must have occurred while @@ -150,8 +163,8 @@ public class InternalCompilerException extends RuntimeException { } /** - * Adds information about a a node to the end of the node trace. This is - * similar to how a stack trace works. + * Adds information about a a node to the end of the node trace. + * This is similar to how a stack trace works. */ public void addNode(String className, String description, SourceInfo sourceInfo) { nodeTrace.add(new NodeInfo(className, description, sourceInfo)); @@ -164,6 +177,7 @@ public class InternalCompilerException extends RuntimeException { * list is the node that was most specifically being visited when the * exception was thrown. */ + @Nonnull public List<NodeInfo> getNodeTrace() { return nodeTrace; } diff --git a/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java b/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java index 2239a2e..17287d6 100644 --- a/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java +++ b/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Description; @@ -39,4 +40,11 @@ public abstract class JAbstractMethodBody extends JNode { public void setMethod(JMethod method) { this.method = method; } + + @Override + public void checkValidity() { + if (!(parent instanceof JMethod)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java b/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java index 6b20680..89dabe3 100644 --- a/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java +++ b/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java @@ -17,6 +17,7 @@ package com.android.jack.ir.ast; import com.android.jack.Jack; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -158,4 +159,13 @@ public class JAnnotationLiteral extends JLiteral { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JDefinedClassOrInterface || parent instanceof JMethod + || parent instanceof JField || parent instanceof JVariable + || parent instanceof JArrayLiteral || parent instanceof JNameValuePair)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java b/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java index bad4e87..9a29c88 100644 --- a/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java +++ b/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.load.MethodLoader; import com.android.sched.item.Description; @@ -93,4 +94,11 @@ public class JAnnotationMethod extends JMethod { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JDefinedAnnotation)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JArrayType.java b/jack/src/com/android/jack/ir/ast/JArrayType.java index 6413ca6..48d97d1 100644 --- a/jack/src/com/android/jack/ir/ast/JArrayType.java +++ b/jack/src/com/android/jack/ir/ast/JArrayType.java @@ -128,4 +128,9 @@ public class JArrayType extends JDefinedReferenceType { return false; } } + + @Override + public void checkValidity() { + throw new AssertionError(); + } } diff --git a/jack/src/com/android/jack/ir/ast/JCaseStatement.java b/jack/src/com/android/jack/ir/ast/JCaseStatement.java index 4b846d0..cb2b40e 100644 --- a/jack/src/com/android/jack/ir/ast/JCaseStatement.java +++ b/jack/src/com/android/jack/ir/ast/JCaseStatement.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -77,4 +78,11 @@ public class JCaseStatement extends JStatement { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JSwitchStatement || parent instanceof JBlock)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java b/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java index 803d2b3..a301675 100644 --- a/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java +++ b/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java @@ -17,6 +17,7 @@ package com.android.jack.ir.ast; import com.android.jack.Jack; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.load.ClassOrInterfaceLoader; import com.android.jack.load.NopClassOrInterfaceLoader; @@ -597,4 +598,11 @@ public abstract class JDefinedClassOrInterface extends JDefinedReferenceType return false; } } + + @Override + public void checkValidity() { + if (!(parent instanceof JPackage)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JEnumField.java b/jack/src/com/android/jack/ir/ast/JEnumField.java index d417485..6cc38b1 100644 --- a/jack/src/com/android/jack/ir/ast/JEnumField.java +++ b/jack/src/com/android/jack/ir/ast/JEnumField.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Description; import com.android.sched.transform.TransformRequest; @@ -54,4 +55,11 @@ public class JEnumField extends JField { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JDefinedEnum)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JExpression.java b/jack/src/com/android/jack/ir/ast/JExpression.java index 2fc9e9e..1ec8cab 100644 --- a/jack/src/com/android/jack/ir/ast/JExpression.java +++ b/jack/src/com/android/jack/ir/ast/JExpression.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Description; @@ -42,4 +43,11 @@ public abstract class JExpression extends JNode implements HasType { public JExpressionStatement makeStatement() { return new JExpressionStatement(getSourceInfo(), this); } + + @Override + public void checkValidity() { + if (!(parent instanceof JExpression || parent instanceof JStatement)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JField.java b/jack/src/com/android/jack/ir/ast/JField.java index adb3230..22a703c 100644 --- a/jack/src/com/android/jack/ir/ast/JField.java +++ b/jack/src/com/android/jack/ir/ast/JField.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -264,4 +265,11 @@ public class JField extends JNode implements HasName, HasType, JVisitable, CanBe super.transform(existingNode, newNode, transformation); } } + + @Override + public void checkValidity() { + if (!(parent instanceof JDefinedClassOrInterface)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JLabel.java b/jack/src/com/android/jack/ir/ast/JLabel.java index 478406d..2e91bc8 100644 --- a/jack/src/com/android/jack/ir/ast/JLabel.java +++ b/jack/src/com/android/jack/ir/ast/JLabel.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.StringInterner; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; @@ -60,4 +61,12 @@ public class JLabel extends JNode implements HasName { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JLabeledStatement || parent instanceof JBreakStatement + || parent instanceof JContinueStatement)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JLiteral.java b/jack/src/com/android/jack/ir/ast/JLiteral.java index 139fed2..bc91551 100644 --- a/jack/src/com/android/jack/ir/ast/JLiteral.java +++ b/jack/src/com/android/jack/ir/ast/JLiteral.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Description; @@ -27,4 +28,17 @@ public abstract class JLiteral extends JExpression { public JLiteral(SourceInfo sourceInfo) { super(sourceInfo); } + + @Override + public void checkValidity() { + if (!(parent instanceof JExpression || parent instanceof JNameValuePair + || parent instanceof JAssertStatement || parent instanceof JCaseStatement + || parent instanceof JDoStatement || parent instanceof JForStatement + || parent instanceof JIfStatement || parent instanceof JReturnStatement + || parent instanceof JSwitchStatement || parent instanceof JAnnotationMethod + || parent instanceof JFieldInitializer || parent instanceof JWhileStatement + || parent instanceof JSynchronizedBlock)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JLocal.java b/jack/src/com/android/jack/ir/ast/JLocal.java index 3d862e3..1919776 100644 --- a/jack/src/com/android/jack/ir/ast/JLocal.java +++ b/jack/src/com/android/jack/ir/ast/JLocal.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -76,4 +77,11 @@ public class JLocal extends JVariable implements HasEnclosingMethod { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JMethodBody || parent instanceof JCatchBlock)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JMethod.java b/jack/src/com/android/jack/ir/ast/JMethod.java index 1ecfb11..9022bc9 100644 --- a/jack/src/com/android/jack/ir/ast/JMethod.java +++ b/jack/src/com/android/jack/ir/ast/JMethod.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.load.MethodLoader; import com.android.jack.util.NamingTools; @@ -413,4 +414,11 @@ public class JMethod extends JNode implements HasEnclosingType, HasName, HasType public void removeLoader() { loader = NopMethodLoader.INSTANCE; } + + @Override + public void checkValidity() { + if (!(parent instanceof JDefinedClassOrInterface)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JNameValuePair.java b/jack/src/com/android/jack/ir/ast/JNameValuePair.java index 7b01753..ad02345 100644 --- a/jack/src/com/android/jack/ir/ast/JNameValuePair.java +++ b/jack/src/com/android/jack/ir/ast/JNameValuePair.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -109,4 +110,11 @@ public final class JNameValuePair extends JNode { public void resolveMethodId(@Nonnull JMethodId methodId) { this.methodId = methodId; } + + @Override + public void checkValidity() { + if (!(parent instanceof JAnnotationLiteral)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JNode.java b/jack/src/com/android/jack/ir/ast/JNode.java index 50005b7..70a0a50 100644 --- a/jack/src/com/android/jack/ir/ast/JNode.java +++ b/jack/src/com/android/jack/ir/ast/JNode.java @@ -90,7 +90,7 @@ public abstract class JNode extends LocalMarkerManager @Nonnull protected SourceInfo info; - private JNode parent = null; + protected JNode parent = null; protected JNode(@Nonnull SourceInfo info) { assert info != null : "SourceInfo must be provided for JNodes"; @@ -292,4 +292,6 @@ public abstract class JNode extends LocalMarkerManager @Nonnull SubTreeMarkersCollector<T> collector) { return collector.getSubTreeMarkersOnPreviousSibling(this); } + + public abstract void checkValidity(); } diff --git a/jack/src/com/android/jack/ir/ast/JNullType.java b/jack/src/com/android/jack/ir/ast/JNullType.java index c06c82c..bf1db2e 100644 --- a/jack/src/com/android/jack/ir/ast/JNullType.java +++ b/jack/src/com/android/jack/ir/ast/JNullType.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -66,4 +67,11 @@ public class JNullType extends JReferenceTypeCommon { public final boolean isSameType(@Nonnull JType type) { return this == type; } + + @Override + public void checkValidity() { + if (!(parent instanceof JExpression)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JPackage.java b/jack/src/com/android/jack/ir/ast/JPackage.java index d43db87..1a96447 100644 --- a/jack/src/com/android/jack/ir/ast/JPackage.java +++ b/jack/src/com/android/jack/ir/ast/JPackage.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.StringInterner; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.load.PackageLoader; @@ -498,4 +499,11 @@ public class JPackage extends JNode implements HasName, CanBeRenamed, HasEnclosi } } } + + @Override + public void checkValidity() { + if (!(parent instanceof JPackage || parent instanceof JSession)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JParameter.java b/jack/src/com/android/jack/ir/ast/JParameter.java index dec9ce6..51caa6d 100644 --- a/jack/src/com/android/jack/ir/ast/JParameter.java +++ b/jack/src/com/android/jack/ir/ast/JParameter.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -62,4 +63,11 @@ public class JParameter extends JVariable implements HasEnclosingMethod { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JMethod)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java b/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java index a3ed01d..ad2420c 100644 --- a/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java +++ b/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.util.NamingTools; import com.android.sched.item.Component; @@ -170,4 +171,11 @@ public class JPhantomClassOrInterface extends JReferenceTypeCommon implements JC return false; } } + + @Override + public void checkValidity() { + if (!(parent instanceof JPackage)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JPrimitiveType.java b/jack/src/com/android/jack/ir/ast/JPrimitiveType.java index 8d3a2e2..a2dab3b 100644 --- a/jack/src/com/android/jack/ir/ast/JPrimitiveType.java +++ b/jack/src/com/android/jack/ir/ast/JPrimitiveType.java @@ -17,6 +17,7 @@ package com.android.jack.ir.ast; import com.android.jack.Jack; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.StringInterner; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.ir.types.JFloatingPointType; @@ -162,6 +163,14 @@ public abstract class JPrimitiveType extends JNode implements JType { .isSameType(candidate); } + @Override + public void checkValidity() { + if (!(parent instanceof JLocal || parent instanceof JParameter || parent instanceof JMethod + || parent instanceof JField || parent instanceof JCastOperation)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } + @Nonnull public abstract JPrimitiveTypeEnum getPrimitiveTypeEnum(); diff --git a/jack/src/com/android/jack/ir/ast/JSession.java b/jack/src/com/android/jack/ir/ast/JSession.java index 67efccc..6c82d41 100644 --- a/jack/src/com/android/jack/ir/ast/JSession.java +++ b/jack/src/com/android/jack/ir/ast/JSession.java @@ -16,6 +16,7 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.ast.JPrimitiveType.JPrimitiveTypeEnum; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.jack.ir.sourceinfo.SourceInfoFactory; @@ -158,4 +159,11 @@ public class JSession extends JNode { } return primitiveArrays[primitive.ordinal()]; } + + @Override + public void checkValidity() { + if (parent != null) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JStatement.java b/jack/src/com/android/jack/ir/ast/JStatement.java index 04b5e76..763b152 100644 --- a/jack/src/com/android/jack/ir/ast/JStatement.java +++ b/jack/src/com/android/jack/ir/ast/JStatement.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Description; @@ -71,4 +72,11 @@ public abstract class JStatement extends JNode { public List<JCatchBlock> getJCatchBlocks() { return catchBlocks; } + + @Override + public void checkValidity() { + if (!(parent instanceof JStatement || parent instanceof JAbstractMethodBody)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } } diff --git a/jack/src/com/android/jack/ir/ast/JThis.java b/jack/src/com/android/jack/ir/ast/JThis.java index 6005bc0..21b1091 100644 --- a/jack/src/com/android/jack/ir/ast/JThis.java +++ b/jack/src/com/android/jack/ir/ast/JThis.java @@ -15,6 +15,7 @@ */ package com.android.jack.ir.ast; +import com.android.jack.ir.InternalCompilerException; import com.android.jack.ir.sourceinfo.SourceInfo; import com.android.sched.item.Component; import com.android.sched.item.Description; @@ -62,4 +63,11 @@ public class JThis extends JVariable implements HasEnclosingMethod { throws Exception { visitor.visit(this, transformRequest); } + + @Override + public void checkValidity() { + if (!(parent instanceof JMethod)) { + throw new InternalCompilerException(this, "Invalid parent"); + } + } }
\ No newline at end of file diff --git a/jack/src/com/android/jack/transformations/parent/ParentChecker.java b/jack/src/com/android/jack/transformations/parent/AstChecker.java index 984bc2d..a74d897 100644 --- a/jack/src/com/android/jack/transformations/parent/ParentChecker.java +++ b/jack/src/com/android/jack/transformations/parent/AstChecker.java @@ -29,22 +29,24 @@ import java.util.Stack; import javax.annotation.Nonnull; /** - * Check that parents of {@link JNode}s are correctly set. + * Check that AST of {@link JNode}s is correct. */ -@Description("Check that parents of JNodes are correctly set.") +@Description("Check that AST is correct.") @Support(SanityChecks.class) -public class ParentChecker implements RunnableSchedulable<JSession> { +public class AstChecker implements RunnableSchedulable<JSession> { - private static class ParentCheckerVisitor extends JVisitor { + static class AstCheckerVisitor extends JVisitor { @Nonnull private final Stack<JNode> nodes = new Stack<JNode>(); - private ParentCheckerVisitor() { + AstCheckerVisitor() { super(false /* needLoading */); } @Override public boolean visit(@Nonnull JNode node) { + node.checkValidity(); + if (node instanceof JSession) { if (node.getParent() != null) { throw new AssertionError("Parent of JSession must be null."); @@ -70,7 +72,7 @@ public class ParentChecker implements RunnableSchedulable<JSession> { @Override public void run(@Nonnull JSession session) throws Exception { - ParentCheckerVisitor checker = new ParentCheckerVisitor(); + AstCheckerVisitor checker = new AstCheckerVisitor(); checker.accept(session); } }
\ No newline at end of file diff --git a/jack/src/com/android/jack/transformations/parent/TypeParentChecker.java b/jack/src/com/android/jack/transformations/parent/TypeAstChecker.java index 98470d9..f52a669 100644 --- a/jack/src/com/android/jack/transformations/parent/TypeParentChecker.java +++ b/jack/src/com/android/jack/transformations/parent/TypeAstChecker.java @@ -30,13 +30,12 @@ import java.util.Stack; import javax.annotation.Nonnull; /** - * Check that parents of {@link JNode}s are correctly set, running on + * Check that AST of {@link JNode}s is correct, running on * {@link JDefinedClassOrInterface}s. */ -@Description( - "Check that parents of JNodes are correctly set, running on JDefinedClassOrInterfaces.") +@Description("Check that AST of JNodes is correct, running on JDefinedClassOrInterfaces.") @Support(SanityChecks.class) -public class TypeParentChecker implements RunnableSchedulable<JDefinedClassOrInterface> { +public class TypeAstChecker implements RunnableSchedulable<JDefinedClassOrInterface> { private static class Visitor extends JVisitor { @Nonnull @@ -49,6 +48,7 @@ public class TypeParentChecker implements RunnableSchedulable<JDefinedClassOrInt @Override public boolean visit(@Nonnull JNode node) { assert !(node instanceof JSession); + node.checkValidity(); if (node instanceof JDefinedClassOrInterface) { if (node.getParent() == null) { throw new AssertionError( diff --git a/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java b/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java index 3ba6e52..6778d16 100644 --- a/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java +++ b/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java @@ -24,7 +24,7 @@ import com.android.jack.ir.ast.JMethod; import com.android.jack.ir.ast.JSession; import com.android.jack.scheduling.adapter.JDefinedClassOrInterfaceAdapter; import com.android.jack.scheduling.adapter.JMethodAdapter; -import com.android.jack.transformations.parent.ParentChecker; +import com.android.jack.transformations.parent.AstChecker; import com.android.sched.scheduler.PlanBuilder; import com.android.sched.scheduler.Request; import com.android.sched.scheduler.SchedulableManager; @@ -89,7 +89,7 @@ public class BlockStatisticsOnCore { sr.addInitialTagOrMarker(JavaSourceIr.class); PlanBuilder<JSession> planBuilder = sr.getPlanBuilder(JSession.class); - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); SubPlanBuilder<JDefinedClassOrInterface> typePlan = planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); SubPlanBuilder<JMethod> methodPlan = typePlan.appendSubPlan(JMethodAdapter.class); methodPlan.append(BlockStatistics.class); diff --git a/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java b/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java index edfd77c..7d9a920 100644 --- a/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java +++ b/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java @@ -25,7 +25,7 @@ import com.android.jack.ir.ast.JMethod; import com.android.jack.ir.ast.JSession; import com.android.jack.scheduling.adapter.JDefinedClassOrInterfaceAdapter; import com.android.jack.scheduling.adapter.JMethodAdapter; -import com.android.jack.transformations.parent.ParentChecker; +import com.android.jack.transformations.parent.AstChecker; import com.android.jack.util.filter.SignatureMethodFilter; import com.android.sched.scheduler.PlanBuilder; import com.android.sched.scheduler.Request; @@ -120,7 +120,7 @@ public class ImplicitBlockTest { sr.addInitialTagOrMarker(JavaSourceIr.class); PlanBuilder<JSession> planBuilder = sr.getPlanBuilder(JSession.class); - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); SubPlanBuilder<JDefinedClassOrInterface> typePlan = planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); SubPlanBuilder<JMethod> methodPlan = typePlan.appendSubPlan(JMethodAdapter.class); methodPlan.append(ImplicitBlocks.class); diff --git a/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java b/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java index 47bb69f..fbc2e97 100644 --- a/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java +++ b/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java @@ -32,7 +32,7 @@ import com.android.jack.ir.ast.JUnlock; import com.android.jack.ir.ast.JVariableRef; import com.android.jack.scheduling.adapter.JDefinedClassOrInterfaceAdapter; import com.android.jack.scheduling.adapter.JMethodAdapter; -import com.android.jack.transformations.parent.ParentChecker; +import com.android.jack.transformations.parent.AstChecker; import com.android.jack.util.filter.SignatureMethodFilter; import com.android.sched.scheduler.PlanBuilder; import com.android.sched.scheduler.Request; @@ -154,7 +154,7 @@ public class SynchronizedTest { sr.addInitialTagsOrMarkers(Jack.getJavaSourceInitialTagSet()); PlanBuilder<JSession> planBuilder = sr.getPlanBuilder(JSession.class); - planBuilder.append(ParentChecker.class); + planBuilder.append(AstChecker.class); SubPlanBuilder<JDefinedClassOrInterface> typePlan = planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class); SubPlanBuilder<JMethod> methodPlan = typePlan.appendSubPlan(JMethodAdapter.class); |