Lazy inits on JavaScriptException to keep code size down for very tiny apps that catch Throwable.

Review by: jgw


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@3096 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/core/client/JavaScriptException.java b/user/src/com/google/gwt/core/client/JavaScriptException.java
index aefa2bc..b2005e5 100644
--- a/user/src/com/google/gwt/core/client/JavaScriptException.java
+++ b/user/src/com/google/gwt/core/client/JavaScriptException.java
@@ -24,10 +24,6 @@
  */
 public final class JavaScriptException extends RuntimeException {
 
-  private static String constructMessage(Object e) {
-    return "(" + getName(e) + "): " + getDescription(e) + getProperties(e);
-  }
-
   private static String getDescription(Object e) {
     if (e instanceof JavaScriptObject) {
       return getDescription0((JavaScriptObject) e);
@@ -40,14 +36,6 @@
     return (e == null) ? null : e.message;
   }-*/;
 
-  private static JavaScriptObject getException(Object e) {
-    if (e instanceof JavaScriptObject) {
-      return (JavaScriptObject) e;
-    } else {
-      return null;
-    }
-  }
-
   private static String getName(Object e) {
     if (e == null) {
       return "null";
@@ -86,34 +74,36 @@
    * The original description of the JavaScript exception this class wraps,
    * initialized as <code>e.message</code>.
    */
-  private final String description;
+  private String description;
 
   /**
    * The underlying exception this class wraps.
    */
-  private final JavaScriptObject exception;
+  private final Object e;
+
+  /**
+   * A constructed message describing this exception.
+   */
+  private String message;
 
   /**
    * The original type name of the JavaScript exception this class wraps,
    * initialized as <code>e.name</code>.
    */
-  private final String name;
+  private String name;
 
   /**
    * @param e the object caught in JavaScript that triggered the exception
    */
   public JavaScriptException(Object e) {
-    super(constructMessage(e));
-    this.name = getName(e);
-    this.description = getDescription(e);
-    this.exception = getException(e);
+    this.e = e;
   }
 
   public JavaScriptException(String name, String description) {
-    super("JavaScript " + name + " exception: " + description);
+    this.message = "JavaScript " + name + " exception: " + description;
     this.name = name;
     this.description = description;
-    this.exception = null;
+    this.e = null;
   }
 
   /**
@@ -127,7 +117,7 @@
     super(message);
     this.name = null;
     this.description = message;
-    this.exception = null;
+    this.e = null;
   }
 
   /**
@@ -135,6 +125,9 @@
    * <code>null</code>.
    */
   public String getDescription() {
+    if (description == null) {
+      init();
+    }
     return description;
   }
 
@@ -142,7 +135,15 @@
    * Returns the original JavaScript the exception; may be <code>null</code>.
    */
   public JavaScriptObject getException() {
-    return exception;
+    return (e instanceof JavaScriptObject) ? (JavaScriptObject) e : null;
+  }
+
+  @Override
+  public String getMessage() {
+    if (message == null) {
+      init();
+    }
+    return message;
   }
 
   /**
@@ -150,7 +151,16 @@
    * <code>null</code>.
    */
   public String getName() {
+    if (name == null) {
+      init();
+    }
     return name;
   }
+  
+  private void init() {
+    name = getName(e);
+    description = getDescription(e);
+    message = "(" + name + "): " + description + getProperties(e);
+  }
 
 }