If you qualify a static field reference with a side-effect causing expression, and the field reference doesn't generate a clinit call, you will reference an undefined field at run time. I fixed this by explicitly qualifying the field reference with "window" in this particular case, but a general solution is needed when we generate JS inside of an anonymous function body, because neither window nor clinit referencing will work then.
Review by: mmendez
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@616 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 10c8306..340dd9d 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -631,12 +631,23 @@
}
JField field = x.getField();
- JsInvocation jsInvocation = maybeCreateClinitCall(field);
- if (jsInvocation != null) {
- qualifier = createCommaExpression(qualifier, jsInvocation);
+ if (field.isStatic()) {
+ JsExpression realQualifier = maybeCreateClinitCall(field);
+ if (qualifier != null) {
+ // There is an unused qualifier. We must create a comma expression
+ // since there's no way to reference the field from the qualifier.
+ if (realQualifier == null) {
+ // ugh, must synthesize a call to window to be the real qualifier
+ // TODO: this will BREAK when we use inline JS
+ realQualifier = topScope.findExistingUnobfuscatableName("window").makeRef();
+ }
+ realQualifier = createCommaExpression(qualifier, realQualifier);
+ }
+ // the name ref's qualifier is either a clinit, or nothing
+ nameRef.setQualifier(realQualifier);
+ } else {
+ nameRef.setQualifier(qualifier); // instance
}
-
- nameRef.setQualifier(qualifier); // instance
push(nameRef);
}