Make production mode stack traces match JRE spec more closely
- Fix StackTraceElement#getFileName(), so that it returns null instead of "Unknown Source"
- Fix StackTraceElement#getLineNumber(), so that it returns -1 instead of 0
- Fix StackTraceElement#toString(), so that lineNumber is omitted when it is unknown, so that
"Unknown.foo(Unknown Source:0)" becomes "Unknown.foo(Unknown Source)"

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

Review by: scottb@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9568 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
index 5e13099..cee201c 100644
--- a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
+++ b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
@@ -67,8 +67,8 @@
 
       StackTraceElement[] stackTrace = new StackTraceElement[stack.length()];
       for (int i = 0, j = stackTrace.length; i < j; i++) {
-        stackTrace[i] = new StackTraceElement("Unknown", stack.get(i),
-            "Unknown source", 0);
+        stackTrace[i] = new StackTraceElement("Unknown", stack.get(i), null,
+            LINE_NUMBER_UNKNOWN);
       }
       e.setStackTrace(stackTrace);
     }
@@ -77,8 +77,8 @@
       JsArrayString stack = StackTraceCreator.createStackTrace();
       StackTraceElement[] stackTrace = new StackTraceElement[stack.length()];
       for (int i = 0, j = stackTrace.length; i < j; i++) {
-        stackTrace[i] = new StackTraceElement("Unknown", stack.get(i),
-            "Unknown source", 0);
+        stackTrace[i] = new StackTraceElement("Unknown", stack.get(i), null,
+            LINE_NUMBER_UNKNOWN);
       }
       t.setStackTrace(stackTrace);
     }
@@ -145,8 +145,8 @@
       for (int i = 0, j = stackTrace.length; i < j; i++) {
         // Locations is also backwards
         String location = locations.get(j - i - 1);
-        String fileName = "Unknown source";
-        int lineNumber = 0;
+        String fileName = null;
+        int lineNumber = LINE_NUMBER_UNKNOWN;
         if (location != null) {
           int idx = location.indexOf(':');
           if (idx != -1) {
@@ -361,6 +361,8 @@
     }
   }
   
+  private static final int LINE_NUMBER_UNKNOWN = -1;
+
   /**
    * Create a stack trace based on a JavaScriptException. This method should
    * only be called in Production Mode.
diff --git a/user/super/com/google/gwt/emul/java/lang/StackTraceElement.java b/user/super/com/google/gwt/emul/java/lang/StackTraceElement.java
index 1e40735..4215e3c 100644
--- a/user/super/com/google/gwt/emul/java/lang/StackTraceElement.java
+++ b/user/super/com/google/gwt/emul/java/lang/StackTraceElement.java
@@ -60,7 +60,8 @@
   }
 
   public String toString() {
-    return className + "." + methodName + "(" + fileName + ":" + lineNumber
-        + ")";
+    return className + "." + methodName + "("
+        + (fileName != null ? fileName : "Unknown Source")
+        + (lineNumber >= 0 ? ":" + lineNumber : "") + ")";
   }
 }