Revision: 8437
Author: [email protected]
Date: Thu Jul 29 04:13:58 2010
Log: - Refactors SpeedTracerLogger so that the start() and stop() methods are static
- Adds a new addData() method to annotate the current event with more data.
- Updates lists to use com.google.gwt.dev.util.collect.Lists;
- Reduces visibility of methods only used for unit testing
- Migrates the unit class to the same package as SpeedTracerLogger

Review at http://gwt-code-reviews.appspot.com/719801

http://code.google.com/p/google-web-toolkit/source/detail?r=8437

Added:
 /trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer
/trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLoggerTest.java
Deleted:
 /trunk/dev/core/test/com/google/gwt/dev/util/log/SpeedTracerLoggerTest.java
Modified:
 /trunk/dev/core/src/com/google/gwt/dev/Compiler.java
 /trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java
 /trunk/dev/core/src/com/google/gwt/dev/Precompile.java
 /trunk/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
 /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
 /trunk/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java
 /trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
 /trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
 /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
/trunk/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java

=======================================
--- /dev/null
+++ /trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLoggerTest.java Thu Jul 29 04:13:58 2010
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.util.log.speedtracer;
+
+import com.google.gwt.dev.json.JsonArray;
+import com.google.gwt.dev.json.JsonException;
+import com.google.gwt.dev.json.JsonObject;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.EventType;
+
+import junit.framework.TestCase;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+
+/**
+ * Tests the SpeedTracerLogger class.
+ */
+public class SpeedTracerLoggerTest extends TestCase {
+  private static class DummyEventType implements EventType {
+    private final String color;
+    private final String name;
+
+    public DummyEventType(String name, String color) {
+      this.name = name;
+      this.color = color;
+    }
+
+    public String getColor() {
+      return color;
+    }
+
+    public String getName() {
+      return name;
+    }
+  }
+  private class TestLoggerThreadedThread extends Thread {
+
+    private final EventType event;
+    private final SpeedTracerLogger logger;
+
+ public TestLoggerThreadedThread(EventType event, SpeedTracerLogger logger) {
+      super();
+      this.event = event;
+      this.logger = logger;
+    }
+
+    @Override
+    public void run() {
+      for (int i = 0; i < MAX_EVENT_LOGS; i++) {
+        logger.startImpl(event);
+        logger.endImpl(event);
+      }
+    }
+  }
+
+ private static final EventType dummyOne = new DummyEventType("Larry", "Red");
+
+ private static final EventType dummyThree = new DummyEventType("Moe", "Blue");
+
+ private static final EventType dummyTwo = new DummyEventType("Curly", "Green");
+
+  private static final int MAX_EVENT_LOGS = 10000;
+
+  public void testSpeedTracerLogger() throws IOException, JsonException {
+    Writer writer = new StringWriter();
+    SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+    logger.startImpl(dummyOne);
+    logger.startImpl(dummyTwo);
+    logger.endImpl(dummyTwo);
+    logger.startImpl(dummyThree);
+    logger.endImpl(dummyThree);
+    logger.endImpl(dummyOne);
+    logger.flush();
+
+    Reader jsonReader = extractJsonFromWriter(writer);
+    JsonObject parsedObject = JsonObject.parse(jsonReader);
+    assertTrue("dummyOne", compareJsonToEvent(parsedObject, dummyOne));
+
+    JsonObject dataObject = parsedObject.get("data").asObject();
+    assertNotNull(dataObject);
+
+    JsonArray childArray = parsedObject.get("children").asArray();
+    assertNotNull(childArray);
+    assertEquals(2, childArray.getLength());
+
+    JsonObject child = childArray.get(0).asObject();
+    assertTrue("dummyTwo", compareJsonToEvent(child, dummyTwo));
+
+    child = childArray.get(1).asObject();
+    assertTrue("dummyThree", compareJsonToEvent(child, dummyThree));
+  }
+
+  public void testSpeedTracerLoggerExtraData() throws IOException,
+      JsonException {
+    Writer writer = new StringWriter();
+    SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+    logger.startImpl(dummyOne, "extraStart", "valueStart");
+    logger.addDataImpl("extraMiddle", "valueMiddle");
+    logger.endImpl(dummyOne, "extraEnd", "valueEnd");
+    logger.flush();
+
+    Reader jsonReader = extractJsonFromWriter(writer);
+    JsonObject parsedObject = JsonObject.parse(jsonReader);
+    assertEquals("valueStart", parsedObject.get("data").asObject().get(
+        "extraStart").asString().getString());
+    assertEquals(
+        "valueMiddle",
+ parsedObject.get("data").asObject().get("extraMiddle").asString().getString());
+    assertEquals(
+        "valueEnd",
+ parsedObject.get("data").asObject().get("extraEnd").asString().getString());
+  }
+
+ public void testSpeedTracerLoggerMultiple() throws IOException, JsonException {
+    Writer writer = new StringWriter();
+    SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+    logger.startImpl(dummyOne);
+    logger.endImpl(dummyOne);
+    logger.startImpl(dummyTwo);
+    logger.endImpl(dummyTwo);
+    logger.startImpl(dummyThree);
+    logger.endImpl(dummyThree);
+    logger.flush();
+
+    Reader jsonReader = extractJsonFromWriter(writer);
+    JsonObject dummyOneObject = JsonObject.parse(jsonReader).asObject();
+    JsonObject dummyTwoObject = JsonObject.parse(jsonReader).asObject();
+    JsonObject dummyThreeObject = JsonObject.parse(jsonReader).asObject();
+
+    assertTrue(compareJsonToEvent(dummyOneObject, dummyOne));
+    assertTrue(compareJsonToEvent(dummyTwoObject, dummyTwo));
+    assertTrue(compareJsonToEvent(dummyThreeObject, dummyThree));
+  }
+
+  public void testSpeedTracerLoggerThreaded() throws InterruptedException,
+      IOException {
+    final int NUM_THREADS = 3;
+    Writer writer = new StringWriter();
+    SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+    Thread threads[] = new Thread[NUM_THREADS];
+    threads[0] = new TestLoggerThreadedThread(dummyOne, logger);
+    threads[1] = new TestLoggerThreadedThread(dummyTwo, logger);
+    threads[2] = new TestLoggerThreadedThread(dummyThree, logger);
+    for (int i = 0; i < NUM_THREADS; i++) {
+      threads[i].start();
+    }
+    for (int i = 0; i < NUM_THREADS; i++) {
+      threads[i].join();
+    }
+    logger.flush();
+    BufferedReader jsonReader = extractJsonFromWriter(writer);
+
+    int tally[] = new int[NUM_THREADS];
+    for (int i = 0; i < MAX_EVENT_LOGS * NUM_THREADS; i++) {
+      JsonObject result = null;
+      try {
+        result = JsonObject.parse(jsonReader).asObject();
+      } catch (JsonException ex) {
+        fail("Failed to parse json after " + i + " iterations.  "
+            + ex.toString());
+      }
+      if (compareJsonToEvent(result, dummyOne)) {
+        tally[0]++;
+      } else if (compareJsonToEvent(result, dummyTwo)) {
+        tally[1]++;
+      } else if (compareJsonToEvent(result, dummyThree)) {
+        tally[2]++;
+      } else {
+        fail("Node with typeName "
+            + result.get("typeName").asString().getString()
+            + " doesn't match expected");
+      }
+    }
+    for (int i = 0; i < NUM_THREADS; i++) {
+ assertEquals("dummy" + i + " has the wrong number of logs.", tally[i],
+          MAX_EVENT_LOGS);
+    }
+  }
+
+ private boolean compareJsonToEvent(JsonObject jsonObject, EventType eventType) {
+    String typeName = jsonObject.get("typeName").asString().getString();
+    String color = jsonObject.get("color").asString().getString();
+    return typeName.equals(eventType.getName())
+        && color.equals(eventType.getColor());
+  }
+
+  private BufferedReader extractJsonFromWriter(Writer writer)
+      throws IOException {
+    String jsonString = writer.toString();
+ BufferedReader jsonReader = new BufferedReader(new StringReader(jsonString));
+    // Skip ahead to start of JSON
+    while (true) {
+      jsonReader.mark(16 * 1024);
+      String line = jsonReader.readLine();
+      if (line == null) {
+        fail("Didn't find start of JSON string");
+      }
+      if (line.startsWith("{")) {
+        jsonReader.reset();
+        break;
+      }
+    }
+    return jsonReader;
+  }
+}
=======================================
--- /trunk/dev/core/test/com/google/gwt/dev/util/log/SpeedTracerLoggerTest.java Thu Jul 22 13:05:55 2010
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.dev.util.log;
-
-import com.google.gwt.dev.json.JsonArray;
-import com.google.gwt.dev.json.JsonException;
-import com.google.gwt.dev.json.JsonObject;
-import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
-import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.EventType;
-
-import junit.framework.TestCase;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-
-/**
- * Tests the SpeedTracerLogger class.
- */
-public class SpeedTracerLoggerTest extends TestCase {
-  private static class DummyEventType implements EventType {
-    private final String color;
-    private final String name;
-
-    public DummyEventType(String name, String color) {
-      this.name = name;
-      this.color = color;
-    }
-
-    public String getColor() {
-      return color;
-    }
-
-    public String getName() {
-      return name;
-    }
-  }
-  private class TestLoggerThreadedThread extends Thread {
-
-    private final EventType event;
-
-    public TestLoggerThreadedThread(EventType event) {
-      super();
-      this.event = event;
-    }
-
-    @Override
-    public void run() {
-      for (int i = 0; i < MAX_EVENT_LOGS; i++) {
-        SpeedTracerLogger.get().start(event);
-        SpeedTracerLogger.get().end(event);
-      }
-    }
-  }
-
- private static final EventType dummyOne = new DummyEventType("Larry", "Red");
-
- private static final EventType dummyThree = new DummyEventType("Moe", "Blue");
-
- private static final EventType dummyTwo = new DummyEventType("Curly", "Green");
-
-  private static final int MAX_EVENT_LOGS = 10000;
-
-  public void testSpeedTracerLogger() throws IOException, JsonException {
-    Writer writer = new StringWriter();
-    SpeedTracerLogger.init(writer);
-    SpeedTracerLogger.get().start(dummyOne);
-    SpeedTracerLogger.get().start(dummyTwo);
-    SpeedTracerLogger.get().end(dummyTwo);
-    SpeedTracerLogger.get().start(dummyThree);
-    SpeedTracerLogger.get().end(dummyThree);
-    SpeedTracerLogger.get().end(dummyOne);
-    SpeedTracerLogger.get().flush();
-
-    Reader jsonReader = extractJsonFromWriter(writer);
-    JsonObject parsedObject = JsonObject.parse(jsonReader);
-    assertTrue("dummyOne", compareJsonToEvent(parsedObject, dummyOne));
-
-    JsonObject dataObject = parsedObject.get("data").asObject();
-    assertNotNull(dataObject);
-
-    JsonArray childArray = parsedObject.get("children").asArray();
-    assertNotNull(childArray);
-    assertEquals(2, childArray.getLength());
-
-    JsonObject child = childArray.get(0).asObject();
-    assertTrue("dummyTwo", compareJsonToEvent(child, dummyTwo));
-
-    child = childArray.get(1).asObject();
-    assertTrue("dummyThree", compareJsonToEvent(child, dummyThree));
-  }
-
-  public void testSpeedTracerLoggerExtraData() throws IOException,
-      JsonException {
-    Writer writer = new StringWriter();
-    SpeedTracerLogger.init(writer);
-    SpeedTracerLogger.get().start(dummyOne, "extraStart", "valueStart");
-    SpeedTracerLogger.get().end(dummyOne, "extraEnd", "valueEnd");
-    SpeedTracerLogger.get().flush();
-
-    Reader jsonReader = extractJsonFromWriter(writer);
-    JsonObject parsedObject = JsonObject.parse(jsonReader);
- assertEquals("valueStart", parsedObject.get("data").asObject().get("extraStart").asString().getString()); - assertEquals("valueEnd", parsedObject.get("data").asObject().get("extraEnd").asString().getString());
-  }
-
- public void testSpeedTracerLoggerMultiple() throws IOException, JsonException {
-    Writer writer = new StringWriter();
-    SpeedTracerLogger.init(writer);
-    SpeedTracerLogger.get().start(dummyOne);
-    SpeedTracerLogger.get().end(dummyOne);
-    SpeedTracerLogger.get().start(dummyTwo);
-    SpeedTracerLogger.get().end(dummyTwo);
-    SpeedTracerLogger.get().start(dummyThree);
-    SpeedTracerLogger.get().end(dummyThree);
-    SpeedTracerLogger.get().flush();
-
-    Reader jsonReader = extractJsonFromWriter(writer);
-    JsonObject dummyOneObject = JsonObject.parse(jsonReader).asObject();
-    JsonObject dummyTwoObject = JsonObject.parse(jsonReader).asObject();
-    JsonObject dummyThreeObject = JsonObject.parse(jsonReader).asObject();
-
-    assertTrue(compareJsonToEvent(dummyOneObject, dummyOne));
-    assertTrue(compareJsonToEvent(dummyTwoObject, dummyTwo));
-    assertTrue(compareJsonToEvent(dummyThreeObject, dummyThree));
-  }
-
-  public void testSpeedTracerLoggerThreaded() throws InterruptedException,
-      IOException {
-    final int NUM_THREADS = 3;
-    Writer writer = new StringWriter();
-    SpeedTracerLogger.init(writer);
-    Thread threads[] = new Thread[NUM_THREADS];
-    threads[0] = new TestLoggerThreadedThread(dummyOne);
-    threads[1] = new TestLoggerThreadedThread(dummyTwo);
-    threads[2] = new TestLoggerThreadedThread(dummyThree);
-    for (int i = 0; i < NUM_THREADS; i++) {
-      threads[i].start();
-    }
-    for (int i = 0; i < NUM_THREADS; i++) {
-      threads[i].join();
-    }
-    SpeedTracerLogger.get().flush();
-    BufferedReader jsonReader = extractJsonFromWriter(writer);
-
-    int tally[] = new int[NUM_THREADS];
-    for (int i = 0; i < MAX_EVENT_LOGS * NUM_THREADS; i++) {
-      JsonObject result = null;
-      try {
-        result = JsonObject.parse(jsonReader).asObject();
-      } catch (JsonException ex) {
-        fail("Failed to parse json after " + i + " iterations.  "
-            + ex.toString());
-      }
-      if (compareJsonToEvent(result, dummyOne)) {
-        tally[0]++;
-      } else if (compareJsonToEvent(result, dummyTwo)) {
-        tally[1]++;
-      } else if (compareJsonToEvent(result, dummyThree)) {
-        tally[2]++;
-      } else {
-        fail("Node with typeName "
-            + result.get("typeName").asString().getString()
-            + " doesn't match expected");
-      }
-    }
-    for (int i = 0; i < NUM_THREADS; i++) {
- assertEquals("dummy" + i + " has the wrong number of logs.", tally[i],
-          MAX_EVENT_LOGS);
-    }
-  }
-
- private boolean compareJsonToEvent(JsonObject jsonObject, EventType eventType) {
-    String typeName = jsonObject.get("typeName").asString().getString();
-    String color = jsonObject.get("color").asString().getString();
-    return typeName.equals(eventType.getName())
-        && color.equals(eventType.getColor());
-  }
-
-  private BufferedReader extractJsonFromWriter(Writer writer)
-      throws IOException {
-    String jsonString = writer.toString();
- BufferedReader jsonReader = new BufferedReader(new StringReader(jsonString));
-    // Skip ahead to start of JSON
-    while (true) {
-      jsonReader.mark(16 * 1024);
-      String line = jsonReader.readLine();
-      if (line == null) {
-        fail("Didn't find start of JSON string");
-      }
-      if (line.startsWith("{")) {
-        jsonReader.reset();
-        break;
-      }
-    }
-    return jsonReader;
-  }
-}
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/Compiler.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/Compiler.java Thu Jul 29 04:13:58 2010
@@ -171,16 +171,16 @@
     ModuleDef[] modules = new ModuleDef[options.getModuleNames().size()];
     int i = 0;
     for (String moduleName : options.getModuleNames()) {
- SpeedTracerLogger.get().start(CompilerEventType.MODULE_DEF, "phase", "loadFromClassPath", "moduleName", moduleName); + SpeedTracerLogger.start(CompilerEventType.MODULE_DEF, "phase", "loadFromClassPath", "moduleName", moduleName); modules[i++] = ModuleDefLoader.loadFromClassPath(logger, moduleName, true);
-      SpeedTracerLogger.get().end(CompilerEventType.MODULE_DEF);
+      SpeedTracerLogger.end(CompilerEventType.MODULE_DEF);
     }
     return run(logger, modules);
   }

   public boolean run(TreeLogger logger, ModuleDef... modules)
       throws UnableToCompleteException {
-    SpeedTracerLogger.get().start(CompilerEventType.COMPILE);
+    SpeedTracerLogger.start(CompilerEventType.COMPILE);
     boolean tempWorkDir = false;
     try {
       if (options.getWorkDir() == null) {
@@ -205,29 +205,29 @@

           // Optimize early since permutation compiles will run in process.
           options.setOptimizePrecompile(true);
-          SpeedTracerLogger.get().start(CompilerEventType.PRECOMPILE);
+          SpeedTracerLogger.start(CompilerEventType.PRECOMPILE);
           Precompilation precompilation = Precompile.precompile(branch,
               options, module, options.getGenDir(),
               options.getDumpSignatureFile());
-          SpeedTracerLogger.get().end(CompilerEventType.PRECOMPILE);
+          SpeedTracerLogger.end(CompilerEventType.PRECOMPILE);
           if (precompilation == null) {
             return false;
           }

- SpeedTracerLogger.get().start(CompilerEventType.COMPILE_PERMUTATIONS);
+          SpeedTracerLogger.start(CompilerEventType.COMPILE_PERMUTATIONS);
           Permutation[] allPerms = precompilation.getPermutations();
List<FileBackedObject<PermutationResult>> resultFiles = CompilePerms.makeResultFiles(
               options.getCompilerWorkDir(moduleName), allPerms);
           CompilePerms.compile(branch, precompilation, allPerms,
               options.getLocalWorkers(), resultFiles);
- SpeedTracerLogger.get().end(CompilerEventType.COMPILE_PERMUTATIONS);
+          SpeedTracerLogger.end(CompilerEventType.COMPILE_PERMUTATIONS);

ArtifactSet generatedArtifacts = precompilation.getGeneratedArtifacts(); JJSOptions precompileOptions = precompilation.getUnifiedAst().getOptions();

           precompilation = null; // No longer needed, so save the memory

-          SpeedTracerLogger.get().start(CompilerEventType.LINK);
+          SpeedTracerLogger.start(CompilerEventType.LINK);
           File absPath = new File(options.getWarDir(), module.getName());
           absPath = absPath.getAbsoluteFile();

@@ -242,7 +242,7 @@
generatedArtifacts, allPerms, resultFiles, options.getWarDir(),
               options.getExtraDir(), precompileOptions);

-          SpeedTracerLogger.get().end(CompilerEventType.LINK);
+          SpeedTracerLogger.end(CompilerEventType.LINK);
           long compileDone = System.currentTimeMillis();
           long delta = compileDone - compileStart;
           branch.log(TreeLogger.INFO, "Compilation succeeded -- "
@@ -255,7 +255,7 @@
           e);
       return false;
     } finally {
-      SpeedTracerLogger.get().end(CompilerEventType.COMPILE);
+      SpeedTracerLogger.end(CompilerEventType.COMPILE);
       if (tempWorkDir) {
         Util.recursiveDelete(options.getWorkDir(), false);
       }
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java Thu Jul 29 04:13:58 2010
@@ -163,7 +163,7 @@
    */
   public boolean run(TreeLogger logger, ModuleDef... modules)
       throws UnableToCompleteException {
-    SpeedTracerLogger.get().start(CompilerEventType.COMPILE);
+    SpeedTracerLogger.start(CompilerEventType.COMPILE);
     boolean tempWorkDir = false;
     try {
       if (options.getWorkDir() == null) {
@@ -214,13 +214,12 @@
               + String.format("%.3f", delta / 1000d) + "s");
         }
       }
-
     } catch (IOException e) {
logger.log(TreeLogger.ERROR, "Unable to create compiler work directory",
           e);
       return false;
     } finally {
-      SpeedTracerLogger.get().end(CompilerEventType.COMPILE);
+      SpeedTracerLogger.end(CompilerEventType.COMPILE);
       if (tempWorkDir) {
         Util.recursiveDelete(options.getWorkDir(), false);
       }
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/Precompile.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/Precompile.java Thu Jul 29 04:13:58 2010
@@ -508,10 +508,10 @@
module, compilationState, generatedArtifacts, allPermutations, genDir);
       // Allow GC later.
       compilationState = null;
-      SpeedTracerLogger.get().start(CompilerEventType.PRECOMPILE);
+      SpeedTracerLogger.start(CompilerEventType.PRECOMPILE);
UnifiedAst unifiedAst = getCompiler(module).precompile(logger, module, rpo, declEntryPts, null, jjsOptions, rpo.getPermuationCount() == 1);
-      SpeedTracerLogger.get().end(CompilerEventType.PRECOMPILE);
+      SpeedTracerLogger.end(CompilerEventType.PRECOMPILE);

       // Merge all identical permutations together.
       List<Permutation> permutations = new ArrayList<Permutation>(
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java Thu Jul 29 04:13:58 2010
@@ -388,7 +388,7 @@
   }

   public synchronized void refresh(TreeLogger logger) {
- SpeedTracerLogger.get().start(CompilerEventType.MODULE_DEF, "phase", "refresh", "module", getName()); + SpeedTracerLogger.start(CompilerEventType.MODULE_DEF, "phase", "refresh", "module", getName()); logger = logger.branch(TreeLogger.DEBUG, "Refreshing module '" + getName()
         + "'");

@@ -399,7 +399,7 @@
     if (lazyResourcesOracle != null) {
       lazyResourcesOracle.refresh(logger);
     }
-    SpeedTracerLogger.get().end(CompilerEventType.MODULE_DEF);
+    SpeedTracerLogger.end(CompilerEventType.MODULE_DEF);
   }

   /**
@@ -438,7 +438,7 @@
    * @param logger Logs the activity.
    */
   synchronized void normalize(TreeLogger logger) {
- SpeedTracerLogger.get().start(CompilerEventType.MODULE_DEF, "phase", "normalize"); + SpeedTracerLogger.start(CompilerEventType.MODULE_DEF, "phase", "normalize");
     // Normalize property providers.
     //
     for (Property current : getProperties()) {
@@ -484,7 +484,7 @@
           "No source path entries; expect subsequent failures", null);
     }

-    SpeedTracerLogger.get().end(CompilerEventType.MODULE_DEF);
+    SpeedTracerLogger.end(CompilerEventType.MODULE_DEF);
   }

   private void checkForSeedTypes(TreeLogger logger,
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Thu Jul 29 04:13:58 2010
@@ -495,11 +495,11 @@
       return false;
     }

- SpeedTracerLogger.get().start(CompilerEventType.JDT_COMPILER, "phase", "compile"); + SpeedTracerLogger.start(CompilerEventType.JDT_COMPILER, "phase", "compile");
     compilerImpl = new CompilerImpl();
     compilerImpl.compile(icus.toArray(new ICompilationUnit[icus.size()]));
     compilerImpl = null;
-    SpeedTracerLogger.get().end(CompilerEventType.JDT_COMPILER);
+    SpeedTracerLogger.end(CompilerEventType.JDT_COMPILER);
     lazyContentIdMap = null;
     return true;
   }
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java Thu Jul 29 04:13:58 2010
@@ -423,7 +423,7 @@
     setCurrentGenerator(generatorClass);

     long before = System.currentTimeMillis();
-    SpeedTracerLogger.get().start(CompilerEventType.GENERATOR, "class",
+    SpeedTracerLogger.start(CompilerEventType.GENERATOR, "class",
         generator.getClass().getName(), "type", typeName);
     try {
       String className = generator.generate(logger, this, typeName);
@@ -446,7 +446,7 @@
           + "' threw an exception while rebinding '" + typeName + "'", e);
       throw new UnableToCompleteException();
     } finally {
-      SpeedTracerLogger.get().end(CompilerEventType.GENERATOR);
+      SpeedTracerLogger.end(CompilerEventType.GENERATOR);
     }
   }

=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java Thu Jul 29 04:13:58 2010
@@ -293,7 +293,7 @@
    */
   public void addNewUnits(TreeLogger logger,
       Collection<CompilationUnit> units) {
-    SpeedTracerLogger.get().start(CompilerEventType.TYPE_ORACLE_MEDIATOR);
+    SpeedTracerLogger.start(CompilerEventType.TYPE_ORACLE_MEDIATOR);
     // First collect all class data.
     classMap = new HashMap<String, CollectClassData>();
     for (CompilationUnit unit : units) {
@@ -363,7 +363,7 @@
     allMethodArgs = null;
     classMap = null;
     classMapType = null;
-    SpeedTracerLogger.get().end(CompilerEventType.TYPE_ORACLE_MEDIATOR);
+    SpeedTracerLogger.end(CompilerEventType.TYPE_ORACLE_MEDIATOR);
   }

   /**
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java Wed Jul 28 11:12:18 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java Thu Jul 29 04:13:58 2010
@@ -603,29 +603,29 @@
      */
     jprogram.beginOptimizations();

-    SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE);
-
- SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+    SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE);
+
+    SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
         "finalizer");
     Finalizer.exec(jprogram);
-    SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
- SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+    SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+    SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
         "makeCallsStatic");
     MakeCallsStatic.exec(jprogram);
-    SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
- SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+    SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+    SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
         "recomputeAfterOptimizations");
     jprogram.typeOracle.recomputeAfterOptimizations();
-    SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
- SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+    SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+    SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
         "deadCodeElimination");
     DeadCodeElimination.exec(jprogram);
-    SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
-    SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
+    SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+    SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
   }

   protected static void optimize(JJSOptions options, JProgram jprogram)
@@ -637,10 +637,10 @@
      */
     jprogram.beginOptimizations();

-    SpeedTracerLogger.get().start(CompilerEventType.OPTIMIZE);
+    SpeedTracerLogger.start(CompilerEventType.OPTIMIZE);
     do {
       if (Thread.interrupted()) {
-        SpeedTracerLogger.get().end(CompilerEventType.OPTIMIZE);
+        SpeedTracerLogger.end(CompilerEventType.OPTIMIZE);
         throw new InterruptedException();
       }
       maybeDumpAST(jprogram);
@@ -650,12 +650,12 @@
       // Just run it once, because it is very time consuming
       DataflowOptimizer.exec(jprogram);
     }
-    SpeedTracerLogger.get().end(CompilerEventType.OPTIMIZE);
+    SpeedTracerLogger.end(CompilerEventType.OPTIMIZE);
   }

   protected static boolean optimizeLoop(JProgram jprogram,
       boolean isAggressivelyOptimize) {
- SpeedTracerLogger.get().start(CompilerEventType.OPTIMIZE, "phase", "loop");
+    SpeedTracerLogger.start(CompilerEventType.OPTIMIZE, "phase", "loop");
     // Recompute clinits each time, they can become empty.
     jprogram.typeOracle.recomputeAfterOptimizations();
// jprogram.methodOracle = MethodOracleBuilder.buildMethodOracle(jprogram);
@@ -692,7 +692,7 @@

     // prove that any types that have been culled from the main tree are
     // unreferenced due to type tightening?
-    SpeedTracerLogger.get().end(CompilerEventType.OPTIMIZE);
+    SpeedTracerLogger.end(CompilerEventType.OPTIMIZE);

     return didChange;
   }
@@ -1007,21 +1007,21 @@

     ByteArrayOutputStream baos = new ByteArrayOutputStream();

-    SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS);
-
-    SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+    SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+
+    SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
         "phase", "recordSplitPoints");
     SplitPointRecorder.recordSplitPoints(jprogram, baos, logger);
     SyntheticArtifact splitPoints = new SyntheticArtifact(
         SoycReportLinker.class, "splitPoints" + permutationId + ".xml.gz",
         baos.toByteArray());
     soycArtifacts.add(splitPoints);
-    SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+    SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);


     SyntheticArtifact sizeMaps = null;
     if (sizeBreakdowns != null) {
-      SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+      SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
           "phase", "recordSizeMap");
       baos.reset();
       SizeMapRecorder.recordMap(logger, baos, sizeBreakdowns, jjsmap,
@@ -1029,17 +1029,17 @@
       sizeMaps = new SyntheticArtifact(SoycReportLinker.class, "stories"
           + permutationId + ".xml.gz", baos.toByteArray());
       soycArtifacts.add(sizeMaps);
-      SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+      SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
     }

     if (sourceInfoMaps != null) {
-      SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+      SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
           "phase", "recordStories");
       baos.reset();
       StoryRecorder.recordStories(logger, baos, sourceInfoMaps, js);
       soycArtifacts.add(new SyntheticArtifact(SoycReportLinker.class,
"detailedStories" + permutationId + ".xml.gz", baos.toByteArray()));
-      SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+      SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
     }

     if (dependencies != null) {
@@ -1052,7 +1052,7 @@
     }

     if (sizeBreakdowns != null) {
-      SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+      SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
           "phase", "generateCompileReport");
       ArtifactsOutputDirectory outDir = new ArtifactsOutputDirectory();
       SoycDashboard dashboard = new SoycDashboard(outDir);
@@ -1076,10 +1076,10 @@
       }
       dashboard.generateForOnePermutation();
       soycArtifacts.addAll(outDir.getArtifacts());
-      SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+      SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
     }

-    SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+    SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);

     return soycArtifacts;
   }
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java Thu Jul 29 04:13:58 2010
@@ -785,7 +785,7 @@
   }

   private void execImpl() {
-    SpeedTracerLogger.get().start(CompilerEventType.CODE_SPLITTER);
+    SpeedTracerLogger.start(CompilerEventType.CODE_SPLITTER);
Map<Integer, List<JsStatement>> fragmentStats = new HashMap<Integer, List<JsStatement>>();

     {
@@ -865,7 +865,7 @@
       fragBlock.getStatements().addAll(fragmentStats.get(i));
     }

-    SpeedTracerLogger.get().end(CompilerEventType.CODE_SPLITTER);
+    SpeedTracerLogger.end(CompilerEventType.CODE_SPLITTER);
   }

   /**
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java Thu Jul 29 04:13:58 2010
@@ -320,7 +320,7 @@
    * @param logger status and error details are written here
    */
   public void refresh(TreeLogger logger) {
- SpeedTracerLogger.get().start(CompilerEventType.RESOURCE_ORACLE, "phase", "refresh"); + SpeedTracerLogger.start(CompilerEventType.RESOURCE_ORACLE, "phase", "refresh");
     TreeLogger refreshBranch = Messages.REFRESHING_RESOURCES.branch(logger,
         null);

@@ -387,7 +387,7 @@

     if (!didChange) {
       // Nothing to do, keep the same identities.
-      SpeedTracerLogger.get().end(CompilerEventType.RESOURCE_ORACLE);
+      SpeedTracerLogger.end(CompilerEventType.RESOURCE_ORACLE);
       return;
     }

@@ -406,7 +406,7 @@
     exposedResources = Collections.unmodifiableSet(externalSet);
     exposedResourceMap = Collections.unmodifiableMap(externalMap);
     exposedPathNames = Collections.unmodifiableSet(externalMap.keySet());
-    SpeedTracerLogger.get().end(CompilerEventType.RESOURCE_ORACLE);
+    SpeedTracerLogger.end(CompilerEventType.RESOURCE_ORACLE);
   }

   public void setPathPrefixes(PathPrefixSet pathPrefixSet) {
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java Thu Jul 22 13:05:55 2010 +++ /trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java Thu Jul 29 04:13:58 2010
@@ -19,10 +19,10 @@
 import com.google.gwt.dev.json.JsonObject;
 import com.google.gwt.dev.util.collect.Lists;

+import java.io.BufferedWriter;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Stack;
 import java.util.concurrent.BlockingQueue;
@@ -57,27 +57,25 @@
    * Represents a node in a tree of SpeedTracer events.
    */
   private class Event {
-
-    final List<Event> children = new ArrayList<Event>();
-
-    final List<String> data = new ArrayList<String>();
-
+    List<Event> children = Lists.create();
+    List<String> data;
     long durationNanos;
-
     final long startTimeNanos;
-
     final EventType type;

-    Event(Event parent, EventType type, String[] data) {
+    Event() {
+      data = Lists.create();
+      this.startTimeNanos = normalizedTimeNanos();
+      this.type = null;
+    }
+
+    Event(Event parent, EventType type, String... data) {
       if (parent != null) {
-        parent.children.add(this);
+        parent.children = Lists.add(parent.children, this);
       }
       this.type = type;
-      if (data != null) {
-        for (int i = 0; i < data.length; i++) {
-          this.data.add(data[i]);
-        }
-      }
+      assert (data.length % 2 == 0);
+      this.data = Lists.create(data);
       this.startTimeNanos = normalizedTimeNanos();
     }

@@ -86,9 +84,8 @@
      */
     public void addData(String[] data) {
       if (data != null) {
-        for (int i = 0; i < data.length; i++) {
-          this.data.add(data[i]);
-        }
+        assert (data.length % 2 == 0);
+        this.data = Lists.addAll(this.data, data);
       }
     }

@@ -99,7 +96,6 @@

     JsonObject toJson() {
       JsonObject json = JsonObject.create();
-
       json.put("type", -2);
       json.put("typeName", type.getName());
       json.put("color", type.getColor());
@@ -127,13 +123,20 @@
       return nanos / 1000000.0d;
     }
   }
+
+  /**
+   * Initializes the singleton on demand.
+   */
+  private static class LazySpeedTracerLoggerHolder {
+    public static SpeedTracerLogger singleton = new SpeedTracerLogger();
+  }

   /**
    * Thread that converts log requests to JSON in the background.
    */
   private class LogWriterThread extends Thread {
-    private final BlockingQueue<Event> threadEventQueue;
     private final String fileName;
+    private final BlockingQueue<Event> threadEventQueue;
     private final Writer writer;

     public LogWriterThread(Writer writer, String fileName,
@@ -175,71 +178,57 @@
       }
     }
   }
-
-  private static SpeedTracerLogger singleton;

   /**
-   * For accessing the logger as a singleton, you can retrieve the global
-   * instance. You must first initialize the singleton with a call to
-   * {...@link #init()} or {...@link #init(Writer)}.
+ * Annotate the current event on the top of the stack with more information. + * The method expects key, value pairs, so there must be an even number of
+   * parameters.
    *
- * @return the current instance if one already exists from a previous call to
-   *         {...@link #init()}
+   * @param data JSON property, value pair to add to current event.
    */
-  public static synchronized SpeedTracerLogger get() {
-    if (singleton == null) {
-      init();
-    }
-    return singleton;
+  public static void addData(String... data) {
+    SpeedTracerLogger.get().addDataImpl(data);
   }

   /**
- * Create a new global instance. Force the zero time to be recorded and the
-   * log to be opened if the default logging is turned on with the
-   * <code>-Dgwt.speedtracerlog</code> VM property.
-   *
- * This method is only intended to be called once (except for unit testing).
+   * Signals the end of the current event.
    */
-  public static synchronized void init() {
-    if (singleton != null) {
-      singleton.flush();
-    }
-    singleton = newInstance();
+  public static void end(EventType type, String... data) {
+    SpeedTracerLogger.get().endImpl(type, data);
   }

   /**
-   * Creates a new instance and assigns it to the global instance.
+ * Create a new global instance. Force the zero time to be recorded and the
+   * log to be opened if the default logging is turned on with the
+   * <code>-Dgwt.speedtracerlog</code> VM property.
    *
- * This method is only intended to be called once (except for unit testing).
-   *
-   * @param writer The writer to use for logging messages.
+   * This method is only intended to be called once.
    */
-  public static synchronized void init(Writer writer) {
-    if (singleton != null) {
-      singleton.flush();
-    }
-    singleton = newInstance(writer);
+  public static void init() {
+    get();
   }

   /**
- * Allocates a new instance of the logger. The global instance returned by
-   * init() or get() is not affected.
+ * Signals that a new event has started. You must call {...@link #end} for each
+   * corresponding call to {...@code start}. You may nest timing calls.
    *
-   * @return a new {...@link SpeedTracerLogger} instance.
+   * @param type the type of event
+ * @data a set of key-value pairs (each key is followed by its value) that
+   *       contain additional information about the event
    */
-  public static SpeedTracerLogger newInstance() {
-    return new SpeedTracerLogger();
+  public static void start(EventType type, String... data) {
+    SpeedTracerLogger.get().startImpl(type, data);
   }

   /**
- * Allocates a new instance of the logger. The global instance returned by
-   * {...@link #init()} or {...@link #get()} is not affected.
+   * For accessing the logger as a singleton, you can retrieve the global
+   * instance. It is prudent, but not necessary to first initialize the
+   * singleton with a call to {...@link #init()} to set the base time.
    *
-   * @param writer The writer to use for logging messages.
-   * @return a new {...@link SpeedTracerLogger} instance.
+   * @return the current global {...@link SpeedTracerLogger} instance.
    */
-  public static SpeedTracerLogger newInstance(Writer writer) {
-    return new SpeedTracerLogger(writer);
+  private static SpeedTracerLogger get() {
+    return LazySpeedTracerLoggerHolder.singleton;
   }

private final BlockingQueue<Event> eventQueue = new LinkedBlockingQueue<Event>();
@@ -248,7 +237,7 @@

   private CountDownLatch flushLatch;

-  private final Event flushSentinel = new Event(null, null, null);
+  private final Event flushSentinel = new Event();

private final ThreadLocal<Stack<Event>> pendingEvents = new ThreadLocal<Stack<Event>>() {
     @Override
@@ -259,22 +248,35 @@

   private final CountDownLatch shutDownLatch = new CountDownLatch(1);

-  private final Event shutDownSentinel = new Event(null, null, null);
+  private final Event shutDownSentinel = new Event();

   private final long zeroTimeNanos = System.nanoTime();
+
+  /**
+   * Constructor intended for unit testing.
+   *
+   * @param writer alternative {...@link Writer} to send speed tracer output.
+   */
+  SpeedTracerLogger(Writer writer) {
+    eventsToWrite = openLogWriter(writer, "");
+  }

   private SpeedTracerLogger() {
     eventsToWrite = openDefaultLogWriter();
   }

-  private SpeedTracerLogger(Writer writer) {
-    eventsToWrite = openLogWriter(writer, "");
+  public void addDataImpl(String... data) {
+    Stack<Event> threadPendingEvents = pendingEvents.get();
+    if (threadPendingEvents.isEmpty()) {
+      throw new IllegalStateException(
+          "Tried to add data to an event that never started!");
+    }
+
+    Event currentEvent = threadPendingEvents.peek();
+    currentEvent.addData(data);
   }

-  /**
-   * Signals the end of the current event.
-   */
-  public void end(EventType type, String... data) {
+  void endImpl(EventType type, String... data) {
     if (eventsToWrite == null) {
       return;
     }
@@ -320,7 +322,7 @@
   /**
* Notifies the background thread to finish processing all data in the queue.
    */
-  public void flush() {
+  void flush() {
     try {
       // Wait for the other thread to drain the queue.
       flushLatch = new CountDownLatch(1);
@@ -331,15 +333,7 @@
     }
   }

-  /**
- * Signals that a new event has started. You must call {...@link #end} for each
-   * corresponding call to {...@code start}. You may nest timing calls.
-   *
-   * @param type the type of event
- * @data a set of key-value pairs (each key is followed by its value) that
-   *       contain additional information about the event
-   */
-  public void start(EventType type, String... data) {
+  void startImpl(EventType type, String... data) {
     if (eventsToWrite == null) {
       return;
     }
@@ -368,7 +362,7 @@
     if (logFile != null) {

       try {
-        writer = new FileWriter(logFile);
+        writer = new BufferedWriter(new FileWriter(logFile));
         return openLogWriter(writer, logFile);
       } catch (IOException e) {
         System.err.println("Unable to open gwt.speedtracerlog '" + logFile
@@ -389,7 +383,7 @@
+ "<a href=\"http://code.google.com/speedtracer\";>SpeedTracer</a> " + "extension under the <a href=\"http://chrome.google.com/\";>Chrome</a> browser.</div>" + "<p><span id=\"info\">(You must install the SpeedTracer extension to open this file)</span></p>" - + "<div style=\"display: none\" id=\"traceData\" version=\"0.13\">\n"); + + "<div style=\"display: none\" id=\"traceData\" version=\"0.17\">\n");
     } catch (IOException e) {
       System.err.println("Unable to write to gwt.speedtracerlog '"
           + (fileName == null ? "" : fileName) + "'");

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to