Backporting trunk conflict-resolution from r4488 merge.  This change should not be merged up into trunk.

git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4489 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/CompilePerms.java b/dev/core/src/com/google/gwt/dev/CompilePerms.java
index b2e7072..87f4b3a 100644
--- a/dev/core/src/com/google/gwt/dev/CompilePerms.java
+++ b/dev/core/src/com/google/gwt/dev/CompilePerms.java
@@ -172,22 +172,19 @@
 
   /**
    * Compile a single permutation.
+   * 
+   * @throws UnableToCompleteException if the permutation compile fails
    */
   public static PermutationResult compile(TreeLogger logger,
-      Permutation permutation, UnifiedAst unifiedAst) {
-    try {
-      final String js = JavaToJavaScriptCompiler.compilePermutation(logger,
-          unifiedAst, permutation.getRebindAnswers());
-      return new PermutationResult() {
-        public String getJs() {
-          return js;
-        }
-      };
-    } catch (UnableToCompleteException e) {
-      // We intentionally don't pass in the exception here since the real
-      // cause has been logged.
-      return null;
-    }
+      Permutation permutation, UnifiedAst unifiedAst)
+      throws UnableToCompleteException {
+    final String js = JavaToJavaScriptCompiler.compilePermutation(logger,
+        unifiedAst, permutation.getRebindAnswers());
+    return new PermutationResult() {
+      public String getJs() {
+        return js;
+      }
+    };
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/CompilePermsServer.java b/dev/core/src/com/google/gwt/dev/CompilePermsServer.java
index ac4cc42..3f080f8 100644
--- a/dev/core/src/com/google/gwt/dev/CompilePermsServer.java
+++ b/dev/core/src/com/google/gwt/dev/CompilePermsServer.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev;
 
 import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.TreeLogger.Type;
 import com.google.gwt.dev.jjs.UnifiedAst;
 import com.google.gwt.dev.util.arg.ArgHandlerLogLevel;
@@ -290,10 +291,22 @@
     Permutation p = (Permutation) in.readObject();
     logger.log(TreeLogger.SPAM, "Permutation read");
 
-    PermutationResult result = CompilePerms.compile(logger.branch(
-        TreeLogger.DEBUG, "Compiling"), p, ast);
-    logger.log(TreeLogger.DEBUG, "Successfully compiled permutation");
-    out.writeObject(result);
+    Throwable caught = null;
+    try {
+      PermutationResult result = CompilePerms.compile(logger.branch(
+          TreeLogger.DEBUG, "Compiling"), p, ast);
+      out.writeObject(result);
+      out.flush();
+      logger.log(TreeLogger.DEBUG, "Successfully compiled permutation");
+      return;
+    } catch (UnableToCompleteException e) {
+      caught = e;
+    } catch (Throwable e) {
+      logger.log(TreeLogger.ERROR, "Compile failed", e);
+      caught = e;
+    }
+
+    out.writeObject(caught);
     out.flush();
     logger.log(TreeLogger.SPAM, "Sent result");
   }
diff --git a/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java b/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
index 137144d..a039d07 100644
--- a/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
+++ b/dev/core/src/com/google/gwt/dev/ExternalPermutationWorkerFactory.java
@@ -141,7 +141,13 @@
         out.writeBoolean(true);
         out.writeObject(permutation);
         out.flush();
-        return (PermutationResult) in.readObject();
+        Object result = in.readObject();
+        if (result instanceof Throwable) {
+          Throwable t = (Throwable) result;
+          logger.log(TreeLogger.ERROR, "Error from external worker", t);
+          throw new UnableToCompleteException();
+        }
+        return (PermutationResult) result;
       } catch (IOException e) {
         logger.log(TreeLogger.WARN, "Lost communication with remote process", e);
         throw new TransientWorkerException(
diff --git a/dev/core/src/com/google/gwt/dev/PermutationWorker.java b/dev/core/src/com/google/gwt/dev/PermutationWorker.java
index 80e69cd..26afa3d 100644
--- a/dev/core/src/com/google/gwt/dev/PermutationWorker.java
+++ b/dev/core/src/com/google/gwt/dev/PermutationWorker.java
@@ -32,8 +32,7 @@
    * 
    * @throws TransientWorkerException if the Permutation should be tried again
    *           on another worker
-   * @throws UnableToCompleteException due to a fatal error
-   * @return <code>null</code> if the compile failed
+   * @throws UnableToCompleteException if the compile fails for any reason
    */
   PermutationResult compile(TreeLogger logger, Permutation permutation)
       throws TransientWorkerException, UnableToCompleteException;
diff --git a/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java b/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
index 507f9ba..ef828ac 100644
--- a/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
+++ b/dev/core/src/com/google/gwt/dev/PermutationWorkerFactory.java
@@ -70,15 +70,9 @@
             TreeLogger logger = work.getLogger();
             try {
               PermutationResult result = worker.compile(logger, work.getPerm());
-              if (result == null) {
-                logger.log(TreeLogger.ERROR, "Compilation failed");
-                return;
-              } else {
-                Util.writeObjectAsFile(logger, work.getResultFile(), result);
-                logger.log(TreeLogger.DEBUG,
-                    "Successfully compiled permutation");
-                resultsQueue.put(Result.SUCCESS);
-              }
+              Util.writeObjectAsFile(logger, work.getResultFile(), result);
+              logger.log(TreeLogger.DEBUG, "Successfully compiled permutation");
+              resultsQueue.put(Result.SUCCESS);
             } catch (TransientWorkerException e) {
               logger.log(TreeLogger.DEBUG,
                   "Worker died, will retry Permutation", e);