Changeset 153073 in webkit


Ignore:
Timestamp:
Jul 23, 2013 5:56:52 PM (11 years ago)
Author:
mark.lam@apple.com
Message:

Added ExpressionRangeInfo for BinaryOpNodes that can throw exceptions
due to type coersion.
https://bugs.webkit.org/show_bug.cgi?id=116853.

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

  • bytecompiler/NodesCodegen.cpp:

(JSC::BinaryOpNode::emitBytecode):

  • Added expression info for the strcat and the general binary op cases. I did not add expression info for the "compare with null" case because that comparison cannot trigger type coersion, and hence it won't throw any exceptions and doesn't need the expression info.

LayoutTests:

Added the test case from bugzilla which exercises the general binary op
type coersion case, plus another for exercising the strcat case.

  • fast/js/line-column-numbers-expected.txt:
  • fast/js/line-column-numbers.html:
  • fast/js/script-tests/line-column-numbers.js:
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r153067 r153073  
     12013-07-23  Mark Lam  <mark.lam@apple.com>
     2
     3        Added ExpressionRangeInfo for BinaryOpNodes that can throw exceptions
     4        due to type coersion.
     5        https://bugs.webkit.org/show_bug.cgi?id=116853.
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Added the test case from bugzilla which exercises the general binary op
     10        type coersion case, plus another for exercising the strcat case.
     11
     12        * fast/js/line-column-numbers-expected.txt:
     13        * fast/js/line-column-numbers.html:
     14        * fast/js/script-tests/line-column-numbers.js:
     15
    1162013-07-22  Ryosuke Niwa  <rniwa@webkit.org>
    217
  • trunk/LayoutTests/fast/js/line-column-numbers-expected.txt

    r152494 r153073  
    9494    3   global code at line-column-numbers.html:155:5
    9595
     96--> Case 19 Stack Trace:
     97    0   toString at line-column-numbers.html:170:26
     98    1   toString at line-column-numbers.html:170:26
     99    2   toString at line-column-numbers.html:170:26
     100    3   toString at line-column-numbers.html:170:26
     101    4   toString at line-column-numbers.html:170:26
     102    5   toString at line-column-numbers.html:170:26
     103    6   toString at line-column-numbers.html:170:26
     104    7   toString at line-column-numbers.html:170:26
     105    8   toString at line-column-numbers.html:170:26
     106    9   toString at line-column-numbers.html:170:26
     107    10   toString at line-column-numbers.html:170:26
     108    11   toString at line-column-numbers.html:170:26
     109    12   toString at line-column-numbers.html:170:26
     110    13   toString at line-column-numbers.html:170:26
     111    14   toString at line-column-numbers.html:170:26
     112    15   toString at line-column-numbers.html:170:26
     113    16   toString at line-column-numbers.html:170:26
     114    17   toString at line-column-numbers.html:170:26
     115    18   toString at line-column-numbers.html:170:26
     116    19   toString at line-column-numbers.html:170:26
     117
     118--> Case 20 Stack Trace:
     119    0   g at line-column-numbers.html:190:17
     120    1   g at line-column-numbers.html:190:30
     121    2   g at line-column-numbers.html:190:30
     122    3   g at line-column-numbers.html:190:30
     123    4   g at line-column-numbers.html:190:30
     124    5   g at line-column-numbers.html:190:30
     125    6   g at line-column-numbers.html:190:30
     126    7   g at line-column-numbers.html:190:30
     127    8   g at line-column-numbers.html:190:30
     128    9   g at line-column-numbers.html:190:30
     129    10   g at line-column-numbers.html:190:30
     130    11   g at line-column-numbers.html:190:30
     131    12   g at line-column-numbers.html:190:30
     132    13   g at line-column-numbers.html:190:30
     133    14   g at line-column-numbers.html:190:30
     134    15   g at line-column-numbers.html:190:30
     135    16   g at line-column-numbers.html:190:30
     136    17   g at line-column-numbers.html:190:30
     137    18   g at line-column-numbers.html:190:30
     138    19   g at line-column-numbers.html:190:30
     139
    96140--> Case 1 Stack Trace:
    97141    0   global code at line-column-numbers.js:3:28
     
    184228    3   global code at line-column-numbers.js:96:5
    185229
     230--> Case 19 Stack Trace:
     231    0   toString at line-column-numbers.js:109:26
     232    1   toString at line-column-numbers.js:109:26
     233    2   toString at line-column-numbers.js:109:26
     234    3   toString at line-column-numbers.js:109:26
     235    4   toString at line-column-numbers.js:109:26
     236    5   toString at line-column-numbers.js:109:26
     237    6   toString at line-column-numbers.js:109:26
     238    7   toString at line-column-numbers.js:109:26
     239    8   toString at line-column-numbers.js:109:26
     240    9   toString at line-column-numbers.js:109:26
     241    10   toString at line-column-numbers.js:109:26
     242    11   toString at line-column-numbers.js:109:26
     243    12   toString at line-column-numbers.js:109:26
     244    13   toString at line-column-numbers.js:109:26
     245    14   toString at line-column-numbers.js:109:26
     246    15   toString at line-column-numbers.js:109:26
     247    16   toString at line-column-numbers.js:109:26
     248    17   toString at line-column-numbers.js:109:26
     249    18   toString at line-column-numbers.js:109:26
     250    19   toString at line-column-numbers.js:109:26
     251
     252--> Case 20 Stack Trace:
     253    0   g at line-column-numbers.js:127:17
     254    1   g at line-column-numbers.js:127:30
     255    2   g at line-column-numbers.js:127:30
     256    3   g at line-column-numbers.js:127:30
     257    4   g at line-column-numbers.js:127:30
     258    5   g at line-column-numbers.js:127:30
     259    6   g at line-column-numbers.js:127:30
     260    7   g at line-column-numbers.js:127:30
     261    8   g at line-column-numbers.js:127:30
     262    9   g at line-column-numbers.js:127:30
     263    10   g at line-column-numbers.js:127:30
     264    11   g at line-column-numbers.js:127:30
     265    12   g at line-column-numbers.js:127:30
     266    13   g at line-column-numbers.js:127:30
     267    14   g at line-column-numbers.js:127:30
     268    15   g at line-column-numbers.js:127:30
     269    16   g at line-column-numbers.js:127:30
     270    17   g at line-column-numbers.js:127:30
     271    18   g at line-column-numbers.js:127:30
     272    19   g at line-column-numbers.js:127:30
     273
    186274PASS successfullyParsed is true
    187275
  • trunk/LayoutTests/fast/js/line-column-numbers.html

    r152494 r153073  
    2222    debug("--> Case " + testId + " Stack Trace:")
    2323    stackTrace = stackTrace.split("\n");
    24     var length = Math.min(stackTrace.length, 100);
     24    var length = Math.min(stackTrace.length, 20);
    2525    for (var i = 0; i < length; i++) {
    2626        var indexOfAt = stackTrace[i].indexOf('@')
     
    162162</script>
    163163
     164<!-- Case 19: Binary op with type coersion on strcat. -->
     165<script>testId++;</script>
     166<script>
     167try {
     168    testObj19 = {
     169        toString: function() {
     170            var result = ("Hello " + "World") + this;
     171            b = 5;
     172            return result;
     173        },
     174        run: function() {
     175            return testObj19.toString();
     176        }
     177    };
     178    testObj19.run();
     179} catch(e) {
     180    printStack(e.stack);
     181}
     182</script>
     183
     184<!-- Case 20: BinaryOp with type coersion on comparison. -->
     185<script>testId++;</script>
     186<script>
     187try {
     188    function test20() {
     189        var f = function g() {
     190            if (this != 10) f();
     191        };
     192        var a = f();
     193    }
     194
     195    test20();
     196} catch(e) {
     197    printStack(e.stack);
     198}
     199</script>
     200
    164201<!-- Now do it all over with a loaded script file. -->
    165202<script>testId = 0;</script>
  • trunk/LayoutTests/fast/js/script-tests/line-column-numbers.js

    r152494 r153073  
    102102"");
    103103
     104// Case 19: Binary op with type coersion on strcat.
     105testId++;
     106try {
     107    testObj19b = {
     108        toString: function() {
     109            var result = ("Hello " + "World") + this;
     110            b19 = 5;
     111            return result;
     112        },
     113        run: function() {
     114            return testObj19b.toString();
     115        }
     116    };
     117    testObj19b.run();
     118} catch(e) {
     119    printStack(e.stack);
     120}
     121
     122// Case 20: BinaryOp with type coersion on comparison.
     123testId++;
     124try {
     125    function test20b() {
     126        var f = function g() {
     127            if (this != 10) f();
     128        };
     129        var a = f();
     130    }
     131
     132    test20b();
     133} catch(e) {
     134    printStack(e.stack);
     135}
     136
    104137successfullyParsed = true;
  • trunk/Source/JavaScriptCore/ChangeLog

    r153071 r153073  
     12013-07-23  Mark Lam  <mark.lam@apple.com>
     2
     3        Added ExpressionRangeInfo for BinaryOpNodes that can throw exceptions
     4        due to type coersion.
     5        https://bugs.webkit.org/show_bug.cgi?id=116853.
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        * bytecompiler/NodesCodegen.cpp:
     10        (JSC::BinaryOpNode::emitBytecode):
     11        - Added expression info for the strcat and the general binary op cases.
     12          I did not add expression info for the "compare with null" case because
     13          that comparison cannot trigger type coersion, and hence it won't throw
     14          any exceptions and doesn't need the expression info.
     15
    1162013-07-23  Mark Lam  <mark.lam@apple.com>
    217
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r153071 r153073  
    10961096    OpcodeID opcodeID = this->opcodeID();
    10971097
    1098     if (opcodeID == op_add && m_expr1->isAdd() && m_expr1->resultDescriptor().definitelyIsString())
     1098    if (opcodeID == op_add && m_expr1->isAdd() && m_expr1->resultDescriptor().definitelyIsString()) {
     1099        generator.emitExpressionInfo(startOffset(), 0, 0, lineNo(), lineStartOffset());
    10991100        return emitStrcat(generator, dst);
     1101    }
    11001102
    11011103    if (opcodeID == op_neq) {
     
    11171119    bool wasTypeof = generator.m_lastOpcodeID == op_typeof;
    11181120    RegisterID* src2 = generator.emitNode(right);
     1121    generator.emitExpressionInfo(startOffset(), 0, 0, lineNo(), lineStartOffset());
    11191122    if (wasTypeof && (opcodeID == op_neq || opcodeID == op_nstricteq)) {
    11201123        RefPtr<RegisterID> tmp = generator.tempDestination(dst);
Note: See TracChangeset for help on using the changeset viewer.