| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| var object = {}; |
| var global = this; |
| var call = Function.call.bind(Function.call); |
| |
| var globalSloppyArrow = () => this; |
| var globalStrictArrow = () => { "use strict"; return this; }; |
| var globalSloppyArrowEval = (s) => eval(s); |
| var globalStrictArrowEval = (s) => { "use strict"; return eval(s); }; |
| |
| var sloppyFunctionArrow = function() { |
| return (() => this)(); |
| }; |
| var strictFunctionArrow = function() { |
| "use strict"; |
| return (() => this)(); |
| }; |
| var sloppyFunctionEvalArrow = function() { |
| return eval("(() => this)()"); |
| }; |
| var strictFunctionEvalArrow = function() { |
| "use strict"; |
| return eval("(() => this)()"); |
| }; |
| var sloppyFunctionArrowEval = function(s) { |
| return (() => eval(s))(); |
| }; |
| var strictFunctionArrowEval = function(s) { |
| "use strict"; |
| return (() => eval(s))(); |
| }; |
| |
| var withObject = { 'this': object } |
| var arrowInsideWith, arrowInsideWithEval; |
| with (withObject) { |
| arrowInsideWith = () => this; |
| arrowInsideWithEval = (s) => eval(s); |
| } |
| |
| assertEquals(global, call(globalSloppyArrow, object)); |
| assertEquals(global, call(globalStrictArrow, object)); |
| assertEquals(global, call(globalSloppyArrowEval, object, "this")); |
| assertEquals(global, call(globalStrictArrowEval, object, "this")); |
| assertEquals(global, call(globalSloppyArrowEval, object, "(() => this)()")); |
| assertEquals(global, call(globalStrictArrowEval, object, "(() => this)()")); |
| |
| assertEquals(object, call(sloppyFunctionArrow, object)); |
| assertEquals(global, call(sloppyFunctionArrow, undefined)); |
| assertEquals(object, call(strictFunctionArrow, object)); |
| assertEquals(undefined, call(strictFunctionArrow, undefined)); |
| |
| assertEquals(object, call(sloppyFunctionEvalArrow, object)); |
| assertEquals(global, call(sloppyFunctionEvalArrow, undefined)); |
| assertEquals(object, call(strictFunctionEvalArrow, object)); |
| assertEquals(undefined, call(strictFunctionEvalArrow, undefined)); |
| |
| assertEquals(object, call(sloppyFunctionArrowEval, object, "this")); |
| assertEquals(global, call(sloppyFunctionArrowEval, undefined, "this")); |
| assertEquals(object, call(strictFunctionArrowEval, object, "this")); |
| assertEquals(undefined, call(strictFunctionArrowEval, undefined, "this")); |
| |
| assertEquals(object, |
| call(sloppyFunctionArrowEval, object, "(() => this)()")); |
| assertEquals(global, |
| call(sloppyFunctionArrowEval, undefined, "(() => this)()")); |
| assertEquals(object, |
| call(strictFunctionArrowEval, object, "(() => this)()")); |
| assertEquals(undefined, |
| call(strictFunctionArrowEval, undefined, "(() => this)()")); |
| |
| assertEquals(global, call(arrowInsideWith, undefined)); |
| assertEquals(global, call(arrowInsideWith, object)); |
| assertEquals(global, call(arrowInsideWithEval, undefined, "this")); |
| assertEquals(global, call(arrowInsideWithEval, object, "this")); |
| assertEquals(global, call(arrowInsideWithEval, undefined, "(() => this)()")); |
| assertEquals(global, call(arrowInsideWithEval, object, "(() => this)()")); |