Title: [153073] trunk
Revision
153073
Author
[email protected]
Date
2013-07-23 17:56:52 -0700 (Tue, 23 Jul 2013)

Log 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/_javascript_Core: 

* 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:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (153072 => 153073)


--- trunk/LayoutTests/ChangeLog	2013-07-24 00:53:57 UTC (rev 153072)
+++ trunk/LayoutTests/ChangeLog	2013-07-24 00:56:52 UTC (rev 153073)
@@ -1,3 +1,18 @@
+2013-07-23  Mark Lam  <[email protected]>
+
+        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.
+
+        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:
+
 2013-07-22  Ryosuke Niwa  <[email protected]>
 
         The computed values of fix length padding should be subpixel precision like margin

Modified: trunk/LayoutTests/fast/js/line-column-numbers-expected.txt (153072 => 153073)


--- trunk/LayoutTests/fast/js/line-column-numbers-expected.txt	2013-07-24 00:53:57 UTC (rev 153072)
+++ trunk/LayoutTests/fast/js/line-column-numbers-expected.txt	2013-07-24 00:56:52 UTC (rev 153073)
@@ -93,6 +93,50 @@
     2   eval at [native code]
     3   global code at line-column-numbers.html:155:5
 
+--> Case 19 Stack Trace:
+    0   toString at line-column-numbers.html:170:26
+    1   toString at line-column-numbers.html:170:26
+    2   toString at line-column-numbers.html:170:26
+    3   toString at line-column-numbers.html:170:26
+    4   toString at line-column-numbers.html:170:26
+    5   toString at line-column-numbers.html:170:26
+    6   toString at line-column-numbers.html:170:26
+    7   toString at line-column-numbers.html:170:26
+    8   toString at line-column-numbers.html:170:26
+    9   toString at line-column-numbers.html:170:26
+    10   toString at line-column-numbers.html:170:26
+    11   toString at line-column-numbers.html:170:26
+    12   toString at line-column-numbers.html:170:26
+    13   toString at line-column-numbers.html:170:26
+    14   toString at line-column-numbers.html:170:26
+    15   toString at line-column-numbers.html:170:26
+    16   toString at line-column-numbers.html:170:26
+    17   toString at line-column-numbers.html:170:26
+    18   toString at line-column-numbers.html:170:26
+    19   toString at line-column-numbers.html:170:26
+
+--> Case 20 Stack Trace:
+    0   g at line-column-numbers.html:190:17
+    1   g at line-column-numbers.html:190:30
+    2   g at line-column-numbers.html:190:30
+    3   g at line-column-numbers.html:190:30
+    4   g at line-column-numbers.html:190:30
+    5   g at line-column-numbers.html:190:30
+    6   g at line-column-numbers.html:190:30
+    7   g at line-column-numbers.html:190:30
+    8   g at line-column-numbers.html:190:30
+    9   g at line-column-numbers.html:190:30
+    10   g at line-column-numbers.html:190:30
+    11   g at line-column-numbers.html:190:30
+    12   g at line-column-numbers.html:190:30
+    13   g at line-column-numbers.html:190:30
+    14   g at line-column-numbers.html:190:30
+    15   g at line-column-numbers.html:190:30
+    16   g at line-column-numbers.html:190:30
+    17   g at line-column-numbers.html:190:30
+    18   g at line-column-numbers.html:190:30
+    19   g at line-column-numbers.html:190:30
+
 --> Case 1 Stack Trace:
     0   global code at line-column-numbers.js:3:28
 
@@ -183,6 +227,50 @@
     2   eval at [native code]
     3   global code at line-column-numbers.js:96:5
 
+--> Case 19 Stack Trace:
+    0   toString at line-column-numbers.js:109:26
+    1   toString at line-column-numbers.js:109:26
+    2   toString at line-column-numbers.js:109:26
+    3   toString at line-column-numbers.js:109:26
+    4   toString at line-column-numbers.js:109:26
+    5   toString at line-column-numbers.js:109:26
+    6   toString at line-column-numbers.js:109:26
+    7   toString at line-column-numbers.js:109:26
+    8   toString at line-column-numbers.js:109:26
+    9   toString at line-column-numbers.js:109:26
+    10   toString at line-column-numbers.js:109:26
+    11   toString at line-column-numbers.js:109:26
+    12   toString at line-column-numbers.js:109:26
+    13   toString at line-column-numbers.js:109:26
+    14   toString at line-column-numbers.js:109:26
+    15   toString at line-column-numbers.js:109:26
+    16   toString at line-column-numbers.js:109:26
+    17   toString at line-column-numbers.js:109:26
+    18   toString at line-column-numbers.js:109:26
+    19   toString at line-column-numbers.js:109:26
+
+--> Case 20 Stack Trace:
+    0   g at line-column-numbers.js:127:17
+    1   g at line-column-numbers.js:127:30
+    2   g at line-column-numbers.js:127:30
+    3   g at line-column-numbers.js:127:30
+    4   g at line-column-numbers.js:127:30
+    5   g at line-column-numbers.js:127:30
+    6   g at line-column-numbers.js:127:30
+    7   g at line-column-numbers.js:127:30
+    8   g at line-column-numbers.js:127:30
+    9   g at line-column-numbers.js:127:30
+    10   g at line-column-numbers.js:127:30
+    11   g at line-column-numbers.js:127:30
+    12   g at line-column-numbers.js:127:30
+    13   g at line-column-numbers.js:127:30
+    14   g at line-column-numbers.js:127:30
+    15   g at line-column-numbers.js:127:30
+    16   g at line-column-numbers.js:127:30
+    17   g at line-column-numbers.js:127:30
+    18   g at line-column-numbers.js:127:30
+    19   g at line-column-numbers.js:127:30
+
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/fast/js/line-column-numbers.html (153072 => 153073)


--- trunk/LayoutTests/fast/js/line-column-numbers.html	2013-07-24 00:53:57 UTC (rev 153072)
+++ trunk/LayoutTests/fast/js/line-column-numbers.html	2013-07-24 00:56:52 UTC (rev 153073)
@@ -21,7 +21,7 @@
 function printStack(stackTrace) {
     debug("--> Case " + testId + " Stack Trace:")
     stackTrace = stackTrace.split("\n");
-    var length = Math.min(stackTrace.length, 100);
+    var length = Math.min(stackTrace.length, 20);
     for (var i = 0; i < length; i++) {
         var indexOfAt = stackTrace[i].indexOf('@')
         var indexOfLastSlash = stackTrace[i].lastIndexOf('/');
@@ -161,6 +161,43 @@
 "");
 </script>
 
+<!-- Case 19: Binary op with type coersion on strcat. -->
+<script>testId++;</script>
+<script>
+try {
+    testObj19 = {
+        toString: function() {
+            var result = ("Hello " + "World") + this;
+            b = 5;
+            return result;
+        },
+        run: function() {
+            return testObj19.toString();
+        }
+    };
+    testObj19.run();
+} catch(e) {
+    printStack(e.stack);
+}
+</script>
+
+<!-- Case 20: BinaryOp with type coersion on comparison. -->
+<script>testId++;</script>
+<script>
+try {
+    function test20() {
+        var f = function g() {
+            if (this != 10) f();
+        };
+        var a = f();
+    }
+
+    test20();
+} catch(e) {
+    printStack(e.stack);
+}
+</script>
+
 <!-- Now do it all over with a loaded script file. -->
 <script>testId = 0;</script>
 	<script src=""

Modified: trunk/LayoutTests/fast/js/script-tests/line-column-numbers.js (153072 => 153073)


--- trunk/LayoutTests/fast/js/script-tests/line-column-numbers.js	2013-07-24 00:53:57 UTC (rev 153072)
+++ trunk/LayoutTests/fast/js/script-tests/line-column-numbers.js	2013-07-24 00:56:52 UTC (rev 153073)
@@ -101,4 +101,37 @@
 "}\n" +
 "");
 
+// Case 19: Binary op with type coersion on strcat.
+testId++;
+try {
+    testObj19b = {
+        toString: function() {
+            var result = ("Hello " + "World") + this;
+            b19 = 5;
+            return result;
+        },
+        run: function() {
+            return testObj19b.toString();
+        }
+    };
+    testObj19b.run();
+} catch(e) {
+    printStack(e.stack);
+}
+
+// Case 20: BinaryOp with type coersion on comparison.
+testId++;
+try {
+    function test20b() {
+        var f = function g() {
+            if (this != 10) f();
+        };
+        var a = f();
+    }
+
+    test20b();
+} catch(e) {
+    printStack(e.stack);
+}
+
 successfullyParsed = true;

Modified: trunk/Source/_javascript_Core/ChangeLog (153072 => 153073)


--- trunk/Source/_javascript_Core/ChangeLog	2013-07-24 00:53:57 UTC (rev 153072)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-07-24 00:56:52 UTC (rev 153073)
@@ -1,5 +1,20 @@
 2013-07-23  Mark Lam  <[email protected]>
 
+        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.
+
+        * 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.
+
+2013-07-23  Mark Lam  <[email protected]>
+
         Removed unused sourceOffset from JSTokenLocation.
         https://bugs.webkit.org/show_bug.cgi?id=118996.
 

Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (153072 => 153073)


--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2013-07-24 00:53:57 UTC (rev 153072)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp	2013-07-24 00:56:52 UTC (rev 153073)
@@ -1095,8 +1095,10 @@
 {
     OpcodeID opcodeID = this->opcodeID();
 
-    if (opcodeID == op_add && m_expr1->isAdd() && m_expr1->resultDescriptor().definitelyIsString())
+    if (opcodeID == op_add && m_expr1->isAdd() && m_expr1->resultDescriptor().definitelyIsString()) {
+        generator.emitExpressionInfo(startOffset(), 0, 0, lineNo(), lineStartOffset());
         return emitStrcat(generator, dst);
+    }
 
     if (opcodeID == op_neq) {
         if (m_expr1->isNull() || m_expr2->isNull()) {
@@ -1116,6 +1118,7 @@
     RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(left, m_rightHasAssignments, right->isPure(generator));
     bool wasTypeof = generator.m_lastOpcodeID == op_typeof;
     RegisterID* src2 = generator.emitNode(right);
+    generator.emitExpressionInfo(startOffset(), 0, 0, lineNo(), lineStartOffset());
     if (wasTypeof && (opcodeID == op_neq || opcodeID == op_nstricteq)) {
         RefPtr<RegisterID> tmp = generator.tempDestination(dst);
         if (opcodeID == op_neq)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to