| // Copyright (C) 2018 Igalia, S.L. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| /*--- |
| esid: sec-addition-operator-plus-runtime-semantics-evaluation |
| description: Type coercion order of operations for addition operator |
| features: [Symbol] |
| info: | |
| Evaluate lhs |
| Evaluate rhs |
| ToPrimitive(lhs) |
| ToPrimitive(rhs) |
| ToNumeric(lhs) |
| ToNumeric(rhs) |
| ---*/ |
| |
| function MyError() {} |
| var trace; |
| |
| // ?GetValue(lhs) throws. |
| trace = ""; |
| assert.throws(MyError, function() { |
| (function() { |
| trace += "1"; |
| throw new MyError(); |
| })() + (function() { |
| trace += "2"; |
| throw new Test262Error("should not be evaluated"); |
| })(); |
| }, "?GetValue(lhs) throws."); |
| assert.sameValue(trace, "1", "?GetValue(lhs) throws."); |
| |
| // ?GetValue(rhs) throws. |
| trace = ""; |
| assert.throws(MyError, function() { |
| (function() { |
| trace += "1"; |
| return { |
| valueOf: function() { |
| trace += "3"; |
| throw new Test262Error("should not be evaluated"); |
| } |
| }; |
| })() + (function() { |
| trace += "2"; |
| throw new MyError(); |
| })(); |
| }, "?GetValue(rhs) throws."); |
| assert.sameValue(trace, "12", "?GetValue(rhs) throws."); |
| |
| // ?ToPrimive(lhs) throws. |
| trace = ""; |
| assert.throws(MyError, function() { |
| (function() { |
| trace += "1"; |
| return { |
| valueOf: function() { |
| trace += "3"; |
| throw new MyError(); |
| } |
| }; |
| })() + (function() { |
| trace += "2"; |
| return { |
| valueOf: function() { |
| trace += "4"; |
| throw new Test262Error("should not be evaluated"); |
| } |
| }; |
| })(); |
| }, "?ToPrimive(lhs) throws."); |
| assert.sameValue(trace, "123", "?ToPrimive(lhs) throws."); |
| |
| // ?ToPrimive(rhs) throws. |
| trace = ""; |
| assert.throws(MyError, function() { |
| (function() { |
| trace += "1"; |
| return { |
| valueOf: function() { |
| trace += "3"; |
| return 1; |
| } |
| }; |
| })() + (function() { |
| trace += "2"; |
| return { |
| valueOf: function() { |
| trace += "4"; |
| throw new MyError(); |
| } |
| }; |
| })(); |
| }, "?ToPrimive(rhs) throws."); |
| assert.sameValue(trace, "1234", "?ToPrimive(rhs) throws."); |
| |
| // ?ToPrimive(rhs) is called before ?ToNumeric(lhs). |
| trace = ""; |
| assert.throws(MyError, function() { |
| (function() { |
| trace += "1"; |
| return { |
| valueOf: function() { |
| trace += "3"; |
| return Symbol("1"); |
| } |
| }; |
| })() + (function() { |
| trace += "2"; |
| return { |
| valueOf: function() { |
| trace += "4"; |
| throw new MyError(); |
| } |
| }; |
| })(); |
| }, "?ToPrimive(rhs) is called before ?ToNumeric(lhs)."); |
| assert.sameValue(trace, "1234", "?ToPrimive(rhs) is called before ?ToNumeric(lhs)."); |
| |
| // GetValue(lhs) throws. |
| trace = ""; |
| assert.throws(TypeError, function() { |
| (function() { |
| trace += "1"; |
| return { |
| valueOf: function() { |
| trace += "3"; |
| return 1; |
| } |
| }; |
| })() + (function() { |
| trace += "2"; |
| return { |
| valueOf: function() { |
| trace += "4"; |
| return Symbol("1"); |
| } |
| }; |
| })(); |
| }, "GetValue(lhs) throws."); |
| assert.sameValue(trace, "1234", "GetValue(lhs) throws."); |