2010-04-06  Adam Barth  <abarth@webkit.org>

        Reviewed by Eric Seidel.

        REGRESSION: Worker termination via JS timeout may cause worker tests like fast/workers/worker-terminate.html fail.
        https://bugs.webkit.org/show_bug.cgi?id=36646

        Add a new exception type for forcibly terminating a JavaScript stack.
        The new exception functions similarly to the
        InterruptedExecutionException but is conceptually different because
        execution is terminated instead of just interrupted.

        * GNUmakefile.am:
            - Added new Terminator.h file.
        * JavaScriptCore.gypi:
            - Added new Terminator.h file.
        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
            - Added new Terminator.h file.
        * JavaScriptCore.xcodeproj/project.pbxproj:
            - Added new Terminator.h file.
        * interpreter/Interpreter.cpp:
        (JSC::Interpreter::throwException):
            - Fully unwind the stack for TerminatedExecutionException.
        (JSC::Interpreter::privateExecute):
            - Check if we've been terminated at the same time we check if we've
              timed out.
        * jit/JITStubs.cpp:
        (JSC::DEFINE_STUB_FUNCTION):
            - Check if we've been terminated at the same time we check if we've
              timed out.
        * runtime/Completion.cpp:
            - Some exceptions define special completion types so that calls can
              see why we terminated evaluation.
        (JSC::evaluate):
        * runtime/Completion.h:
            - Define a new completion type for termination.
        (JSC::):
        * runtime/ExceptionHelpers.cpp:
            - Define TerminatedExecutionException and refactor pseudo-RTTI
              virtual function to be more semantic.
        (JSC::InterruptedExecutionError::exceptionType):
        (JSC::TerminatedExecutionError::TerminatedExecutionError):
        (JSC::TerminatedExecutionError::exceptionType):
        (JSC::TerminatedExecutionError::toString):
        (JSC::createTerminatedExecutionException):
        * runtime/ExceptionHelpers.h:
            - Entry point for generating a TerminatedExecutionException.
        * runtime/JSGlobalData.cpp:
        (JSC::JSGlobalData::JSGlobalData):
            - Add a Terminator object that can be used to asynchronously
              terminate a JavaScript execution stack.
        * runtime/JSGlobalData.h:
        * runtime/JSObject.h:
        (JSC::JSObject::exceptionType):
            - Define that, by default, thrown objects have a normal exception
              type.
        * runtime/Terminator.h: Added.
            - Added a new controller object that can be used to terminate
              execution asynchronously.  This object is more or less a
              glorified bool.
        (JSC::Terminator::Terminator):
        (JSC::Terminator::termianteSoon):
        (JSC::Terminator::shouldTerminate):
2010-04-06  Adam Barth  <abarth@webkit.org>

        Reviewed by Eric Seidel.

        REGRESSION: Worker termination via JS timeout may cause worker tests like fast/workers/worker-terminate.html fail.
        https://bugs.webkit.org/show_bug.cgi?id=36646

        * fast/workers/resources/worker-run-forever.js: Added.
        * fast/workers/worker-terminate-forever-expected.txt: Added.
        * fast/workers/worker-terminate-forever.html: Added.
            - Test what happens when we terminate an infinitely running worker.
              The essential point is that we don't spam the console with
              nonsense about a timeout.
        * platform/mac/Skipped:
            - Rescue worker-terminate.html from the Skipped list now that we've
              fixed the underlying bug that was causing the flakiness.
2010-04-06  Adam Barth  <abarth@webkit.org>

        Reviewed by Eric Seidel.

        REGRESSION: Worker termination via JS timeout may cause worker tests like fast/workers/worker-terminate.html fail.
        https://bugs.webkit.org/show_bug.cgi?id=36646

        Cause the worker code to swallow termination exceptions because these
        need not be reported to the user because they are an implementation
        detail of how we terminate worker execution.

        Test: fast/workers/worker-terminate-forever.html

        * bindings/js/JSDOMBinding.cpp:
        (WebCore::reportException):
            - Refuse to report termination exceptions to the user because they
              are an implementation detail.
        * bindings/js/WorkerScriptController.cpp:
        (WebCore::WorkerScriptController::forbidExecution):
            - Instead of using timeouts to stop run away workers, use our fancy
              new Terminator object.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@57192 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/runtime/Completion.cpp b/JavaScriptCore/runtime/Completion.cpp
index 2f88df9..bdd82d8 100644
--- a/JavaScriptCore/runtime/Completion.cpp
+++ b/JavaScriptCore/runtime/Completion.cpp
@@ -62,9 +62,10 @@
     JSValue result = exec->interpreter()->execute(program.get(), exec, scopeChain.node(), thisObj, &exception);
 
     if (exception) {
-        if (exception.isObject() && asObject(exception)->isWatchdogException())
-            return Completion(Interrupted, exception);
-        return Completion(Throw, exception);
+        ComplType exceptionType = Throw;
+        if (exception.isObject())
+            exceptionType = asObject(exception)->exceptionType();
+        return Completion(exceptionType, exception);
     }
     return Completion(Normal, result);
 }