Replace makeCastMapFromArray with goog.object.createSet JCHSU.makeCastMapFromArray increases startup latency by 150ms in Closure/GWT hybrid apps like Google Inbox by doing more work during initial load to construct cast maps. This patch uses the closure library goog.object.createSet() function which accomplishes the same task, but has a builtin closure compiler optimization which turns var-arg arguments into a static object literal. Change-Id: Ia091e280c305c7f7964fd25bb0d2197aa0245ea0
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 84f5df9..5827b3f 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
@@ -2222,7 +2222,7 @@ SourceInfo sourceInfo) { if (JjsUtils.closureStyleLiteralsNeeded(incremental, jsInteropMode, jsExportClosureStyle)) { - return buildCastMapFromArrayLiteral(runtimeTypeIdLiterals, sourceInfo); + return buildClosureStyleCastMapFromArrayLiteral(runtimeTypeIdLiterals, sourceInfo); } else { return buildCastMapAsObjectLiteral(runtimeTypeIdLiterals, sourceInfo); } @@ -2244,17 +2244,24 @@ return objLit; } - private JsExpression buildCastMapFromArrayLiteral( - List<JsExpression> runtimeTypeIdLiterals, SourceInfo sourceInfo) { - JsArrayLiteral castExprs = new JsArrayLiteral(sourceInfo); + private JsExpression buildClosureStyleCastMapFromArrayLiteral( + List<JsExpression> runtimeTypeIdLiterals, SourceInfo sourceInfo) { + /* + * goog.object.createSet('foo', 'bar', 'baz') is optimized by closure compiler into + * {'foo': !0, 'bar': !0, baz: !0} + */ + JsNameRef createSet = new JsNameRef(sourceInfo, "createSet"); + JsNameRef googObject = new JsNameRef(sourceInfo, "object"); + JsNameRef goog = new JsNameRef(sourceInfo, "goog"); + createSet.setQualifier(googObject); + googObject.setQualifier(goog); + + JsInvocation jsInvocation = new JsInvocation(sourceInfo, createSet); + for (JsExpression expr : runtimeTypeIdLiterals) { - castExprs.getExpressions().add(expr); + jsInvocation.getArguments().add(expr); } - castExprs.setInternable(); - JsInvocation jsInvocation = new JsInvocation(sourceInfo, - indexedFunctions - .get("JavaClassHierarchySetupUtil.makeCastMapFromArray"), - castExprs); + return jsInvocation; }
diff --git a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java index 5f9f528..9ff1d37 100644 --- a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java +++ b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java
@@ -127,19 +127,6 @@ portableObjCreate(Lcom/google/gwt/core/client/JavaScriptObject;)(prototypesByTypeId[superTypeId]); }-*/; - public static native JavaScriptObject makeCastMapFromArray(JavaScriptObject array) /*-{ - if (array.castMap) { - // already created on interned array - return array.castMap; - } - var castMap = {}; - for (var i = 0; i < array.length; i++) { - castMap[array[i]] = 1; - } - array.castMap = castMap; - return castMap; - }-*/; - /** * Retrieves the class literal if stored in a place holder, {@code null} otherwise. */