Author: [email protected]
Date: Mon May 11 17:09:04 2009
New Revision: 5342

Modified:
    trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java
    trunk/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
     
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java
     
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
     
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
    trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
    trunk/dev/core/src/com/google/gwt/dev/PermutationResult.java
    trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
    trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java

Log:
Optimize SymbolData serialization to speed up Link.

- SymbolData is now stored in an array instead of a TreeMap.
- StandardSymbolData has explicit readObject/writeObject methods to avoid  
the built-in reflective calls and optimize instance sharing/non-sharing.
- Symbol data is now pre-serialized to bytes in CompilePerms to avoid  
multiple serialization/deserialization work in Link phase.

Review by: spoon

Modified:  
trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java
==============================================================================
---  
trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java        
 
(original)
+++  
trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java        
 
Mon May 11 17:09:04 2009
@@ -56,12 +56,12 @@
    public abstract String getStrongName();

    /**
-   * Returns a map of obfuscated symbol names in the compilation to  
metadata
-   * about the symbol. This data can allow for on-the-fly deobfuscation of  
stack
-   * trace information or to allow server components to have in-depth  
knowledge
-   * of the runtime structure of compiled objects.
+   * Returns a sorted array of obfuscated symbol names in the compilation  
to
+   * metadata about the symbol. This data can allow for on-the-fly  
deobfuscation
+   * of stack trace information or to allow server components to have  
in-depth
+   * knowledge of the runtime structure of compiled objects.
     */
-  public abstract SortedMap<SymbolData, String> getSymbolMap();
+  public abstract SymbolData[] getSymbolMap();

    @Override
    public final int hashCode() {

Modified: trunk/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java    
(original)
+++ trunk/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java   Mon  
May 11 17:09:04 2009
@@ -16,7 +16,6 @@
  package com.google.gwt.core.ext.linker;

  import java.io.Serializable;
-import java.net.URI;
  import java.util.Comparator;

  /**
@@ -71,11 +70,16 @@
    int getSourceLine();

    /**
-   * Returns a URI representing the location of the source. This method  
will
-   * return <code>null</code> if the symbol was derived from a transient or
-   * unknown source.
+   * Returns a URI string representing the location of the source. This  
method
+   * will return <code>null</code> if the symbol was derived from a  
transient
+   * or unknown source.
     */
-  URI getSourceUri();
+  String getSourceUri();
+
+  /**
+   * Returns the JavaScript symbol this data maps to.
+   */
+  String getSymbolName();

    /**
     * Returns <code>true</code> if the symbol represents a class.

Modified:  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java
==============================================================================
---  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java
    
(original)
+++  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java
    
Mon May 11 17:09:04 2009
@@ -76,14 +76,14 @@

    private final String strongName;

-  private final long symbolMapToken;
+  private final long symbolToken;

    public StandardCompilationResult(String strongName, String[] js,
-      SortedMap<SymbolData, String> symbolMap) {
+      byte[] serializedSymbolMap) {
      super(StandardLinkerContext.class);
      this.strongName = strongName;
      jsToken = diskCache.writeObject(js);
-    symbolMapToken = diskCache.writeObject(symbolMap);
+    symbolToken = diskCache.writeByteArray(serializedSymbolMap);
    }

    /**
@@ -113,8 +113,7 @@
    }

    @Override
-  @SuppressWarnings("unchecked")
-  public SortedMap<SymbolData, String> getSymbolMap() {
-    return diskCache.readObject(symbolMapToken, SortedMap.class);
+  public SymbolData[] getSymbolMap() {
+    return diskCache.readObject(symbolToken, SymbolData[].class);
    }
  }

Modified:  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
==============================================================================
---  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
        
(original)
+++  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
        
Mon May 11 17:09:04 2009
@@ -275,7 +275,7 @@
      StandardCompilationResult result = resultsByStrongName.get(strongName);
      if (result == null) {
        result = new StandardCompilationResult(strongName, js,
-          permutationResult.getSymbolMap());
+          permutationResult.getSerializedSymbolMap());
        resultsByStrongName.put(result.getStrongName(), result);
        artifacts.add(result);

@@ -439,26 +439,26 @@
          + outputPath.getPath(), null);

      for (EmittedArtifact artifact : artifacts.find(EmittedArtifact.class))  
{
-      TreeLogger artifactLogger = logger.branch(TreeLogger.DEBUG,
-          "Emitting resource " + artifact.getPartialPath(), null);
+              TreeLogger artifactLogger = logger.branch(TreeLogger.DEBUG,
+                  "Emitting resource " + artifact.getPartialPath(), null);

-      File outFile;
-      if (artifact.isPrivate()) {
-        if (extraPath == null) {
-          continue;
-        }
-        outFile = new File(getExtraPathForLinker(extraPath,
-            artifact.getLinker()), artifact.getPartialPath());
-      } else {
-        outFile = new File(outputPath, artifact.getPartialPath());
-      }
+              File outFile;
+              if (artifact.isPrivate()) {
+                if (extraPath == null) {
+                  continue;
+                }
+                outFile = new File(getExtraPathForLinker(extraPath,
+                    artifact.getLinker()), artifact.getPartialPath());
+              } else {
+                outFile = new File(outputPath, artifact.getPartialPath());
+              }

-      if (!outFile.exists()
-          || (outFile.lastModified() <= artifact.getLastModified())) {
+              if (!outFile.exists()
+                  || (outFile.lastModified() <=  
artifact.getLastModified())) {
          Util.copy(artifactLogger, artifact.getContents(artifactLogger),  
outFile);
-        outFile.setLastModified(artifact.getLastModified());
-      }
-    }
+                outFile.setLastModified(artifact.getLastModified());
+              }
+            }
      for (StandardCompilationAnalysis soycFiles :  
artifacts.find(StandardCompilationAnalysis.class)) {
        TreeLogger artifactLogger = logger.branch(TreeLogger.DEBUG,
            "Emitting soyc resources.", null);

Modified:  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
==============================================================================
---  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java  
 
(original)
+++  
trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java  
 
Mon May 11 17:09:04 2009
@@ -18,6 +18,10 @@
  import com.google.gwt.core.ext.linker.SymbolData;

  import java.io.File;
+import java.io.IOException;
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
  import java.net.URI;
  import java.net.URISyntaxException;

@@ -26,47 +30,46 @@
   */
  public class StandardSymbolData implements SymbolData {

-  public static SymbolData forClass(String className, String fileName,
+  public static StandardSymbolData forClass(String className, String  
uriString,
        int lineNumber) {
-    URI uri = inferUriFromFileName(fileName);
-    return new StandardSymbolData(className, null, null, uri, lineNumber);
+    return new StandardSymbolData(className, null, null, uriString,  
lineNumber);
    }

-  public static SymbolData forMember(String className, String memberName,
-      String jsniIdent, String fileName, int lineNumber) {
-    URI uri = inferUriFromFileName(fileName);
-    return new StandardSymbolData(className, jsniIdent, memberName, uri,
+  public static StandardSymbolData forMember(String className,
+      String memberName, String methodSig, String uriString, int  
lineNumber) {
+    return new StandardSymbolData(className, memberName, methodSig,  
uriString,
          lineNumber);
    }

-  private static URI inferUriFromFileName(String fileName) {
+  public static String toUriString(String fileName) {
      File f = new File(fileName);
      if (f.exists()) {
-      return f.toURI();
+      return f.toURI().toASCIIString();
      } else {
        try {
-        return new URI(fileName);
+        return new URI(fileName).toASCIIString();
        } catch (URISyntaxException e) {
          return null;
        }
      }
    }

-  private final String className;
-  private final String jsniIdent;
-  private final String memberName;
-  private final int sourceLine;
-  private final URI sourceUri;
+  private String className;
+  private String memberName;
+  private String methodSig;
+  private int sourceLine;
+  private String sourceUri;
+  private String symbolName;

-  private StandardSymbolData(String className, String jsniIdent,
-      String memberName, URI sourceUri, int sourceLine) {
+  private StandardSymbolData(String className, String memberName,
+      String methodSig, String sourceUri, int sourceLine) {
      assert className != null && className.length() > 0 : "className";
-    assert !(jsniIdent == null ^ memberName == null) : "jsniIdent ^  
memberName";
+    assert memberName != null || methodSig == null : "methodSig without  
memberName";
      assert sourceLine >= -1 : "sourceLine: " + sourceLine;

      this.className = className;
-    this.jsniIdent = jsniIdent;
      this.memberName = memberName;
+    this.methodSig = methodSig;
      this.sourceUri = sourceUri;
      this.sourceLine = sourceLine;
    }
@@ -76,7 +79,13 @@
    }

    public String getJsniIdent() {
-    return jsniIdent;
+    if (memberName == null) {
+      return null;
+    }
+    if (methodSig == null) {
+      return className + "::" + memberName;
+    }
+    return className + "::" + memberName + methodSig;
    }

    public String getMemberName() {
@@ -87,24 +96,79 @@
      return sourceLine;
    }

-  public URI getSourceUri() {
+  public String getSourceUri() {
      return sourceUri;
    }

+  public String getSymbolName() {
+    return symbolName;
+  }
+
    public boolean isClass() {
      return memberName == null;
    }

    public boolean isField() {
-    return jsniIdent != null && !jsniIdent.contains("(");
+    return memberName != null && methodSig == null;
    }

    public boolean isMethod() {
-    return jsniIdent != null && jsniIdent.contains("(");
+    return methodSig != null;
+  }
+
+  public void setSymbolName(String symbolName) {
+    this.symbolName = symbolName;
    }

    @Override
    public String toString() {
-    return jsniIdent != null ? jsniIdent : className;
+    return methodSig != null ? methodSig : className;
+  }
+
+  private void readObject(ObjectInputStream in) throws IOException,
+      ClassNotFoundException {
+    className = (String) in.readObject();
+    switch (in.read()) {
+      case 0:
+        break;
+      case 1:
+        memberName = in.readUTF();
+        break;
+      case 2:
+        memberName = in.readUTF();
+        methodSig = in.readUTF();
+        break;
+      default:
+        throw new InvalidObjectException("Unexpected input");
+    }
+    sourceLine = in.readInt();
+    sourceUri = (String) in.readObject();
+    symbolName = in.readUTF();
+  }
+
+  /**
+   * Implemented by hand for speed (over using reflection) because there  
are so
+   * many of these. Note that {...@link #className} and {...@link #sourceUri}  
are done
+   * as writeObject because the actual String instances are very likely to  
be
+   * shared among many instances of this class, so the same objects can be
+   * reused in the stream. The other String fields are done as UTF because  
it's
+   * slightly faster and the String objects are unlikely to be shared among
+   * instances.
+   */
+  private void writeObject(ObjectOutputStream out) throws IOException {
+    out.writeObject(className);
+    if (isClass()) {
+      out.write(0);
+    } else if (isField()) {
+      out.write(1);
+      out.writeUTF(memberName);
+    } else {
+      out.write(2);
+      out.writeUTF(memberName);
+      out.writeUTF(methodSig);
+    }
+    out.writeInt(sourceLine);
+    out.writeObject(sourceUri);
+    out.writeUTF(symbolName);
    }
  }

Modified:  
trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java  
(original)
+++ trunk/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java Mon  
May 11 17:09:04 2009
@@ -29,7 +29,6 @@

  import java.io.ByteArrayOutputStream;
  import java.io.PrintWriter;
-import java.net.URI;
  import java.util.Map;
  import java.util.SortedMap;

@@ -110,31 +109,28 @@
      }

      pw.println("# jsName, jsniIdent, className, memberName, sourceUri,  
sourceLine");
-    for (Map.Entry<SymbolData, String> entry :  
result.getSymbolMap().entrySet()) {
-      SymbolData symbol = entry.getKey();
-
-      pw.print(entry.getValue());
-
-      print(pw, symbol.getJsniIdent());
-      print(pw, symbol.getClassName());
-      print(pw, symbol.getMemberName());
-      print(pw, symbol.getSourceUri());
-      print(pw, String.valueOf(symbol.getSourceLine()));
-      pw.println();
-    }
-  }
-
-  private void print(PrintWriter pw, String value) {
-    pw.print(",");
-    if (value != null) {
-      pw.print(value);
-    }
-  }
-
-  private void print(PrintWriter pw, URI uri) {
-    pw.print(",");
-    if (uri != null) {
-      pw.print(uri.toASCIIString());
+    for (SymbolData symbol : result.getSymbolMap()) {
+      StringBuilder sb = new StringBuilder(1024);
+      sb.append(symbol.getSymbolName());
+
+      sb.append(',');
+      sb.append(symbol.getJsniIdent());
+      sb.append(',');
+      sb.append(symbol.getClassName());
+      sb.append(',');
+      String memberName = symbol.getMemberName();
+      if (memberName != null) {
+        sb.append(memberName);
+      }
+      sb.append(',');
+      String sourceUri = symbol.getSourceUri();
+      if (sourceUri != null) {
+        sb.append(sourceUri);
+      }
+      sb.append(',');
+      sb.append(symbol.getSourceLine());
+      sb.append('\n');
+      pw.write(sb.toString());
      }
    }
  }

Modified: trunk/dev/core/src/com/google/gwt/dev/PermutationResult.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/PermutationResult.java        
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/PermutationResult.java        Mon May 
11  
17:09:04 2009
@@ -16,10 +16,8 @@
  package com.google.gwt.dev;

  import com.google.gwt.core.ext.linker.ArtifactSet;
-import com.google.gwt.core.ext.linker.SymbolData;

  import java.io.Serializable;
-import java.util.SortedMap;

  /**
   * An extensible return type for the results of compiling a single  
permutation.
@@ -39,5 +37,5 @@
    /**
     * The symbol map for the permutation.
     */
-  SortedMap<SymbolData, String> getSymbolMap();
+  byte[] getSerializedSymbolMap();
  }

Modified:  
trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java     
 
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java     
 
Mon May 11 17:09:04 2009
@@ -20,6 +20,7 @@
  import com.google.gwt.core.ext.linker.ArtifactSet;
  import com.google.gwt.core.ext.linker.SymbolData;
  import com.google.gwt.core.ext.linker.impl.StandardCompilationAnalysis;
+import com.google.gwt.core.ext.linker.impl.StandardSymbolData;
  import com.google.gwt.core.ext.soyc.Range;
  import com.google.gwt.core.ext.soyc.SplitPointRecorder;
  import com.google.gwt.core.ext.soyc.StoryRecorder;
@@ -103,12 +104,14 @@
  import com.google.gwt.dev.util.Memory;
  import com.google.gwt.dev.util.PerfLogger;
  import com.google.gwt.dev.util.TextOutput;
+import com.google.gwt.dev.util.Util;

  import org.eclipse.jdt.core.compiler.IProblem;
  import org.eclipse.jdt.internal.compiler.CompilationResult;
  import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
  import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;

+import java.io.ByteArrayOutputStream;
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
@@ -121,7 +124,6 @@
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
-import java.util.SortedMap;
  import java.util.TreeMap;
  import java.util.TreeSet;

@@ -134,12 +136,18 @@
    private static class PermutationResultImpl implements PermutationResult {
      private final ArtifactSet artifacts = new ArtifactSet();
      private final String[] js;
-    private final SortedMap<SymbolData, String> symbolMap;
+    private final byte[] serializedSymbolMap;

-    public PermutationResultImpl(String[] js,
-        SortedMap<SymbolData, String> symbolMap) {
+    public PermutationResultImpl(String[] js, SymbolData[] symbolMap) {
        this.js = js;
-      this.symbolMap = symbolMap;
+      try {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Util.writeObjectToStream(baos, (Object) symbolMap);
+        this.serializedSymbolMap = baos.toByteArray();
+      } catch (IOException e) {
+        throw new RuntimeException("Should never happen with in-memory  
stream",
+            e);
+      }
      }

      public ArtifactSet getArtifacts() {
@@ -150,8 +158,8 @@
        return js;
      }

-    public SortedMap<SymbolData, String> getSymbolMap() {
-      return symbolMap;
+    public byte[] getSerializedSymbolMap() {
+      return serializedSymbolMap;
      }
    }

@@ -181,7 +189,7 @@
        JProgram jprogram = ast.getJProgram();
        JsProgram jsProgram = ast.getJsProgram();
        JJSOptions options = unifiedAst.getOptions();
-      Map<SymbolData, JsName> symbolTable = new TreeMap<SymbolData,  
JsName>(
+      Map<StandardSymbolData, JsName> symbolTable = new  
TreeMap<StandardSymbolData, JsName>(
            new SymbolData.ClassIdentComparator());

        ResolveRebinds.exec(jprogram, rebindAnswers);
@@ -305,9 +313,8 @@
          }
        }

-      SortedMap<SymbolData, String> symbolMap = makeSymbolMap(symbolTable);
-
-      PermutationResult toReturn = new PermutationResultImpl(js,  
symbolMap);
+      PermutationResult toReturn = new PermutationResultImpl(js,
+          makeSymbolMap(symbolTable));
        if (sourceInfoMaps != null) {

          // get method dependencies
@@ -859,19 +866,17 @@
      return amp.makeStatement();
    }

-  private static SortedMap<SymbolData, String> makeSymbolMap(
-      Map<SymbolData, JsName> symbolTable) {
+  private static SymbolData[] makeSymbolMap(
+      Map<StandardSymbolData, JsName> symbolTable) {

-    SortedMap<SymbolData, String> toReturn = new TreeMap<SymbolData,  
String>(
-        new SymbolData.ClassIdentComparator());
-
-    for (Map.Entry<SymbolData, JsName> entry : symbolTable.entrySet()) {
-      assert !toReturn.containsKey(entry.getKey()) : "Duplicate key for "
-          + entry.getKey().toString();
-      toReturn.put(entry.getKey(), entry.getValue().getShortIdent());
+    SymbolData[] result = new SymbolData[symbolTable.size()];
+    int i = 0;
+    for (Map.Entry<StandardSymbolData, JsName> entry :  
symbolTable.entrySet()) {
+      StandardSymbolData symbolData = entry.getKey();
+      symbolData.setSymbolName(entry.getValue().getShortIdent());
+      result[i++] = symbolData;
      }
-
-    return toReturn;
+    return result;
    }

    private static void maybeDumpAST(JProgram jprogram) {

Modified:  
trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
==============================================================================
---  
trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java       
 
(original)
+++  
trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java       
 
Mon May 11 17:09:04 2009
@@ -15,7 +15,6 @@
   */
  package com.google.gwt.dev.jjs.impl;

-import com.google.gwt.core.ext.linker.SymbolData;
  import com.google.gwt.core.ext.linker.impl.StandardSymbolData;
  import com.google.gwt.dev.jjs.HasSourceInfo;
  import com.google.gwt.dev.jjs.InternalCompilerException;
@@ -153,6 +152,14 @@
    private class CreateNamesAndScopesVisitor extends JVisitor {

      private final JField arrayLengthField =  
program.getIndexedField("Array.length");
+
+    /**
+     * Cache of computed Java source file names to URI strings for symbol
+     * export. By using a cache we also ensure the miminum number of String
+     * instances are serialized.
+     */
+    private final Map<String, String> fileNameToUriString = new  
HashMap<String, String>();
+
      private final Stack<JsScope> scopeStack = new Stack<JsScope>();

      @Override
@@ -365,6 +372,23 @@
        return false;
      }

+    /**
+     * Generate a file name URI string for a source info, for symbol data
+     * export.
+     */
+    private String makeUriString(HasSourceInfo x) {
+      String fileName = x.getSourceInfo().getFileName();
+      if (fileName == null) {
+        return null;
+      }
+      String uriString = fileNameToUriString.get(fileName);
+      if (uriString == null) {
+        uriString = StandardSymbolData.toUriString(fileName);
+        fileNameToUriString.put(fileName, uriString);
+      }
+      return uriString;
+    }
+
      private JsScope peek() {
        return scopeStack.peek();
      }
@@ -378,18 +402,14 @@
      }

      private void recordSymbol(JReferenceType x, JsName jsName) {
-      SymbolData symbolData = StandardSymbolData.forClass(x.getName(),
-          x.getSourceInfo().getFileName(),  
x.getSourceInfo().getStartLine());
+      StandardSymbolData symbolData =  
StandardSymbolData.forClass(x.getName(),
+          makeUriString(x), x.getSourceInfo().getStartLine());
        assert !symbolTable.containsKey(symbolData);
        symbolTable.put(symbolData, jsName);
      }

      private <T extends HasEnclosingType & HasName & HasSourceInfo> void  
recordSymbol(
          T x, JsName jsName) {
-      StringBuilder sb = new StringBuilder();
-      sb.append(x.getEnclosingType().getName());
-      sb.append("::");
-
        /*
         * NB: The use of x.getName() can produce confusion in cases where a  
type
         * has both polymorphic and static dispatch for a method, because you
@@ -402,9 +422,10 @@
         * begin with a dollar-sign and whose first parameter is the  
enclosing
         * type.
         */
-      sb.append(x.getName());

+      String methodSig;
        if (x instanceof JMethod) {
+        StringBuilder sb = new StringBuilder();
          sb.append('(');
          JMethod method = ((JMethod) x);
          for (JType t : method.getOriginalParamTypes()) {
@@ -412,14 +433,17 @@
          }
          sb.append(')');
          sb.append(method.getOriginalReturnType().getJsniSignatureName());
+        methodSig = sb.toString();
+      } else {
+        methodSig = null;
        }

-      SymbolData symbolData = StandardSymbolData.forMember(
-          x.getEnclosingType().getName(), x.getName(), sb.toString(),
-          x.getSourceInfo().getFileName(),  
x.getSourceInfo().getStartLine());
+      StandardSymbolData symbolData = StandardSymbolData.forMember(
+          x.getEnclosingType().getName(), x.getName(), methodSig,
+          makeUriString(x), x.getSourceInfo().getStartLine());
        assert !symbolTable.containsKey(symbolData) : "Duplicate symbol "
            + "recorded " + jsName.getIdent() + " for " + x.getName()
-          + " and key " + sb.toString();
+          + " and key " + symbolData.getJsniIdent();
        symbolTable.put(symbolData, jsName);
      }
    }
@@ -1800,7 +1824,7 @@
    }

    public static JavaToJavaScriptMap exec(JProgram program, JsProgram  
jsProgram,
-      JsOutputOption output, Map<SymbolData, JsName> symbolTable) {
+      JsOutputOption output, Map<StandardSymbolData, JsName> symbolTable) {
      GenerateJavaScriptAST generateJavaScriptAST = new  
GenerateJavaScriptAST(
          program, jsProgram, output, symbolTable);
      return generateJavaScriptAST.execImpl();
@@ -1861,6 +1885,11 @@
    private final Set<JReferenceType> specialObfuscatedTypes = new  
HashSet<JReferenceType>();

    /**
+   * Maps JsNames to machine-usable identifiers.
+   */
+  private final Map<StandardSymbolData, JsName> symbolTable;
+
+  /**
     * Contains JsNames for all globals, such as static fields and methods.
     */
    private final JsScope topScope;
@@ -1871,13 +1900,8 @@

    private final Map<JsStatement, JMethod> vtableInitForMethodMap = new  
HashMap<JsStatement, JMethod>();

-  /**
-   * Maps JsNames to machine-usable identifiers.
-   */
-  private final Map<SymbolData, JsName> symbolTable;
-
    private GenerateJavaScriptAST(JProgram program, JsProgram jsProgram,
-      JsOutputOption output, Map<SymbolData, JsName> symbolTable) {
+      JsOutputOption output, Map<StandardSymbolData, JsName> symbolTable) {
      this.program = program;
      typeOracle = program.typeOracle;
      this.jsProgram = jsProgram;

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

Reply via email to