ExpressionAnalyzer fix for clinit field refs. Fixes a bug in ExpressionAnalyzer were clinit-triggering field refs were not being considered. This could cause bugs in the inliner where clinits would be dropped. Found by: spoon Review by: spoon git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7310 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java index d8c9904..18005f0 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java
@@ -130,6 +130,10 @@ accessesFieldNonFinal = true; } + if (x.hasClinit()) { + recordMethodCall(); + } + JExpression instance = x.getInstance(); if (instance == null) { return; @@ -159,15 +163,7 @@ @Override public void endVisit(JMethodCall x, Context ctx) { - /* - * We can't assume anything about method calls right now, except that it - * can't assign to one of our locals or one of our parameters. It's possible - * that it could read from a field, assign to a field or throw an exception - * that we can't see. - */ - assignmentToField = true; - accessesField = true; - canThrowException = true; + recordMethodCall(); } @Override @@ -297,4 +293,19 @@ assignmentToLocal = true; } } + + /** + * We can't assume anything about method calls right now, except that it can't + * access any of our locals or parameters. + * + * TODO: what about accessing arrays? Should be treated like field refs I + * guess. + */ + private void recordMethodCall() { + assignmentToField = true; + accessesField = true; + accessesFieldNonFinal = true; + canThrowException = true; + createsObject = true; + } }
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java index 47bc7b3..ee0252e 100644 --- a/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java +++ b/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java
@@ -116,6 +116,22 @@ analyzeExpression("int", "0").check(); } + public void testFieldAccessClinit() throws Exception { + sourceOracle.addOrReplace(new MockJavaResource("test.Foo") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package test;\n"); + code.append("public class Foo {\n"); + code.append(" static final boolean value = trueMethod();"); + code.append(" static boolean trueMethod() { return true; }"); + code.append("}\n"); + return code; + } + }); + analyzeExpression("boolean", "Foo.value").accessesFieldNonFinal().canThrowException().createsObject().hasAssignmentToField().check(); + } + public void testFieldAccessInstance() throws Exception { sourceOracle.addOrReplace(new MockJavaResource("test.Foo") { @Override