Reviewers: Lex, Message: Here's an example of what the new loader output looks like:
package com.google.gwt.lang.asyncloaders; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.core.client.impl.AsyncFragmentLoader; public class AsyncLoader1 { // Callbacks that are pending private static AsyncLoader1__Callback callbacksHead = null; // The tail of the callbacks list private static AsyncLoader1__Callback callbacksTail = null; // A callback caller for this entry point private static AsyncLoader1 instance = null; public static void onLoad() { instance = new AsyncLoader1(); AsyncFragmentLoader.BROWSER_LOADER.fragmentHasLoaded(1); AsyncFragmentLoader.BROWSER_LOADER.logEventProgress("runCallbacks1", "begin"); instance.runCallbacks(); AsyncFragmentLoader.BROWSER_LOADER.logEventProgress("runCallbacks1", "end"); } public static void runAsync(RunAsyncCallback callback) { AsyncLoader1__Callback newCallback = new AsyncLoader1__Callback(); newCallback.callback = callback; if (callbacksTail != null) { callbacksTail.next = newCallback; } callbacksTail = newCallback; if (callbacksHead == null) { callbacksHead = newCallback; } if (instance != null) { instance.runCallbacks(); return; } if (!AsyncFragmentLoader.BROWSER_LOADER.isLoading(1)) { AsyncFragmentLoader.BROWSER_LOADER.inject(1, new AsyncFragmentLoader.LoadErrorHandler() { public void loadFailed(Throwable reason) { runCallbackOnFailures(reason); } }); } } private static void runCallbackOnFailures(Throwable e) { while (callbacksHead != null) { callbacksHead.callback.onFailure(e); callbacksHead = callbacksHead.next; } callbacksTail = null; } public void runCallbacks() { while (callbacksHead != null) { GWT.UncaughtExceptionHandler handler = GWT.getUncaughtExceptionHandler(); AsyncLoader1__Callback next = callbacksHead; callbacksHead = callbacksHead.next; if (callbacksHead == null) { callbacksTail = null; } if (handler == null) { next.callback.onSuccess(); } else { try { next.callback.onSuccess(); } catch (Throwable e) { handler.onUncaughtException(e); } } } } } http://gwt-code-reviews.appspot.com/159811/diff/1/2 File dev/core/src/com/google/gwt/dev/jjs/impl/FragmentLoaderCreator.java (left): http://gwt-code-reviews.appspot.com/159811/diff/1/2#oldcode114 Line 114: private void generateOnErrorMethod(PrintWriter srcWriter) { I pulled this method because I couldn't see any callers. Was this still needed? http://gwt-code-reviews.appspot.com/159811/diff/1/4 File user/src/com/google/gwt/core/client/prefetch/Prefetcher.java (right): http://gwt-code-reviews.appspot.com/159811/diff/1/4#newcode33 Line 33: public static void prefetch(Collection<? extends PrefetchableResource> resources) { Wasn't sure about this change, but I thought I'd suggest it. Technically, since the code below the "GWT.isScript()" is JS only (where there's no range checking), we don't have to know the correct size up front. Description: A few runAsync-related code size improvements. 1) Removes the clinit, AsyncLoader__Supers, and loading fields from generated AsyncLoaders. PRETTY mode Showcase's initial fragment drops from 500k to 480k. Probably less impressive in OBF. A tiny improvement within the split fragments, too. 2) Removes the last couple uses of JRE collections from AsyncFragmentLoader in favor of arrays. 3) Removes a missed logEventProgress Integer -> int conversion that was begun in an earlier commit. Please review this at http://gwt-code-reviews.appspot.com/159811 Affected files: M dev/core/src/com/google/gwt/dev/jjs/impl/FragmentLoaderCreator.java M user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java M user/src/com/google/gwt/core/client/prefetch/Prefetcher.java -- http://groups.google.com/group/Google-Web-Toolkit-Contributors