Title: [114309] trunk
Revision
114309
Author
oli...@apple.com
Date
2012-04-16 15:26:36 -0700 (Mon, 16 Apr 2012)

Log Message

Exception stack traces aren't complete when the exception starts in native code
https://bugs.webkit.org/show_bug.cgi?id=84073

Reviewed by Gavin Barraclough.

Source/_javascript_Core:

Refactored building the stack trace to so that we can construct
it earlier, and don't rely on any prior work performed in the
exception handling machinery. Also updated LLInt and the DFG to
completely initialise the callframes of host function calls.

* bytecode/CodeBlock.h:
(JSC::CodeBlock::codeOriginIndexForReturn):
(CodeBlock):
* dfg/DFGOperations.cpp:
* interpreter/Interpreter.cpp:
(JSC::Interpreter::getStackTrace):
(JSC::Interpreter::addStackTraceIfNecessary):
(JSC):
(JSC::Interpreter::throwException):
* interpreter/Interpreter.h:
(Interpreter):
* jit/JITStubs.cpp:
(JSC::DEFINE_STUB_FUNCTION):
* jsc.cpp:
(functionJSCStack):
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::handleHostCall):
* parser/Parser.h:
(JSC::::parse):
* runtime/Error.cpp:
(JSC::addErrorInfo):
(JSC::throwError):
* runtime/Error.h:
(JSC):

LayoutTests:

Update tests to include new exception property ordering, and new functions

* fast/js/exception-properties-expected.txt:
* fast/js/script-tests/exception-properties.js:
* fast/js/script-tests/stack-trace.js:
(selfRecursive1): Modified slightly so that we produce consistent traces
* fast/js/stack-trace-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (114308 => 114309)


--- trunk/LayoutTests/ChangeLog	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/LayoutTests/ChangeLog	2012-04-16 22:26:36 UTC (rev 114309)
@@ -1,3 +1,18 @@
+2012-04-16  Oliver Hunt  <oli...@apple.com>
+
+        Exception stack traces aren't complete when the exception starts in native code
+        https://bugs.webkit.org/show_bug.cgi?id=84073
+
+        Reviewed by Gavin Barraclough.
+
+        Update tests to include new exception property ordering, and new functions
+
+        * fast/js/exception-properties-expected.txt:
+        * fast/js/script-tests/exception-properties.js:
+        * fast/js/script-tests/stack-trace.js:
+        (selfRecursive1): Modified slightly so that we produce consistent traces
+        * fast/js/stack-trace-expected.txt:
+
 2012-04-16  David Alcala  <dalc...@adobe.com>
 
         Update test_expectations for chromium

Modified: trunk/LayoutTests/fast/js/exception-properties-expected.txt (114308 => 114309)


--- trunk/LayoutTests/fast/js/exception-properties-expected.txt	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/LayoutTests/fast/js/exception-properties-expected.txt	2012-04-16 22:26:36 UTC (rev 114309)
@@ -4,7 +4,7 @@
 
 
 PASS enumerableProperties(error) is []
-PASS enumerableProperties(nativeError) is ["line", "sourceURL", "stack"]
+PASS enumerableProperties(nativeError) is ["stack", "line", "sourceURL"]
 PASS Object.getPrototypeOf(nativeError).name is "RangeError"
 PASS Object.getPrototypeOf(nativeError).message is ""
 PASS successfullyParsed is true

Modified: trunk/LayoutTests/fast/js/script-tests/exception-properties.js (114308 => 114309)


--- trunk/LayoutTests/fast/js/script-tests/exception-properties.js	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/LayoutTests/fast/js/script-tests/exception-properties.js	2012-04-16 22:26:36 UTC (rev 114309)
@@ -16,7 +16,7 @@
     var error = new Error("message");
 
     shouldBe('enumerableProperties(error)', '[]');
-    shouldBe('enumerableProperties(nativeError)', '["line", "sourceURL", "stack"]');
+    shouldBe('enumerableProperties(nativeError)', '["stack", "line", "sourceURL"]');
 
     shouldBe('Object.getPrototypeOf(nativeError).name', '"RangeError"');
     shouldBe('Object.getPrototypeOf(nativeError).message', '""');

Modified: trunk/LayoutTests/fast/js/script-tests/stack-trace.js (114308 => 114309)


--- trunk/LayoutTests/fast/js/script-tests/stack-trace.js	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/LayoutTests/fast/js/script-tests/stack-trace.js	2012-04-16 22:26:36 UTC (rev 114309)
@@ -49,10 +49,10 @@
 try { scripterInner(); } catch (e) { printStack(e.stack) }                   // program -> scripter -> inner
 try { scripterOuter(); } catch (e) { printStack(e.stack) }                   // program -> scripter -> outer -> inner
 
-function selfRecursive1() {
-    selfRecursive1();
+function selfRecursive1() { selfRecursive1();
 }
 
+
 try { selfRecursive1(); } catch (e) { printStack(e.stack) }                   // selfRecursive1 -> selfRecursive1 -> selfRecursive1 -> selfRecursive1 ...
 
 function selfRecursive2() {

Modified: trunk/LayoutTests/fast/js/stack-trace-expected.txt (114308 => 114309)


--- trunk/LayoutTests/fast/js/stack-trace-expected.txt	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/LayoutTests/fast/js/stack-trace-expected.txt	2012-04-16 22:26:36 UTC (rev 114309)
@@ -33,8 +33,9 @@
     2   global code at stack-trace.js:44
 
 --> Stack Trace:
-    0   hostThrower at stack-trace.js:25
-    1   global code at stack-trace.js:47
+    0   appendChild at [native code]
+    1   hostThrower at stack-trace.js:25
+    2   global code at stack-trace.js:47
 
 --> Stack Trace:
     0   htmlInner at stack-trace.html:10
@@ -48,109 +49,109 @@
     3   global code at stack-trace.js:50
 
 --> Stack Trace:
-    0   selfRecursive1 at stack-trace.js:53
-    1   selfRecursive1 at stack-trace.js:53
-    2   selfRecursive1 at stack-trace.js:53
-    3   selfRecursive1 at stack-trace.js:53
-    4   selfRecursive1 at stack-trace.js:53
-    5   selfRecursive1 at stack-trace.js:53
-    6   selfRecursive1 at stack-trace.js:53
-    7   selfRecursive1 at stack-trace.js:53
-    8   selfRecursive1 at stack-trace.js:53
-    9   selfRecursive1 at stack-trace.js:53
-    10   selfRecursive1 at stack-trace.js:53
-    11   selfRecursive1 at stack-trace.js:53
-    12   selfRecursive1 at stack-trace.js:53
-    13   selfRecursive1 at stack-trace.js:53
-    14   selfRecursive1 at stack-trace.js:53
-    15   selfRecursive1 at stack-trace.js:53
-    16   selfRecursive1 at stack-trace.js:53
-    17   selfRecursive1 at stack-trace.js:53
-    18   selfRecursive1 at stack-trace.js:53
-    19   selfRecursive1 at stack-trace.js:53
-    20   selfRecursive1 at stack-trace.js:53
-    21   selfRecursive1 at stack-trace.js:53
-    22   selfRecursive1 at stack-trace.js:53
-    23   selfRecursive1 at stack-trace.js:53
-    24   selfRecursive1 at stack-trace.js:53
-    25   selfRecursive1 at stack-trace.js:53
-    26   selfRecursive1 at stack-trace.js:53
-    27   selfRecursive1 at stack-trace.js:53
-    28   selfRecursive1 at stack-trace.js:53
-    29   selfRecursive1 at stack-trace.js:53
-    30   selfRecursive1 at stack-trace.js:53
-    31   selfRecursive1 at stack-trace.js:53
-    32   selfRecursive1 at stack-trace.js:53
-    33   selfRecursive1 at stack-trace.js:53
-    34   selfRecursive1 at stack-trace.js:53
-    35   selfRecursive1 at stack-trace.js:53
-    36   selfRecursive1 at stack-trace.js:53
-    37   selfRecursive1 at stack-trace.js:53
-    38   selfRecursive1 at stack-trace.js:53
-    39   selfRecursive1 at stack-trace.js:53
-    40   selfRecursive1 at stack-trace.js:53
-    41   selfRecursive1 at stack-trace.js:53
-    42   selfRecursive1 at stack-trace.js:53
-    43   selfRecursive1 at stack-trace.js:53
-    44   selfRecursive1 at stack-trace.js:53
-    45   selfRecursive1 at stack-trace.js:53
-    46   selfRecursive1 at stack-trace.js:53
-    47   selfRecursive1 at stack-trace.js:53
-    48   selfRecursive1 at stack-trace.js:53
-    49   selfRecursive1 at stack-trace.js:53
-    50   selfRecursive1 at stack-trace.js:53
-    51   selfRecursive1 at stack-trace.js:53
-    52   selfRecursive1 at stack-trace.js:53
-    53   selfRecursive1 at stack-trace.js:53
-    54   selfRecursive1 at stack-trace.js:53
-    55   selfRecursive1 at stack-trace.js:53
-    56   selfRecursive1 at stack-trace.js:53
-    57   selfRecursive1 at stack-trace.js:53
-    58   selfRecursive1 at stack-trace.js:53
-    59   selfRecursive1 at stack-trace.js:53
-    60   selfRecursive1 at stack-trace.js:53
-    61   selfRecursive1 at stack-trace.js:53
-    62   selfRecursive1 at stack-trace.js:53
-    63   selfRecursive1 at stack-trace.js:53
-    64   selfRecursive1 at stack-trace.js:53
-    65   selfRecursive1 at stack-trace.js:53
-    66   selfRecursive1 at stack-trace.js:53
-    67   selfRecursive1 at stack-trace.js:53
-    68   selfRecursive1 at stack-trace.js:53
-    69   selfRecursive1 at stack-trace.js:53
-    70   selfRecursive1 at stack-trace.js:53
-    71   selfRecursive1 at stack-trace.js:53
-    72   selfRecursive1 at stack-trace.js:53
-    73   selfRecursive1 at stack-trace.js:53
-    74   selfRecursive1 at stack-trace.js:53
-    75   selfRecursive1 at stack-trace.js:53
-    76   selfRecursive1 at stack-trace.js:53
-    77   selfRecursive1 at stack-trace.js:53
-    78   selfRecursive1 at stack-trace.js:53
-    79   selfRecursive1 at stack-trace.js:53
-    80   selfRecursive1 at stack-trace.js:53
-    81   selfRecursive1 at stack-trace.js:53
-    82   selfRecursive1 at stack-trace.js:53
-    83   selfRecursive1 at stack-trace.js:53
-    84   selfRecursive1 at stack-trace.js:53
-    85   selfRecursive1 at stack-trace.js:53
-    86   selfRecursive1 at stack-trace.js:53
-    87   selfRecursive1 at stack-trace.js:53
-    88   selfRecursive1 at stack-trace.js:53
-    89   selfRecursive1 at stack-trace.js:53
-    90   selfRecursive1 at stack-trace.js:53
-    91   selfRecursive1 at stack-trace.js:53
-    92   selfRecursive1 at stack-trace.js:53
-    93   selfRecursive1 at stack-trace.js:53
-    94   selfRecursive1 at stack-trace.js:53
-    95   selfRecursive1 at stack-trace.js:53
-    96   selfRecursive1 at stack-trace.js:53
-    97   selfRecursive1 at stack-trace.js:53
-    98   selfRecursive1 at stack-trace.js:53
-    99   selfRecursive1 at stack-trace.js:53
+    0   selfRecursive1 at stack-trace.js:52
+    1   selfRecursive1 at stack-trace.js:52
+    2   selfRecursive1 at stack-trace.js:52
+    3   selfRecursive1 at stack-trace.js:52
+    4   selfRecursive1 at stack-trace.js:52
+    5   selfRecursive1 at stack-trace.js:52
+    6   selfRecursive1 at stack-trace.js:52
+    7   selfRecursive1 at stack-trace.js:52
+    8   selfRecursive1 at stack-trace.js:52
+    9   selfRecursive1 at stack-trace.js:52
+    10   selfRecursive1 at stack-trace.js:52
+    11   selfRecursive1 at stack-trace.js:52
+    12   selfRecursive1 at stack-trace.js:52
+    13   selfRecursive1 at stack-trace.js:52
+    14   selfRecursive1 at stack-trace.js:52
+    15   selfRecursive1 at stack-trace.js:52
+    16   selfRecursive1 at stack-trace.js:52
+    17   selfRecursive1 at stack-trace.js:52
+    18   selfRecursive1 at stack-trace.js:52
+    19   selfRecursive1 at stack-trace.js:52
+    20   selfRecursive1 at stack-trace.js:52
+    21   selfRecursive1 at stack-trace.js:52
+    22   selfRecursive1 at stack-trace.js:52
+    23   selfRecursive1 at stack-trace.js:52
+    24   selfRecursive1 at stack-trace.js:52
+    25   selfRecursive1 at stack-trace.js:52
+    26   selfRecursive1 at stack-trace.js:52
+    27   selfRecursive1 at stack-trace.js:52
+    28   selfRecursive1 at stack-trace.js:52
+    29   selfRecursive1 at stack-trace.js:52
+    30   selfRecursive1 at stack-trace.js:52
+    31   selfRecursive1 at stack-trace.js:52
+    32   selfRecursive1 at stack-trace.js:52
+    33   selfRecursive1 at stack-trace.js:52
+    34   selfRecursive1 at stack-trace.js:52
+    35   selfRecursive1 at stack-trace.js:52
+    36   selfRecursive1 at stack-trace.js:52
+    37   selfRecursive1 at stack-trace.js:52
+    38   selfRecursive1 at stack-trace.js:52
+    39   selfRecursive1 at stack-trace.js:52
+    40   selfRecursive1 at stack-trace.js:52
+    41   selfRecursive1 at stack-trace.js:52
+    42   selfRecursive1 at stack-trace.js:52
+    43   selfRecursive1 at stack-trace.js:52
+    44   selfRecursive1 at stack-trace.js:52
+    45   selfRecursive1 at stack-trace.js:52
+    46   selfRecursive1 at stack-trace.js:52
+    47   selfRecursive1 at stack-trace.js:52
+    48   selfRecursive1 at stack-trace.js:52
+    49   selfRecursive1 at stack-trace.js:52
+    50   selfRecursive1 at stack-trace.js:52
+    51   selfRecursive1 at stack-trace.js:52
+    52   selfRecursive1 at stack-trace.js:52
+    53   selfRecursive1 at stack-trace.js:52
+    54   selfRecursive1 at stack-trace.js:52
+    55   selfRecursive1 at stack-trace.js:52
+    56   selfRecursive1 at stack-trace.js:52
+    57   selfRecursive1 at stack-trace.js:52
+    58   selfRecursive1 at stack-trace.js:52
+    59   selfRecursive1 at stack-trace.js:52
+    60   selfRecursive1 at stack-trace.js:52
+    61   selfRecursive1 at stack-trace.js:52
+    62   selfRecursive1 at stack-trace.js:52
+    63   selfRecursive1 at stack-trace.js:52
+    64   selfRecursive1 at stack-trace.js:52
+    65   selfRecursive1 at stack-trace.js:52
+    66   selfRecursive1 at stack-trace.js:52
+    67   selfRecursive1 at stack-trace.js:52
+    68   selfRecursive1 at stack-trace.js:52
+    69   selfRecursive1 at stack-trace.js:52
+    70   selfRecursive1 at stack-trace.js:52
+    71   selfRecursive1 at stack-trace.js:52
+    72   selfRecursive1 at stack-trace.js:52
+    73   selfRecursive1 at stack-trace.js:52
+    74   selfRecursive1 at stack-trace.js:52
+    75   selfRecursive1 at stack-trace.js:52
+    76   selfRecursive1 at stack-trace.js:52
+    77   selfRecursive1 at stack-trace.js:52
+    78   selfRecursive1 at stack-trace.js:52
+    79   selfRecursive1 at stack-trace.js:52
+    80   selfRecursive1 at stack-trace.js:52
+    81   selfRecursive1 at stack-trace.js:52
+    82   selfRecursive1 at stack-trace.js:52
+    83   selfRecursive1 at stack-trace.js:52
+    84   selfRecursive1 at stack-trace.js:52
+    85   selfRecursive1 at stack-trace.js:52
+    86   selfRecursive1 at stack-trace.js:52
+    87   selfRecursive1 at stack-trace.js:52
+    88   selfRecursive1 at stack-trace.js:52
+    89   selfRecursive1 at stack-trace.js:52
+    90   selfRecursive1 at stack-trace.js:52
+    91   selfRecursive1 at stack-trace.js:52
+    92   selfRecursive1 at stack-trace.js:52
+    93   selfRecursive1 at stack-trace.js:52
+    94   selfRecursive1 at stack-trace.js:52
+    95   selfRecursive1 at stack-trace.js:52
+    96   selfRecursive1 at stack-trace.js:52
+    97   selfRecursive1 at stack-trace.js:52
+    98   selfRecursive1 at stack-trace.js:52
+    99   selfRecursive1 at stack-trace.js:52
 
 --> Stack Trace:
-    0   selfRecursive2 at stack-trace.js:62
+    0   selfRecursive2 at stack-trace.js:58
     1   selfRecursive2 at stack-trace.js:62
     2   selfRecursive2 at stack-trace.js:62
     3   selfRecursive2 at stack-trace.js:62
@@ -252,106 +253,106 @@
     99   selfRecursive2 at stack-trace.js:62
 
 --> Stack Trace:
-    0   selfRecursive3 at stack-trace.js:69
-    1    at eval code
-    2   eval at [native code]
-    3   selfRecursive3 at stack-trace.js:69
-    4    at eval code
-    5   eval at [native code]
-    6   selfRecursive3 at stack-trace.js:69
-    7    at eval code
-    8   eval at [native code]
-    9   selfRecursive3 at stack-trace.js:69
-    10    at eval code
-    11   eval at [native code]
-    12   selfRecursive3 at stack-trace.js:69
-    13    at eval code
-    14   eval at [native code]
-    15   selfRecursive3 at stack-trace.js:69
-    16    at eval code
-    17   eval at [native code]
-    18   selfRecursive3 at stack-trace.js:69
-    19    at eval code
-    20   eval at [native code]
-    21   selfRecursive3 at stack-trace.js:69
-    22    at eval code
-    23   eval at [native code]
-    24   selfRecursive3 at stack-trace.js:69
-    25    at eval code
-    26   eval at [native code]
-    27   selfRecursive3 at stack-trace.js:69
-    28    at eval code
-    29   eval at [native code]
-    30   selfRecursive3 at stack-trace.js:69
-    31    at eval code
-    32   eval at [native code]
-    33   selfRecursive3 at stack-trace.js:69
-    34    at eval code
-    35   eval at [native code]
-    36   selfRecursive3 at stack-trace.js:69
-    37    at eval code
-    38   eval at [native code]
-    39   selfRecursive3 at stack-trace.js:69
-    40    at eval code
-    41   eval at [native code]
-    42   selfRecursive3 at stack-trace.js:69
-    43    at eval code
-    44   eval at [native code]
-    45   selfRecursive3 at stack-trace.js:69
-    46    at eval code
-    47   eval at [native code]
-    48   selfRecursive3 at stack-trace.js:69
-    49    at eval code
-    50   eval at [native code]
-    51   selfRecursive3 at stack-trace.js:69
-    52    at eval code
-    53   eval at [native code]
-    54   selfRecursive3 at stack-trace.js:69
-    55    at eval code
-    56   eval at [native code]
-    57   selfRecursive3 at stack-trace.js:69
-    58    at eval code
-    59   eval at [native code]
-    60   selfRecursive3 at stack-trace.js:69
-    61    at eval code
-    62   eval at [native code]
-    63   selfRecursive3 at stack-trace.js:69
-    64    at eval code
-    65   eval at [native code]
-    66   selfRecursive3 at stack-trace.js:69
-    67    at eval code
-    68   eval at [native code]
-    69   selfRecursive3 at stack-trace.js:69
-    70    at eval code
-    71   eval at [native code]
-    72   selfRecursive3 at stack-trace.js:69
-    73    at eval code
-    74   eval at [native code]
-    75   selfRecursive3 at stack-trace.js:69
-    76    at eval code
-    77   eval at [native code]
-    78   selfRecursive3 at stack-trace.js:69
-    79    at eval code
-    80   eval at [native code]
-    81   selfRecursive3 at stack-trace.js:69
-    82    at eval code
-    83   eval at [native code]
-    84   selfRecursive3 at stack-trace.js:69
-    85    at eval code
-    86   eval at [native code]
-    87   selfRecursive3 at stack-trace.js:69
-    88    at eval code
-    89   eval at [native code]
-    90   selfRecursive3 at stack-trace.js:69
-    91    at eval code
-    92   eval at [native code]
-    93   selfRecursive3 at stack-trace.js:69
-    94    at eval code
-    95   eval at [native code]
-    96   selfRecursive3 at stack-trace.js:69
-    97    at eval code
-    98   eval at [native code]
-    99   selfRecursive3 at stack-trace.js:69
+    0   eval at [native code]
+    1   selfRecursive3 at stack-trace.js:69
+    2    at eval code
+    3   eval at [native code]
+    4   selfRecursive3 at stack-trace.js:69
+    5    at eval code
+    6   eval at [native code]
+    7   selfRecursive3 at stack-trace.js:69
+    8    at eval code
+    9   eval at [native code]
+    10   selfRecursive3 at stack-trace.js:69
+    11    at eval code
+    12   eval at [native code]
+    13   selfRecursive3 at stack-trace.js:69
+    14    at eval code
+    15   eval at [native code]
+    16   selfRecursive3 at stack-trace.js:69
+    17    at eval code
+    18   eval at [native code]
+    19   selfRecursive3 at stack-trace.js:69
+    20    at eval code
+    21   eval at [native code]
+    22   selfRecursive3 at stack-trace.js:69
+    23    at eval code
+    24   eval at [native code]
+    25   selfRecursive3 at stack-trace.js:69
+    26    at eval code
+    27   eval at [native code]
+    28   selfRecursive3 at stack-trace.js:69
+    29    at eval code
+    30   eval at [native code]
+    31   selfRecursive3 at stack-trace.js:69
+    32    at eval code
+    33   eval at [native code]
+    34   selfRecursive3 at stack-trace.js:69
+    35    at eval code
+    36   eval at [native code]
+    37   selfRecursive3 at stack-trace.js:69
+    38    at eval code
+    39   eval at [native code]
+    40   selfRecursive3 at stack-trace.js:69
+    41    at eval code
+    42   eval at [native code]
+    43   selfRecursive3 at stack-trace.js:69
+    44    at eval code
+    45   eval at [native code]
+    46   selfRecursive3 at stack-trace.js:69
+    47    at eval code
+    48   eval at [native code]
+    49   selfRecursive3 at stack-trace.js:69
+    50    at eval code
+    51   eval at [native code]
+    52   selfRecursive3 at stack-trace.js:69
+    53    at eval code
+    54   eval at [native code]
+    55   selfRecursive3 at stack-trace.js:69
+    56    at eval code
+    57   eval at [native code]
+    58   selfRecursive3 at stack-trace.js:69
+    59    at eval code
+    60   eval at [native code]
+    61   selfRecursive3 at stack-trace.js:69
+    62    at eval code
+    63   eval at [native code]
+    64   selfRecursive3 at stack-trace.js:69
+    65    at eval code
+    66   eval at [native code]
+    67   selfRecursive3 at stack-trace.js:69
+    68    at eval code
+    69   eval at [native code]
+    70   selfRecursive3 at stack-trace.js:69
+    71    at eval code
+    72   eval at [native code]
+    73   selfRecursive3 at stack-trace.js:69
+    74    at eval code
+    75   eval at [native code]
+    76   selfRecursive3 at stack-trace.js:69
+    77    at eval code
+    78   eval at [native code]
+    79   selfRecursive3 at stack-trace.js:69
+    80    at eval code
+    81   eval at [native code]
+    82   selfRecursive3 at stack-trace.js:69
+    83    at eval code
+    84   eval at [native code]
+    85   selfRecursive3 at stack-trace.js:69
+    86    at eval code
+    87   eval at [native code]
+    88   selfRecursive3 at stack-trace.js:69
+    89    at eval code
+    90   eval at [native code]
+    91   selfRecursive3 at stack-trace.js:69
+    92    at eval code
+    93   eval at [native code]
+    94   selfRecursive3 at stack-trace.js:69
+    95    at eval code
+    96   eval at [native code]
+    97   selfRecursive3 at stack-trace.js:69
+    98    at eval code
+    99   eval at [native code]
 
 --> Stack Trace:
     0   throwError at stack-trace.js:77
@@ -407,11 +408,12 @@
     4   global code at stack-trace.js:169
 
 --> Stack Trace:
-    0   h at stack-trace.js:153
-    1   map at [native code]
-    2   mapTest at stack-trace.js:158
-    3   mapTestDriver at stack-trace.js:164
-    4   global code at stack-trace.js:175
+    0   map at [native code]
+    1   h at stack-trace.js:153
+    2   map at [native code]
+    3   mapTest at stack-trace.js:158
+    4   mapTestDriver at stack-trace.js:164
+    5   global code at stack-trace.js:175
 
 --> Stack Trace:
     0   throwError at stack-trace.js:77

Modified: trunk/Source/_javascript_Core/ChangeLog (114308 => 114309)


--- trunk/Source/_javascript_Core/ChangeLog	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/ChangeLog	2012-04-16 22:26:36 UTC (rev 114309)
@@ -1,5 +1,42 @@
 2012-04-16  Oliver Hunt  <oli...@apple.com>
 
+        Exception stack traces aren't complete when the exception starts in native code
+        https://bugs.webkit.org/show_bug.cgi?id=84073
+
+        Reviewed by Gavin Barraclough.
+
+        Refactored building the stack trace to so that we can construct
+        it earlier, and don't rely on any prior work performed in the
+        exception handling machinery. Also updated LLInt and the DFG to
+        completely initialise the callframes of host function calls.
+
+        * bytecode/CodeBlock.h:
+        (JSC::CodeBlock::codeOriginIndexForReturn):
+        (CodeBlock):
+        * dfg/DFGOperations.cpp:
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::getStackTrace):
+        (JSC::Interpreter::addStackTraceIfNecessary):
+        (JSC):
+        (JSC::Interpreter::throwException):
+        * interpreter/Interpreter.h:
+        (Interpreter):
+        * jit/JITStubs.cpp:
+        (JSC::DEFINE_STUB_FUNCTION):
+        * jsc.cpp:
+        (functionJSCStack):
+        * llint/LLIntSlowPaths.cpp:
+        (JSC::LLInt::handleHostCall):
+        * parser/Parser.h:
+        (JSC::::parse):
+        * runtime/Error.cpp:
+        (JSC::addErrorInfo):
+        (JSC::throwError):
+        * runtime/Error.h:
+        (JSC):
+
+2012-04-16  Oliver Hunt  <oli...@apple.com>
+
         Fix COMMANDLINE_TYPEDARRAYS build
         https://bugs.webkit.org/show_bug.cgi?id=84051
 

Modified: trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def (114308 => 114309)


--- trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2012-04-16 22:26:36 UTC (rev 114309)
@@ -212,7 +212,7 @@
     ?getPropertyDescriptor@JSObject@JSC@@QAE_NPAVExecState@2@ABVIdentifier@2@AAVPropertyDescriptor@2@@Z
     ?getPropertyNames@JSObject@JSC@@SAXPAV12@PAVExecState@2@AAVPropertyNameArray@2@W4EnumerationMode@2@@Z
     ?getSlice@ArgList@JSC@@QBEXHAAV12@@Z
-    ?getStackTrace@Interpreter@JSC@@SAXPAVJSGlobalData@2@HAAV?$Vector@UStackFrame@JSC@@$0A@@WTF@@@Z
+    ?getStackTrace@Interpreter@JSC@@SAXPAVJSGlobalData@2@AAV?$Vector@UStackFrame@JSC@@$0A@@WTF@@@Z
     ?getString@JSCell@JSC@@QBE?AVUString@2@PAVExecState@2@@Z
     ?getString@JSCell@JSC@@QBE_NPAVExecState@2@AAVUString@2@@Z
     ?getter@PropertyDescriptor@JSC@@QBE?AVJSValue@2@XZ

Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.h (114308 => 114309)


--- trunk/Source/_javascript_Core/bytecode/CodeBlock.h	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.h	2012-04-16 22:26:36 UTC (rev 114309)
@@ -710,6 +710,14 @@
             return true;
         }
         
+        int codeOriginIndexForReturn(ReturnAddressPtr returnAddress)
+        {
+            ASSERT(hasCodeOrigins());
+            unsigned offset = getJITCode().offsetOf(returnAddress.value());
+            CodeOriginAtCallReturnOffset* entry = binarySearch<CodeOriginAtCallReturnOffset, unsigned, getCallReturnOffsetForCodeOrigin>(codeOrigins().begin(), codeOrigins().size(), offset, WTF::KeyMustNotBePresentInArray);
+            return entry - codeOrigins().begin();
+        }
+        
         CodeOrigin codeOrigin(unsigned index)
         {
             ASSERT(m_rareData);

Modified: trunk/Source/_javascript_Core/dfg/DFGOperations.cpp (114308 => 114309)


--- trunk/Source/_javascript_Core/dfg/DFGOperations.cpp	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/dfg/DFGOperations.cpp	2012-04-16 22:26:36 UTC (rev 114309)
@@ -792,6 +792,7 @@
         ASSERT(callType != CallTypeJS);
     
         if (callType == CallTypeHost) {
+            execCallee->setCallee(asObject(callee));
             globalData->hostCallReturnValue = JSValue::decode(callData.native.function(execCallee));
             if (globalData->exception)
                 return 0;
@@ -812,6 +813,7 @@
     ASSERT(constructType != ConstructTypeJS);
     
     if (constructType == ConstructTypeHost) {
+        execCallee->setCallee(asObject(callee));
         globalData->hostCallReturnValue = JSValue::decode(constructData.native.function(execCallee));
         if (globalData->exception)
             return 0;

Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.cpp (114308 => 114309)


--- trunk/Source/_javascript_Core/interpreter/Interpreter.cpp	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.cpp	2012-04-16 22:26:36 UTC (rev 114309)
@@ -65,6 +65,7 @@
 #include <limits.h>
 #include <stdio.h>
 #include <wtf/Threading.h>
+#include <wtf/text/StringBuilder.h>
 
 #if ENABLE(JIT)
 #include "JIT.h"
@@ -952,14 +953,14 @@
     return StackFrameGlobalCode;
 }
 
-void Interpreter::getStackTrace(JSGlobalData* globalData, int line, Vector<StackFrame>& results)
+void Interpreter::getStackTrace(JSGlobalData* globalData, Vector<StackFrame>& results)
 {
-    CallFrame* callFrame = globalData->topCallFrame->removeHostCallFrameFlag()->trueCallFrameFromVMCode();
+    CallFrame* callFrame = globalData->topCallFrame->removeHostCallFrameFlag();
     if (!callFrame || callFrame == CallFrame::noCaller()) 
         return;
+    int line = getLineNumberForCallFrame(globalData, callFrame);
 
-    if (line == -1)
-        line = getLineNumberForCallFrame(globalData, callFrame);
+    callFrame = callFrame->trueCallFrameFromVMCode();
 
     while (callFrame && callFrame != CallFrame::noCaller()) {
         UString sourceURL;
@@ -975,6 +976,33 @@
     }
 }
 
+void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSObject* error)
+{
+    JSGlobalData* globalData = &callFrame->globalData();
+    if (error->hasProperty(callFrame, globalData->propertyNames->stack))
+        return;
+
+    Vector<StackFrame> stackTrace;
+    getStackTrace(&callFrame->globalData(), stackTrace);
+    
+    if (stackTrace.isEmpty())
+        return;
+    
+    JSGlobalObject* globalObject = 0;
+    if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error))
+        globalObject = globalData->dynamicGlobalObject;
+    else
+        globalObject = error->globalObject();
+    StringBuilder builder;
+    for (unsigned i = 0; i < stackTrace.size(); i++) {
+        builder.append(String(stackTrace[i].toString(globalObject->globalExec()).impl()));
+        if (i != stackTrace.size() - 1)
+            builder.append('\n');
+    }
+    
+    error->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, UString(builder.toString().impl())), ReadOnly | DontDelete);
+}
+
 NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValue& exceptionValue, unsigned bytecodeOffset)
 {
     CodeBlock* codeBlock = callFrame->codeBlock();
@@ -990,12 +1018,9 @@
         // Using hasExpressionInfo to imply we are interested in rich exception info.
         if (codeBlock->hasExpressionInfo() && !hasErrorInfo(callFrame, exception)) {
             ASSERT(codeBlock->hasLineInfo());
-
             // FIXME: should only really be adding these properties to VM generated exceptions,
             // but the inspector currently requires these for all thrown objects.
-            Vector<StackFrame> stackTrace;
-            getStackTrace(&callFrame->globalData(), codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), stackTrace);
-            addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source(), stackTrace);
+            addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source());
         }
 
         isInterrupt = isInterruptedExecutionException(exception) || isTerminatedExecutionException(exception);

Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.h (114308 => 114309)


--- trunk/Source/_javascript_Core/interpreter/Interpreter.h	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.h	2012-04-16 22:26:36 UTC (rev 114309)
@@ -222,7 +222,8 @@
         NEVER_INLINE HandlerInfo* throwException(CallFrame*&, JSValue&, unsigned bytecodeOffset);
         NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine);
         static const UString getTraceLine(CallFrame*, StackFrameCodeType, const UString&, int);
-        JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, int line, Vector<StackFrame>& results);
+        JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results);
+        static void addStackTraceIfNecessary(CallFrame*, JSObject* error);
 
         void dumpSampleData(ExecState* exec);
         void startSampling();

Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (114308 => 114309)


--- trunk/Source/_javascript_Core/jit/JITStubs.cpp	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp	2012-04-16 22:26:36 UTC (rev 114309)
@@ -3518,6 +3518,19 @@
 {
     STUB_INIT_STACK_FRAME(stackFrame);
     JSGlobalData* globalData = stackFrame.globalData;
+    // It's possible for us to reach this point with incorrect origin metadata
+    // if a native function throws an exception after being planted in certain
+    // code paths as the native thunk doesn't can't unwind itself as if it were
+    // a JS function. So we redetermine the correct data here just to be safe.
+    if (CodeBlock* codeBlock = stackFrame.callFrame->codeBlock()) {
+#if ENABLE(DFG_JIT)
+        if (codeBlock->hasCodeOrigins())
+            stackFrame.callFrame->setBytecodeOffsetForNonDFGCode(codeBlock->codeOriginIndexForReturn(globalData->exceptionLocation));
+        else
+#endif
+            if (codeBlock->getJITType() == JITCode::BaselineJIT)
+            stackFrame.callFrame->setBytecodeOffsetForNonDFGCode(codeBlock->bytecodeOffset(stackFrame.callFrame, globalData->exceptionLocation));
+    }
     ExceptionHandler handler = jitThrow(globalData, stackFrame.callFrame, globalData->exception, globalData->exceptionLocation);
     STUB_SET_RETURN_ADDRESS(handler.catchRoutine);
     return handler.callFrame;

Modified: trunk/Source/_javascript_Core/jsc.cpp (114308 => 114309)


--- trunk/Source/_javascript_Core/jsc.cpp	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/jsc.cpp	2012-04-16 22:26:36 UTC (rev 114309)
@@ -277,7 +277,7 @@
 {
     String trace = "--> Stack trace:\n";
     Vector<StackFrame> stackTrace;
-    Interpreter::getStackTrace(&exec->globalData(), -1, stackTrace);
+    Interpreter::getStackTrace(&exec->globalData(), stackTrace);
     int i = 0;
 
     for (Vector<StackFrame>::iterator iter = stackTrace.begin(); iter < stackTrace.end(); iter++) {

Modified: trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp (114308 => 114309)


--- trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp	2012-04-16 22:26:36 UTC (rev 114309)
@@ -1241,6 +1241,7 @@
         ASSERT(callType != CallTypeJS);
     
         if (callType == CallTypeHost) {
+            execCallee->setCallee(asObject(callee));
             globalData.hostCallReturnValue = JSValue::decode(callData.native.function(execCallee));
             
             LLINT_CALL_RETURN(execCallee, pc, reinterpret_cast<void*>(getHostCallReturnValue));
@@ -1262,6 +1263,7 @@
     ASSERT(constructType != ConstructTypeJS);
     
     if (constructType == ConstructTypeHost) {
+        execCallee->setCallee(asObject(callee));
         globalData.hostCallReturnValue = JSValue::decode(constructData.native.function(execCallee));
 
         LLINT_CALL_RETURN(execCallee, pc, reinterpret_cast<void*>(getHostCallReturnValue));

Modified: trunk/Source/_javascript_Core/parser/Parser.h (114308 => 114309)


--- trunk/Source/_javascript_Core/parser/Parser.h	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/parser/Parser.h	2012-04-16 22:26:36 UTC (rev 114309)
@@ -993,7 +993,7 @@
         else if (isEvalNode<ParsedNode>())
             *exception = createSyntaxError(lexicalGlobalObject, errMsg);
         else
-            *exception = addErrorInfo(&lexicalGlobalObject->globalData(), createSyntaxError(lexicalGlobalObject, errMsg), errLine, *m_source, Vector<StackFrame>());
+            *exception = addErrorInfo(lexicalGlobalObject->globalExec(), createSyntaxError(lexicalGlobalObject, errMsg), errLine, *m_source);
     }
 
     if (debugger && !ParsedNode::scopeIsFunction)

Modified: trunk/Source/_javascript_Core/runtime/Error.cpp (114308 => 114309)


--- trunk/Source/_javascript_Core/runtime/Error.cpp	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/runtime/Error.cpp	2012-04-16 22:26:36 UTC (rev 114309)
@@ -120,37 +120,21 @@
     return createURIError(exec->lexicalGlobalObject(), message);
 }
 
-JSObject* addErrorInfo(JSGlobalData* globalData, JSObject* error, int line, const SourceCode& source, const Vector<StackFrame>& stackTrace)
+JSObject* addErrorInfo(CallFrame* callFrame, JSObject* error, int line, const SourceCode& source)
 {
+    JSGlobalData* globalData = &callFrame->globalData();
     const UString& sourceURL = source.provider()->url();
 
     if (line != -1)
         error->putDirect(*globalData, Identifier(globalData, linePropertyName), jsNumber(line), ReadOnly | DontDelete);
     if (!sourceURL.isNull())
         error->putDirect(*globalData, Identifier(globalData, sourceURLPropertyName), jsString(globalData, sourceURL), ReadOnly | DontDelete);
-    if (!stackTrace.isEmpty()) {
-        JSGlobalObject* globalObject = 0;
-        if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error))
-            globalObject = globalData->dynamicGlobalObject;
-        else
-            globalObject = error->globalObject();
-        StringBuilder builder;
-        for (unsigned i = 0; i < stackTrace.size(); i++) {
-            builder.append(String(stackTrace[i].toString(globalObject->globalExec()).impl()));
-            if (i != stackTrace.size() - 1)
-                builder.append('\n');
-        }
 
-        error->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, UString(builder.toString().impl())), ReadOnly | DontDelete);
-    }
+    globalData->interpreter->addStackTraceIfNecessary(callFrame, error);
 
     return error;
 }
 
-JSObject* addErrorInfo(ExecState* exec, JSObject* error, int line, const SourceCode& source, const Vector<StackFrame>& stackTrace)
-{
-    return addErrorInfo(&exec->globalData(), error, line, source, stackTrace);
-}
 
 bool hasErrorInfo(ExecState* exec, JSObject* error)
 {
@@ -160,12 +144,15 @@
 
 JSValue throwError(ExecState* exec, JSValue error)
 {
+    if (error.isObject())
+        return throwError(exec, asObject(error));
     exec->globalData().exception = error;
     return error;
 }
 
 JSObject* throwError(ExecState* exec, JSObject* error)
 {
+    Interpreter::addStackTraceIfNecessary(exec, error);
     exec->globalData().exception = error;
     return error;
 }

Modified: trunk/Source/_javascript_Core/runtime/Error.h (114308 => 114309)


--- trunk/Source/_javascript_Core/runtime/Error.h	2012-04-16 22:25:52 UTC (rev 114308)
+++ trunk/Source/_javascript_Core/runtime/Error.h	2012-04-16 22:26:36 UTC (rev 114309)
@@ -57,9 +57,8 @@
 
     // Methods to add 
     bool hasErrorInfo(ExecState*, JSObject* error);
-    JSObject* addErrorInfo(JSGlobalData*, JSObject* error, int line, const SourceCode&, const Vector<StackFrame>&);
     // ExecState wrappers.
-    JSObject* addErrorInfo(ExecState*, JSObject* error, int line, const SourceCode&, const Vector<StackFrame>&);
+    JSObject* addErrorInfo(ExecState*, JSObject* error, int line, const SourceCode&);
 
     // Methods to throw Errors.
     JS_EXPORT_PRIVATE JSValue throwError(ExecState*, JSValue);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to