Changeset 114309 in webkit


Ignore:
Timestamp:
Apr 16, 2012, 3:26:36 PM (13 years ago)
Author:
[email protected]
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/JavaScriptCore:

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:
Location:
trunk
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r114306 r114309  
     12012-04-16  Oliver Hunt  <[email protected]>
     2
     3        Exception stack traces aren't complete when the exception starts in native code
     4        https://bugs.webkit.org/show_bug.cgi?id=84073
     5
     6        Reviewed by Gavin Barraclough.
     7
     8        Update tests to include new exception property ordering, and new functions
     9
     10        * fast/js/exception-properties-expected.txt:
     11        * fast/js/script-tests/exception-properties.js:
     12        * fast/js/script-tests/stack-trace.js:
     13        (selfRecursive1): Modified slightly so that we produce consistent traces
     14        * fast/js/stack-trace-expected.txt:
     15
    1162012-04-16  David Alcala  <[email protected]>
    217
  • trunk/LayoutTests/fast/js/exception-properties-expected.txt

    r108112 r114309  
    55
    66PASS enumerableProperties(error) is []
    7 PASS enumerableProperties(nativeError) is ["line", "sourceURL", "stack"]
     7PASS enumerableProperties(nativeError) is ["stack", "line", "sourceURL"]
    88PASS Object.getPrototypeOf(nativeError).name is "RangeError"
    99PASS Object.getPrototypeOf(nativeError).message is ""
  • trunk/LayoutTests/fast/js/script-tests/exception-properties.js

    r108112 r114309  
    1717
    1818    shouldBe('enumerableProperties(error)', '[]');
    19     shouldBe('enumerableProperties(nativeError)', '["line", "sourceURL", "stack"]');
     19    shouldBe('enumerableProperties(nativeError)', '["stack", "line", "sourceURL"]');
    2020
    2121    shouldBe('Object.getPrototypeOf(nativeError).name', '"RangeError"');
  • trunk/LayoutTests/fast/js/script-tests/stack-trace.js

    r109021 r114309  
    5050try { scripterOuter(); } catch (e) { printStack(e.stack) }                   // program -> scripter -> outer -> inner
    5151
    52 function selfRecursive1() {
    53     selfRecursive1();
    54 }
     52function selfRecursive1() { selfRecursive1();
     53}
     54
    5555
    5656try { selfRecursive1(); } catch (e) { printStack(e.stack) }                   // selfRecursive1 -> selfRecursive1 -> selfRecursive1 -> selfRecursive1 ...
  • trunk/LayoutTests/fast/js/stack-trace-expected.txt

    r109461 r114309  
    3434
    3535--> Stack Trace:
    36     0   hostThrower at stack-trace.js:25
    37     1   global code at stack-trace.js:47
     36    0   appendChild at [native code]
     37    1   hostThrower at stack-trace.js:25
     38    2   global code at stack-trace.js:47
    3839
    3940--> Stack Trace:
     
    4950
    5051--> Stack Trace:
    51     0   selfRecursive1 at stack-trace.js:53
    52     1   selfRecursive1 at stack-trace.js:53
    53     2   selfRecursive1 at stack-trace.js:53
    54     3   selfRecursive1 at stack-trace.js:53
    55     4   selfRecursive1 at stack-trace.js:53
    56     5   selfRecursive1 at stack-trace.js:53
    57     6   selfRecursive1 at stack-trace.js:53
    58     7   selfRecursive1 at stack-trace.js:53
    59     8   selfRecursive1 at stack-trace.js:53
    60     9   selfRecursive1 at stack-trace.js:53
    61     10   selfRecursive1 at stack-trace.js:53
    62     11   selfRecursive1 at stack-trace.js:53
    63     12   selfRecursive1 at stack-trace.js:53
    64     13   selfRecursive1 at stack-trace.js:53
    65     14   selfRecursive1 at stack-trace.js:53
    66     15   selfRecursive1 at stack-trace.js:53
    67     16   selfRecursive1 at stack-trace.js:53
    68     17   selfRecursive1 at stack-trace.js:53
    69     18   selfRecursive1 at stack-trace.js:53
    70     19   selfRecursive1 at stack-trace.js:53
    71     20   selfRecursive1 at stack-trace.js:53
    72     21   selfRecursive1 at stack-trace.js:53
    73     22   selfRecursive1 at stack-trace.js:53
    74     23   selfRecursive1 at stack-trace.js:53
    75     24   selfRecursive1 at stack-trace.js:53
    76     25   selfRecursive1 at stack-trace.js:53
    77     26   selfRecursive1 at stack-trace.js:53
    78     27   selfRecursive1 at stack-trace.js:53
    79     28   selfRecursive1 at stack-trace.js:53
    80     29   selfRecursive1 at stack-trace.js:53
    81     30   selfRecursive1 at stack-trace.js:53
    82     31   selfRecursive1 at stack-trace.js:53
    83     32   selfRecursive1 at stack-trace.js:53
    84     33   selfRecursive1 at stack-trace.js:53
    85     34   selfRecursive1 at stack-trace.js:53
    86     35   selfRecursive1 at stack-trace.js:53
    87     36   selfRecursive1 at stack-trace.js:53
    88     37   selfRecursive1 at stack-trace.js:53
    89     38   selfRecursive1 at stack-trace.js:53
    90     39   selfRecursive1 at stack-trace.js:53
    91     40   selfRecursive1 at stack-trace.js:53
    92     41   selfRecursive1 at stack-trace.js:53
    93     42   selfRecursive1 at stack-trace.js:53
    94     43   selfRecursive1 at stack-trace.js:53
    95     44   selfRecursive1 at stack-trace.js:53
    96     45   selfRecursive1 at stack-trace.js:53
    97     46   selfRecursive1 at stack-trace.js:53
    98     47   selfRecursive1 at stack-trace.js:53
    99     48   selfRecursive1 at stack-trace.js:53
    100     49   selfRecursive1 at stack-trace.js:53
    101     50   selfRecursive1 at stack-trace.js:53
    102     51   selfRecursive1 at stack-trace.js:53
    103     52   selfRecursive1 at stack-trace.js:53
    104     53   selfRecursive1 at stack-trace.js:53
    105     54   selfRecursive1 at stack-trace.js:53
    106     55   selfRecursive1 at stack-trace.js:53
    107     56   selfRecursive1 at stack-trace.js:53
    108     57   selfRecursive1 at stack-trace.js:53
    109     58   selfRecursive1 at stack-trace.js:53
    110     59   selfRecursive1 at stack-trace.js:53
    111     60   selfRecursive1 at stack-trace.js:53
    112     61   selfRecursive1 at stack-trace.js:53
    113     62   selfRecursive1 at stack-trace.js:53
    114     63   selfRecursive1 at stack-trace.js:53
    115     64   selfRecursive1 at stack-trace.js:53
    116     65   selfRecursive1 at stack-trace.js:53
    117     66   selfRecursive1 at stack-trace.js:53
    118     67   selfRecursive1 at stack-trace.js:53
    119     68   selfRecursive1 at stack-trace.js:53
    120     69   selfRecursive1 at stack-trace.js:53
    121     70   selfRecursive1 at stack-trace.js:53
    122     71   selfRecursive1 at stack-trace.js:53
    123     72   selfRecursive1 at stack-trace.js:53
    124     73   selfRecursive1 at stack-trace.js:53
    125     74   selfRecursive1 at stack-trace.js:53
    126     75   selfRecursive1 at stack-trace.js:53
    127     76   selfRecursive1 at stack-trace.js:53
    128     77   selfRecursive1 at stack-trace.js:53
    129     78   selfRecursive1 at stack-trace.js:53
    130     79   selfRecursive1 at stack-trace.js:53
    131     80   selfRecursive1 at stack-trace.js:53
    132     81   selfRecursive1 at stack-trace.js:53
    133     82   selfRecursive1 at stack-trace.js:53
    134     83   selfRecursive1 at stack-trace.js:53
    135     84   selfRecursive1 at stack-trace.js:53
    136     85   selfRecursive1 at stack-trace.js:53
    137     86   selfRecursive1 at stack-trace.js:53
    138     87   selfRecursive1 at stack-trace.js:53
    139     88   selfRecursive1 at stack-trace.js:53
    140     89   selfRecursive1 at stack-trace.js:53
    141     90   selfRecursive1 at stack-trace.js:53
    142     91   selfRecursive1 at stack-trace.js:53
    143     92   selfRecursive1 at stack-trace.js:53
    144     93   selfRecursive1 at stack-trace.js:53
    145     94   selfRecursive1 at stack-trace.js:53
    146     95   selfRecursive1 at stack-trace.js:53
    147     96   selfRecursive1 at stack-trace.js:53
    148     97   selfRecursive1 at stack-trace.js:53
    149     98   selfRecursive1 at stack-trace.js:53
    150     99   selfRecursive1 at stack-trace.js:53
    151 
    152 --> Stack Trace:
    153     0   selfRecursive2 at stack-trace.js:62
     52    0   selfRecursive1 at stack-trace.js:52
     53    1   selfRecursive1 at stack-trace.js:52
     54    2   selfRecursive1 at stack-trace.js:52
     55    3   selfRecursive1 at stack-trace.js:52
     56    4   selfRecursive1 at stack-trace.js:52
     57    5   selfRecursive1 at stack-trace.js:52
     58    6   selfRecursive1 at stack-trace.js:52
     59    7   selfRecursive1 at stack-trace.js:52
     60    8   selfRecursive1 at stack-trace.js:52
     61    9   selfRecursive1 at stack-trace.js:52
     62    10   selfRecursive1 at stack-trace.js:52
     63    11   selfRecursive1 at stack-trace.js:52
     64    12   selfRecursive1 at stack-trace.js:52
     65    13   selfRecursive1 at stack-trace.js:52
     66    14   selfRecursive1 at stack-trace.js:52
     67    15   selfRecursive1 at stack-trace.js:52
     68    16   selfRecursive1 at stack-trace.js:52
     69    17   selfRecursive1 at stack-trace.js:52
     70    18   selfRecursive1 at stack-trace.js:52
     71    19   selfRecursive1 at stack-trace.js:52
     72    20   selfRecursive1 at stack-trace.js:52
     73    21   selfRecursive1 at stack-trace.js:52
     74    22   selfRecursive1 at stack-trace.js:52
     75    23   selfRecursive1 at stack-trace.js:52
     76    24   selfRecursive1 at stack-trace.js:52
     77    25   selfRecursive1 at stack-trace.js:52
     78    26   selfRecursive1 at stack-trace.js:52
     79    27   selfRecursive1 at stack-trace.js:52
     80    28   selfRecursive1 at stack-trace.js:52
     81    29   selfRecursive1 at stack-trace.js:52
     82    30   selfRecursive1 at stack-trace.js:52
     83    31   selfRecursive1 at stack-trace.js:52
     84    32   selfRecursive1 at stack-trace.js:52
     85    33   selfRecursive1 at stack-trace.js:52
     86    34   selfRecursive1 at stack-trace.js:52
     87    35   selfRecursive1 at stack-trace.js:52
     88    36   selfRecursive1 at stack-trace.js:52
     89    37   selfRecursive1 at stack-trace.js:52
     90    38   selfRecursive1 at stack-trace.js:52
     91    39   selfRecursive1 at stack-trace.js:52
     92    40   selfRecursive1 at stack-trace.js:52
     93    41   selfRecursive1 at stack-trace.js:52
     94    42   selfRecursive1 at stack-trace.js:52
     95    43   selfRecursive1 at stack-trace.js:52
     96    44   selfRecursive1 at stack-trace.js:52
     97    45   selfRecursive1 at stack-trace.js:52
     98    46   selfRecursive1 at stack-trace.js:52
     99    47   selfRecursive1 at stack-trace.js:52
     100    48   selfRecursive1 at stack-trace.js:52
     101    49   selfRecursive1 at stack-trace.js:52
     102    50   selfRecursive1 at stack-trace.js:52
     103    51   selfRecursive1 at stack-trace.js:52
     104    52   selfRecursive1 at stack-trace.js:52
     105    53   selfRecursive1 at stack-trace.js:52
     106    54   selfRecursive1 at stack-trace.js:52
     107    55   selfRecursive1 at stack-trace.js:52
     108    56   selfRecursive1 at stack-trace.js:52
     109    57   selfRecursive1 at stack-trace.js:52
     110    58   selfRecursive1 at stack-trace.js:52
     111    59   selfRecursive1 at stack-trace.js:52
     112    60   selfRecursive1 at stack-trace.js:52
     113    61   selfRecursive1 at stack-trace.js:52
     114    62   selfRecursive1 at stack-trace.js:52
     115    63   selfRecursive1 at stack-trace.js:52
     116    64   selfRecursive1 at stack-trace.js:52
     117    65   selfRecursive1 at stack-trace.js:52
     118    66   selfRecursive1 at stack-trace.js:52
     119    67   selfRecursive1 at stack-trace.js:52
     120    68   selfRecursive1 at stack-trace.js:52
     121    69   selfRecursive1 at stack-trace.js:52
     122    70   selfRecursive1 at stack-trace.js:52
     123    71   selfRecursive1 at stack-trace.js:52
     124    72   selfRecursive1 at stack-trace.js:52
     125    73   selfRecursive1 at stack-trace.js:52
     126    74   selfRecursive1 at stack-trace.js:52
     127    75   selfRecursive1 at stack-trace.js:52
     128    76   selfRecursive1 at stack-trace.js:52
     129    77   selfRecursive1 at stack-trace.js:52
     130    78   selfRecursive1 at stack-trace.js:52
     131    79   selfRecursive1 at stack-trace.js:52
     132    80   selfRecursive1 at stack-trace.js:52
     133    81   selfRecursive1 at stack-trace.js:52
     134    82   selfRecursive1 at stack-trace.js:52
     135    83   selfRecursive1 at stack-trace.js:52
     136    84   selfRecursive1 at stack-trace.js:52
     137    85   selfRecursive1 at stack-trace.js:52
     138    86   selfRecursive1 at stack-trace.js:52
     139    87   selfRecursive1 at stack-trace.js:52
     140    88   selfRecursive1 at stack-trace.js:52
     141    89   selfRecursive1 at stack-trace.js:52
     142    90   selfRecursive1 at stack-trace.js:52
     143    91   selfRecursive1 at stack-trace.js:52
     144    92   selfRecursive1 at stack-trace.js:52
     145    93   selfRecursive1 at stack-trace.js:52
     146    94   selfRecursive1 at stack-trace.js:52
     147    95   selfRecursive1 at stack-trace.js:52
     148    96   selfRecursive1 at stack-trace.js:52
     149    97   selfRecursive1 at stack-trace.js:52
     150    98   selfRecursive1 at stack-trace.js:52
     151    99   selfRecursive1 at stack-trace.js:52
     152
     153--> Stack Trace:
     154    0   selfRecursive2 at stack-trace.js:58
    154155    1   selfRecursive2 at stack-trace.js:62
    155156    2   selfRecursive2 at stack-trace.js:62
     
    253254
    254255--> Stack Trace:
    255     0   selfRecursive3 at stack-trace.js:69
    256     1    at eval code
    257     2   eval at [native code]
    258     3   selfRecursive3 at stack-trace.js:69
    259     4    at eval code
    260     5   eval at [native code]
    261     6   selfRecursive3 at stack-trace.js:69
    262     7    at eval code
    263     8   eval at [native code]
    264     9   selfRecursive3 at stack-trace.js:69
    265     10    at eval code
    266     11   eval at [native code]
    267     12   selfRecursive3 at stack-trace.js:69
    268     13    at eval code
    269     14   eval at [native code]
    270     15   selfRecursive3 at stack-trace.js:69
    271     16    at eval code
    272     17   eval at [native code]
    273     18   selfRecursive3 at stack-trace.js:69
    274     19    at eval code
    275     20   eval at [native code]
    276     21   selfRecursive3 at stack-trace.js:69
    277     22    at eval code
    278     23   eval at [native code]
    279     24   selfRecursive3 at stack-trace.js:69
    280     25    at eval code
    281     26   eval at [native code]
    282     27   selfRecursive3 at stack-trace.js:69
    283     28    at eval code
    284     29   eval at [native code]
    285     30   selfRecursive3 at stack-trace.js:69
    286     31    at eval code
    287     32   eval at [native code]
    288     33   selfRecursive3 at stack-trace.js:69
    289     34    at eval code
    290     35   eval at [native code]
    291     36   selfRecursive3 at stack-trace.js:69
    292     37    at eval code
    293     38   eval at [native code]
    294     39   selfRecursive3 at stack-trace.js:69
    295     40    at eval code
    296     41   eval at [native code]
    297     42   selfRecursive3 at stack-trace.js:69
    298     43    at eval code
    299     44   eval at [native code]
    300     45   selfRecursive3 at stack-trace.js:69
    301     46    at eval code
    302     47   eval at [native code]
    303     48   selfRecursive3 at stack-trace.js:69
    304     49    at eval code
    305     50   eval at [native code]
    306     51   selfRecursive3 at stack-trace.js:69
    307     52    at eval code
    308     53   eval at [native code]
    309     54   selfRecursive3 at stack-trace.js:69
    310     55    at eval code
    311     56   eval at [native code]
    312     57   selfRecursive3 at stack-trace.js:69
    313     58    at eval code
    314     59   eval at [native code]
    315     60   selfRecursive3 at stack-trace.js:69
    316     61    at eval code
    317     62   eval at [native code]
    318     63   selfRecursive3 at stack-trace.js:69
    319     64    at eval code
    320     65   eval at [native code]
    321     66   selfRecursive3 at stack-trace.js:69
    322     67    at eval code
    323     68   eval at [native code]
    324     69   selfRecursive3 at stack-trace.js:69
    325     70    at eval code
    326     71   eval at [native code]
    327     72   selfRecursive3 at stack-trace.js:69
    328     73    at eval code
    329     74   eval at [native code]
    330     75   selfRecursive3 at stack-trace.js:69
    331     76    at eval code
    332     77   eval at [native code]
    333     78   selfRecursive3 at stack-trace.js:69
    334     79    at eval code
    335     80   eval at [native code]
    336     81   selfRecursive3 at stack-trace.js:69
    337     82    at eval code
    338     83   eval at [native code]
    339     84   selfRecursive3 at stack-trace.js:69
    340     85    at eval code
    341     86   eval at [native code]
    342     87   selfRecursive3 at stack-trace.js:69
    343     88    at eval code
    344     89   eval at [native code]
    345     90   selfRecursive3 at stack-trace.js:69
    346     91    at eval code
    347     92   eval at [native code]
    348     93   selfRecursive3 at stack-trace.js:69
    349     94    at eval code
    350     95   eval at [native code]
    351     96   selfRecursive3 at stack-trace.js:69
    352     97    at eval code
    353     98   eval at [native code]
    354     99   selfRecursive3 at stack-trace.js:69
     256    0   eval at [native code]
     257    1   selfRecursive3 at stack-trace.js:69
     258    2    at eval code
     259    3   eval at [native code]
     260    4   selfRecursive3 at stack-trace.js:69
     261    5    at eval code
     262    6   eval at [native code]
     263    7   selfRecursive3 at stack-trace.js:69
     264    8    at eval code
     265    9   eval at [native code]
     266    10   selfRecursive3 at stack-trace.js:69
     267    11    at eval code
     268    12   eval at [native code]
     269    13   selfRecursive3 at stack-trace.js:69
     270    14    at eval code
     271    15   eval at [native code]
     272    16   selfRecursive3 at stack-trace.js:69
     273    17    at eval code
     274    18   eval at [native code]
     275    19   selfRecursive3 at stack-trace.js:69
     276    20    at eval code
     277    21   eval at [native code]
     278    22   selfRecursive3 at stack-trace.js:69
     279    23    at eval code
     280    24   eval at [native code]
     281    25   selfRecursive3 at stack-trace.js:69
     282    26    at eval code
     283    27   eval at [native code]
     284    28   selfRecursive3 at stack-trace.js:69
     285    29    at eval code
     286    30   eval at [native code]
     287    31   selfRecursive3 at stack-trace.js:69
     288    32    at eval code
     289    33   eval at [native code]
     290    34   selfRecursive3 at stack-trace.js:69
     291    35    at eval code
     292    36   eval at [native code]
     293    37   selfRecursive3 at stack-trace.js:69
     294    38    at eval code
     295    39   eval at [native code]
     296    40   selfRecursive3 at stack-trace.js:69
     297    41    at eval code
     298    42   eval at [native code]
     299    43   selfRecursive3 at stack-trace.js:69
     300    44    at eval code
     301    45   eval at [native code]
     302    46   selfRecursive3 at stack-trace.js:69
     303    47    at eval code
     304    48   eval at [native code]
     305    49   selfRecursive3 at stack-trace.js:69
     306    50    at eval code
     307    51   eval at [native code]
     308    52   selfRecursive3 at stack-trace.js:69
     309    53    at eval code
     310    54   eval at [native code]
     311    55   selfRecursive3 at stack-trace.js:69
     312    56    at eval code
     313    57   eval at [native code]
     314    58   selfRecursive3 at stack-trace.js:69
     315    59    at eval code
     316    60   eval at [native code]
     317    61   selfRecursive3 at stack-trace.js:69
     318    62    at eval code
     319    63   eval at [native code]
     320    64   selfRecursive3 at stack-trace.js:69
     321    65    at eval code
     322    66   eval at [native code]
     323    67   selfRecursive3 at stack-trace.js:69
     324    68    at eval code
     325    69   eval at [native code]
     326    70   selfRecursive3 at stack-trace.js:69
     327    71    at eval code
     328    72   eval at [native code]
     329    73   selfRecursive3 at stack-trace.js:69
     330    74    at eval code
     331    75   eval at [native code]
     332    76   selfRecursive3 at stack-trace.js:69
     333    77    at eval code
     334    78   eval at [native code]
     335    79   selfRecursive3 at stack-trace.js:69
     336    80    at eval code
     337    81   eval at [native code]
     338    82   selfRecursive3 at stack-trace.js:69
     339    83    at eval code
     340    84   eval at [native code]
     341    85   selfRecursive3 at stack-trace.js:69
     342    86    at eval code
     343    87   eval at [native code]
     344    88   selfRecursive3 at stack-trace.js:69
     345    89    at eval code
     346    90   eval at [native code]
     347    91   selfRecursive3 at stack-trace.js:69
     348    92    at eval code
     349    93   eval at [native code]
     350    94   selfRecursive3 at stack-trace.js:69
     351    95    at eval code
     352    96   eval at [native code]
     353    97   selfRecursive3 at stack-trace.js:69
     354    98    at eval code
     355    99   eval at [native code]
    355356
    356357--> Stack Trace:
     
    408409
    409410--> Stack Trace:
    410     0   h at stack-trace.js:153
    411     1   map at [native code]
    412     2   mapTest at stack-trace.js:158
    413     3   mapTestDriver at stack-trace.js:164
    414     4   global code at stack-trace.js:175
     411    0   map at [native code]
     412    1   h at stack-trace.js:153
     413    2   map at [native code]
     414    3   mapTest at stack-trace.js:158
     415    4   mapTestDriver at stack-trace.js:164
     416    5   global code at stack-trace.js:175
    415417
    416418--> Stack Trace:
  • trunk/Source/JavaScriptCore/ChangeLog

    r114274 r114309  
     12012-04-16  Oliver Hunt  <[email protected]>
     2
     3        Exception stack traces aren't complete when the exception starts in native code
     4        https://bugs.webkit.org/show_bug.cgi?id=84073
     5
     6        Reviewed by Gavin Barraclough.
     7
     8        Refactored building the stack trace to so that we can construct
     9        it earlier, and don't rely on any prior work performed in the
     10        exception handling machinery. Also updated LLInt and the DFG to
     11        completely initialise the callframes of host function calls.
     12
     13        * bytecode/CodeBlock.h:
     14        (JSC::CodeBlock::codeOriginIndexForReturn):
     15        (CodeBlock):
     16        * dfg/DFGOperations.cpp:
     17        * interpreter/Interpreter.cpp:
     18        (JSC::Interpreter::getStackTrace):
     19        (JSC::Interpreter::addStackTraceIfNecessary):
     20        (JSC):
     21        (JSC::Interpreter::throwException):
     22        * interpreter/Interpreter.h:
     23        (Interpreter):
     24        * jit/JITStubs.cpp:
     25        (JSC::DEFINE_STUB_FUNCTION):
     26        * jsc.cpp:
     27        (functionJSCStack):
     28        * llint/LLIntSlowPaths.cpp:
     29        (JSC::LLInt::handleHostCall):
     30        * parser/Parser.h:
     31        (JSC::::parse):
     32        * runtime/Error.cpp:
     33        (JSC::addErrorInfo):
     34        (JSC::throwError):
     35        * runtime/Error.h:
     36        (JSC):
     37
    1382012-04-16  Oliver Hunt  <[email protected]>
    239
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def

    r114255 r114309  
    213213    ?getPropertyNames@JSObject@JSC@@SAXPAV12@PAVExecState@2@AAVPropertyNameArray@2@W4EnumerationMode@2@@Z
    214214    ?getSlice@ArgList@JSC@@QBEXHAAV12@@Z
    215     ?getStackTrace@Interpreter@JSC@@SAXPAVJSGlobalData@2@HAAV?$Vector@UStackFrame@JSC@@$0A@@WTF@@@Z
     215    ?getStackTrace@Interpreter@JSC@@SAXPAVJSGlobalData@2@AAV?$Vector@UStackFrame@JSC@@$0A@@WTF@@@Z
    216216    ?getString@JSCell@JSC@@QBE?AVUString@2@PAVExecState@2@@Z
    217217    ?getString@JSCell@JSC@@QBE_NPAVExecState@2@AAVUString@2@@Z
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.h

    r113906 r114309  
    711711        }
    712712       
     713        int codeOriginIndexForReturn(ReturnAddressPtr returnAddress)
     714        {
     715            ASSERT(hasCodeOrigins());
     716            unsigned offset = getJITCode().offsetOf(returnAddress.value());
     717            CodeOriginAtCallReturnOffset* entry = binarySearch<CodeOriginAtCallReturnOffset, unsigned, getCallReturnOffsetForCodeOrigin>(codeOrigins().begin(), codeOrigins().size(), offset, WTF::KeyMustNotBePresentInArray);
     718            return entry - codeOrigins().begin();
     719        }
     720       
    713721        CodeOrigin codeOrigin(unsigned index)
    714722        {
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r113930 r114309  
    793793   
    794794        if (callType == CallTypeHost) {
     795            execCallee->setCallee(asObject(callee));
    795796            globalData->hostCallReturnValue = JSValue::decode(callData.native.function(execCallee));
    796797            if (globalData->exception)
     
    813814   
    814815    if (constructType == ConstructTypeHost) {
     816        execCallee->setCallee(asObject(callee));
    815817        globalData->hostCallReturnValue = JSValue::decode(constructData.native.function(execCallee));
    816818        if (globalData->exception)
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp

    r113363 r114309  
    6666#include <stdio.h>
    6767#include <wtf/Threading.h>
     68#include <wtf/text/StringBuilder.h>
    6869
    6970#if ENABLE(JIT)
     
    953954}
    954955
    955 void Interpreter::getStackTrace(JSGlobalData* globalData, int line, Vector<StackFrame>& results)
     956void Interpreter::getStackTrace(JSGlobalData* globalData, Vector<StackFrame>& results)
    956957{
    957     CallFrame* callFrame = globalData->topCallFrame->removeHostCallFrameFlag()->trueCallFrameFromVMCode();
     958    CallFrame* callFrame = globalData->topCallFrame->removeHostCallFrameFlag();
    958959    if (!callFrame || callFrame == CallFrame::noCaller())
    959960        return;
    960 
    961     if (line == -1)
    962         line = getLineNumberForCallFrame(globalData, callFrame);
     961    int line = getLineNumberForCallFrame(globalData, callFrame);
     962
     963    callFrame = callFrame->trueCallFrameFromVMCode();
    963964
    964965    while (callFrame && callFrame != CallFrame::noCaller()) {
     
    976977}
    977978
     979void Interpreter::addStackTraceIfNecessary(CallFrame* callFrame, JSObject* error)
     980{
     981    JSGlobalData* globalData = &callFrame->globalData();
     982    if (error->hasProperty(callFrame, globalData->propertyNames->stack))
     983        return;
     984
     985    Vector<StackFrame> stackTrace;
     986    getStackTrace(&callFrame->globalData(), stackTrace);
     987   
     988    if (stackTrace.isEmpty())
     989        return;
     990   
     991    JSGlobalObject* globalObject = 0;
     992    if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error))
     993        globalObject = globalData->dynamicGlobalObject;
     994    else
     995        globalObject = error->globalObject();
     996    StringBuilder builder;
     997    for (unsigned i = 0; i < stackTrace.size(); i++) {
     998        builder.append(String(stackTrace[i].toString(globalObject->globalExec()).impl()));
     999        if (i != stackTrace.size() - 1)
     1000            builder.append('\n');
     1001    }
     1002   
     1003    error->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, UString(builder.toString().impl())), ReadOnly | DontDelete);
     1004}
     1005
    9781006NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValue& exceptionValue, unsigned bytecodeOffset)
    9791007{
     
    9911019        if (codeBlock->hasExpressionInfo() && !hasErrorInfo(callFrame, exception)) {
    9921020            ASSERT(codeBlock->hasLineInfo());
    993 
    9941021            // FIXME: should only really be adding these properties to VM generated exceptions,
    9951022            // but the inspector currently requires these for all thrown objects.
    996             Vector<StackFrame> stackTrace;
    997             getStackTrace(&callFrame->globalData(), codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), stackTrace);
    998             addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source(), stackTrace);
     1023            addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source());
    9991024        }
    10001025
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.h

    r108444 r114309  
    223223        NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine);
    224224        static const UString getTraceLine(CallFrame*, StackFrameCodeType, const UString&, int);
    225         JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, int line, Vector<StackFrame>& results);
     225        JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, Vector<StackFrame>& results);
     226        static void addStackTraceIfNecessary(CallFrame*, JSObject* error);
    226227
    227228        void dumpSampleData(ExecState* exec);
  • trunk/Source/JavaScriptCore/jit/JITStubs.cpp

    r114255 r114309  
    35193519    STUB_INIT_STACK_FRAME(stackFrame);
    35203520    JSGlobalData* globalData = stackFrame.globalData;
     3521    // It's possible for us to reach this point with incorrect origin metadata
     3522    // if a native function throws an exception after being planted in certain
     3523    // code paths as the native thunk doesn't can't unwind itself as if it were
     3524    // a JS function. So we redetermine the correct data here just to be safe.
     3525    if (CodeBlock* codeBlock = stackFrame.callFrame->codeBlock()) {
     3526#if ENABLE(DFG_JIT)
     3527        if (codeBlock->hasCodeOrigins())
     3528            stackFrame.callFrame->setBytecodeOffsetForNonDFGCode(codeBlock->codeOriginIndexForReturn(globalData->exceptionLocation));
     3529        else
     3530#endif
     3531            if (codeBlock->getJITType() == JITCode::BaselineJIT)
     3532            stackFrame.callFrame->setBytecodeOffsetForNonDFGCode(codeBlock->bytecodeOffset(stackFrame.callFrame, globalData->exceptionLocation));
     3533    }
    35213534    ExceptionHandler handler = jitThrow(globalData, stackFrame.callFrame, globalData->exception, globalData->exceptionLocation);
    35223535    STUB_SET_RETURN_ADDRESS(handler.catchRoutine);
  • trunk/Source/JavaScriptCore/jsc.cpp

    r113553 r114309  
    278278    String trace = "--> Stack trace:\n";
    279279    Vector<StackFrame> stackTrace;
    280     Interpreter::getStackTrace(&exec->globalData(), -1, stackTrace);
     280    Interpreter::getStackTrace(&exec->globalData(), stackTrace);
    281281    int i = 0;
    282282
  • trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp

    r113930 r114309  
    12421242   
    12431243        if (callType == CallTypeHost) {
     1244            execCallee->setCallee(asObject(callee));
    12441245            globalData.hostCallReturnValue = JSValue::decode(callData.native.function(execCallee));
    12451246           
     
    12631264   
    12641265    if (constructType == ConstructTypeHost) {
     1266        execCallee->setCallee(asObject(callee));
    12651267        globalData.hostCallReturnValue = JSValue::decode(constructData.native.function(execCallee));
    12661268
  • trunk/Source/JavaScriptCore/parser/Parser.h

    r112555 r114309  
    994994            *exception = createSyntaxError(lexicalGlobalObject, errMsg);
    995995        else
    996             *exception = addErrorInfo(&lexicalGlobalObject->globalData(), createSyntaxError(lexicalGlobalObject, errMsg), errLine, *m_source, Vector<StackFrame>());
     996            *exception = addErrorInfo(lexicalGlobalObject->globalExec(), createSyntaxError(lexicalGlobalObject, errMsg), errLine, *m_source);
    997997    }
    998998
  • trunk/Source/JavaScriptCore/runtime/Error.cpp

    r109034 r114309  
    121121}
    122122
    123 JSObject* addErrorInfo(JSGlobalData* globalData, JSObject* error, int line, const SourceCode& source, const Vector<StackFrame>& stackTrace)
     123JSObject* addErrorInfo(CallFrame* callFrame, JSObject* error, int line, const SourceCode& source)
    124124{
     125    JSGlobalData* globalData = &callFrame->globalData();
    125126    const UString& sourceURL = source.provider()->url();
    126127
     
    129130    if (!sourceURL.isNull())
    130131        error->putDirect(*globalData, Identifier(globalData, sourceURLPropertyName), jsString(globalData, sourceURL), ReadOnly | DontDelete);
    131     if (!stackTrace.isEmpty()) {
    132         JSGlobalObject* globalObject = 0;
    133         if (isTerminatedExecutionException(error) || isInterruptedExecutionException(error))
    134             globalObject = globalData->dynamicGlobalObject;
    135         else
    136             globalObject = error->globalObject();
    137         StringBuilder builder;
    138         for (unsigned i = 0; i < stackTrace.size(); i++) {
    139             builder.append(String(stackTrace[i].toString(globalObject->globalExec()).impl()));
    140             if (i != stackTrace.size() - 1)
    141                 builder.append('\n');
    142         }
    143132
    144         error->putDirect(*globalData, globalData->propertyNames->stack, jsString(globalData, UString(builder.toString().impl())), ReadOnly | DontDelete);
    145     }
     133    globalData->interpreter->addStackTraceIfNecessary(callFrame, error);
    146134
    147135    return error;
    148136}
    149137
    150 JSObject* addErrorInfo(ExecState* exec, JSObject* error, int line, const SourceCode& source, const Vector<StackFrame>& stackTrace)
    151 {
    152     return addErrorInfo(&exec->globalData(), error, line, source, stackTrace);
    153 }
    154138
    155139bool hasErrorInfo(ExecState* exec, JSObject* error)
     
    161145JSValue throwError(ExecState* exec, JSValue error)
    162146{
     147    if (error.isObject())
     148        return throwError(exec, asObject(error));
    163149    exec->globalData().exception = error;
    164150    return error;
     
    167153JSObject* throwError(ExecState* exec, JSObject* error)
    168154{
     155    Interpreter::addStackTraceIfNecessary(exec, error);
    169156    exec->globalData().exception = error;
    170157    return error;
  • trunk/Source/JavaScriptCore/runtime/Error.h

    r108112 r114309  
    5858    // Methods to add
    5959    bool hasErrorInfo(ExecState*, JSObject* error);
    60     JSObject* addErrorInfo(JSGlobalData*, JSObject* error, int line, const SourceCode&, const Vector<StackFrame>&);
    6160    // ExecState wrappers.
    62     JSObject* addErrorInfo(ExecState*, JSObject* error, int line, const SourceCode&, const Vector<StackFrame>&);
     61    JSObject* addErrorInfo(ExecState*, JSObject* error, int line, const SourceCode&);
    6362
    6463    // Methods to throw Errors.
Note: See TracChangeset for help on using the changeset viewer.