Inspector should display information about non-object exceptions
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 7 Apr 2013 18:47:20 +0000 (18:47 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 7 Apr 2013 18:47:20 +0000 (18:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=114123

Reviewed by Adele Peterson.

Source/JavaScriptCore:

Make sure we store the right stack information, even when throwing
a primitive.

* interpreter/CallFrame.h:
(JSC::ExecState::clearSupplementaryExceptionInfo):
(ExecState):
* interpreter/Interpreter.cpp:
(JSC::Interpreter::addStackTraceIfNecessary):
(JSC::Interpreter::throwException):

Source/WebCore:

Make use of the stack trace for line information when we're reporting
an exception

* bindings/js/JSDOMBinding.cpp:
(WebCore::reportException):

LayoutTests:

All these tests throw primitives as exceptions, and now they have source
and line number information

* fast/dom/exception-getting-event-handler-expected.txt:
* fast/dom/javascript-url-exception-isolation-expected.txt:
* fast/dom/nested-script-exceptions-expected.txt:
* fast/events/onerror-no-constructor-expected.txt:
* fast/events/window-onerror13-expected.txt:
* fast/events/window-onerror16-expected.txt:
* fast/events/window-onerror2-expected.txt:
* fast/events/window-onerror8-expected.txt:
* fast/js/uncaught-exception-line-number-expected.txt:
* fast/sub-pixel/inline-block-with-padding-expected.txt:
* platform/mac/fast/AppleScript/001-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@147872 268f45cc-cd09-0410-ab3c-d52691b4dbfc

17 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/exception-getting-event-handler-expected.txt
LayoutTests/fast/dom/javascript-url-exception-isolation-expected.txt
LayoutTests/fast/dom/nested-script-exceptions-expected.txt
LayoutTests/fast/events/onerror-no-constructor-expected.txt
LayoutTests/fast/events/window-onerror13-expected.txt
LayoutTests/fast/events/window-onerror16-expected.txt
LayoutTests/fast/events/window-onerror2-expected.txt
LayoutTests/fast/events/window-onerror8-expected.txt
LayoutTests/fast/js/uncaught-exception-line-number-expected.txt
LayoutTests/fast/sub-pixel/inline-block-with-padding-expected.txt
LayoutTests/platform/mac/fast/AppleScript/001-expected.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/interpreter/CallFrame.h
Source/JavaScriptCore/interpreter/Interpreter.cpp
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMBinding.cpp

index 3e0daf3..9cb2d6a 100644 (file)
@@ -1,3 +1,25 @@
+2013-04-07  Oliver Hunt  <oliver@apple.com>
+
+        Inspector should display information about non-object exceptions
+        https://bugs.webkit.org/show_bug.cgi?id=114123
+
+        Reviewed by Adele Peterson.
+
+        All these tests throw primitives as exceptions, and now they have source
+        and line number information
+
+        * fast/dom/exception-getting-event-handler-expected.txt:
+        * fast/dom/javascript-url-exception-isolation-expected.txt:
+        * fast/dom/nested-script-exceptions-expected.txt:
+        * fast/events/onerror-no-constructor-expected.txt:
+        * fast/events/window-onerror13-expected.txt:
+        * fast/events/window-onerror16-expected.txt:
+        * fast/events/window-onerror2-expected.txt:
+        * fast/events/window-onerror8-expected.txt:
+        * fast/js/uncaught-exception-line-number-expected.txt:
+        * fast/sub-pixel/inline-block-with-padding-expected.txt:
+        * platform/mac/fast/AppleScript/001-expected.txt:
+
 2013-04-07  Robert Hogan  <robert@webkit.org>
 
         table element may get larger when its contents are recreated
index 6f1fb8d..f77deed 100644 (file)
@@ -1,4 +1,4 @@
-CONSOLE MESSAGE: 42
+CONSOLE MESSAGE: line 12: 42
 This test checks that an exception thrown when getting the handleEvent property of an event listener does not crash.
 
 PASS: You didn't crash.
index f3718a8..b7485a1 100644 (file)
@@ -1,4 +1,4 @@
-CONSOLE MESSAGE: 42
+CONSOLE MESSAGE: line 1: 42
 CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '<'
 Exceptions thrown in javascript URLs should not propagate to the main script.
 
index 69bf0e2..2010828 100644 (file)
@@ -1,2 +1,2 @@
-CONSOLE MESSAGE: Badness 10,000
+CONSOLE MESSAGE: line 1: Badness 10,000
 This test checks that exceptions in nested scripts are logged properly. An exception named "Badness 10,000" should be logged properly.
index 1c6f53a..fb5db2d 100644 (file)
@@ -1,3 +1,3 @@
 CONSOLE MESSAGE: line 8: FAIL
-CONSOLE MESSAGE: PASS if this is reported as an uncaught exception.
+CONSOLE MESSAGE: line 20: PASS if this is reported as an uncaught exception.
 
index ca614c3..cf3ee12 100644 (file)
@@ -1,4 +1,4 @@
-CONSOLE MESSAGE: An Error
+CONSOLE MESSAGE: line 24: An Error
 Test that error is treated as not handled when window.onerror return value is not 'true'. Bug 67119.
 
 Uncaught error should be printed in console when window.onerror returns not true.
index 1821da0..a64a132 100644 (file)
@@ -1,4 +1,4 @@
-CONSOLE MESSAGE: An Error
+CONSOLE MESSAGE: line 25: An Error
 Test that error is treated as not handled when window.onerror return value is 'false'. Bug 67119.
 
 window.onerror invoked. Uncaught error should be printed in console
index 4db9e62..9e0c663 100644 (file)
@@ -1,6 +1,6 @@
 Test that uncaught exceptions will be reported to the window.onerror handler. Bug 8519.
 
 Main frame window.onerror: Error: Inline script exception at window-onerror2.html:34
-Main frame window.onerror: Exception in onload at undefined:0
+Main frame window.onerror: Exception in onload at window-onerror2.html:2
 Main frame window.onerror: Error: Exception in setTimeout at window-onerror2.html:29
 
index efc6308..15ed3b4 100644 (file)
@@ -1,5 +1,5 @@
 Test that window.onerror is called on window object. Bug 8519.
 
-Main frame window.onerror: 2010 at undefined:0
+Main frame window.onerror: 2010 at window-onerror8.html:24
 PASSED: this === window
 
index a703494..9e3536d 100644 (file)
@@ -1,3 +1,3 @@
-CONSOLE MESSAGE: uh oh, an exception!
+CONSOLE MESSAGE: line 11: uh oh, an exception!
 This tests that uncaught exceptions have the right line numbers, for example for display in the JavaScript error console. To run the test manually, look in the JS console for an uncaught exception on line 11.
 
index fc4741a..d82994f 100644 (file)
@@ -1,4 +1,4 @@
-PASS links[0].offsetWidth is within 1 of 167
+PASS links[0].offsetWidth is within 1 of 175
 Both links should render the same and not wrap.
 
 This shouldn't wrap
index ce2d21d..cca9a3f 100644 (file)
@@ -1,4 +1,4 @@
-CONSOLE MESSAGE: this is an exception
+CONSOLE MESSAGE: line 1: this is an exception
 An automated test for basic AppleScript "do JavaScript" support.
 4 ('long')
 4 ('long')
index 9c8bbdb..b1e0c4f 100644 (file)
@@ -1,3 +1,20 @@
+2013-04-07  Oliver Hunt  <oliver@apple.com>
+
+        Inspector should display information about non-object exceptions
+        https://bugs.webkit.org/show_bug.cgi?id=114123
+
+        Reviewed by Adele Peterson.
+
+        Make sure we store the right stack information, even when throwing
+        a primitive.
+
+        * interpreter/CallFrame.h:
+        (JSC::ExecState::clearSupplementaryExceptionInfo):
+        (ExecState):
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::addStackTraceIfNecessary):
+        (JSC::Interpreter::throwException):
+
 2013-04-06  Oliver Hunt  <oliver@apple.com>
 
         Unify the many and varied stack trace mechanisms, and make the result sane.
index 716115b..746d334 100644 (file)
@@ -68,6 +68,11 @@ namespace JSC  {
         // But they're used in many places in legacy code, so they're not going away any time soon.
 
         void clearException() { globalData().exception = JSValue(); }
+        void clearSupplementaryExceptionInfo()
+        {
+            globalData().exceptionStack = RefCountedArray<StackFrame>();
+        }
+
         JSValue exception() const { return globalData().exception; }
         bool hadException() const { return globalData().exception; }
 
index 62a41da..e955428 100644 (file)
@@ -761,9 +761,10 @@ void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSValue error)
 
     Vector<StackFrame> stackTrace;
     getStackTrace(&callFrame->globalData(), stackTrace);
-    
+    globalData->exceptionStack = RefCountedArray<StackFrame>(stackTrace);
     if (stackTrace.isEmpty() || !error.isObject())
         return;
+
     JSObject* errorObject = asObject(error);
     JSGlobalObject* globalObject = 0;
     if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error))
@@ -810,6 +811,12 @@ NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSV
         }
 
         isInterrupt = isInterruptedExecutionException(exception) || isTerminatedExecutionException(exception);
+    } else {
+        if (!callFrame->globalData().exceptionStack.size()) {
+            Vector<StackFrame> stack;
+            Interpreter::getStackTrace(&callFrame->globalData(), stack);
+            callFrame->globalData().exceptionStack = RefCountedArray<StackFrame>(stack);
+        }
     }
 
     if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
index a0c8e8f..7cc9878 100644 (file)
@@ -1,3 +1,16 @@
+2013-04-07  Oliver Hunt  <oliver@apple.com>
+
+        Inspector should display information about non-object exceptions
+        https://bugs.webkit.org/show_bug.cgi?id=114123
+
+        Reviewed by Adele Peterson.
+
+        Make use of the stack trace for line information when we're reporting
+        an exception
+
+        * bindings/js/JSDOMBinding.cpp:
+        (WebCore::reportException):
+
 2013-04-07  Robert Hogan  <robert@webkit.org>
 
         table element may get larger when its contents are recreated
index b9c0789..4c5d0f0 100644 (file)
@@ -147,10 +147,21 @@ void reportException(ExecState* exec, JSValue exception, CachedScript* cachedScr
 
     Interpreter::ErrorHandlingMode mode(exec);
     String errorMessage = exception.toString(exec)->value(exec);
-    JSObject* exceptionObject = exception.toObject(exec);
-    int lineNumber = exceptionObject->get(exec, Identifier(exec, "line")).toInt32(exec);
-    String exceptionSourceURL = exceptionObject->get(exec, Identifier(exec, "sourceURL")).toString(exec)->value(exec);
+    int lineNumber = 0;
+    String exceptionSourceURL;
+
+    RefCountedArray<StackFrame> stackTrace = exec->globalData().exceptionStack;
     exec->clearException();
+    exec->clearSupplementaryExceptionInfo();
+
+    if (exception.isObject()) {
+        JSObject* exceptionObject = exception.toObject(exec);
+        lineNumber = exceptionObject->get(exec, Identifier(exec, "line")).toInt32(exec);
+        exceptionSourceURL = exceptionObject->get(exec, Identifier(exec, "sourceURL")).toString(exec)->value(exec);
+    } else if (stackTrace.size()) {
+        lineNumber = stackTrace[0].line();
+        exceptionSourceURL = stackTrace[0].friendlySourceURL();
+    }
 
     if (ExceptionBase* exceptionBase = toExceptionBase(exception))
         errorMessage = exceptionBase->message() + ": "  + exceptionBase->description();