v8/test/mjsunit/harmony/arrow-functions-this.js
wingo 66665ae727 Reapply "Resolve references to "this" the same way as normal variables""
This reapplies https://codereview.chromium.org/1136073002, along with
the followups:

  Remove Scope::scope_uses_this_ flag
  https://codereview.chromium.org/1128963005

and

  PPC: Resolve references to "this" the same way as normal variables
  https://codereview.chromium.org/1134073003

R=rossberg@chromium.org
LOG=N
BUG=

Review URL: https://codereview.chromium.org/1136883006

Cr-Commit-Position: refs/heads/master@{#28458}

Review URL: https://codereview.chromium.org/1140633003

Cr-Commit-Position: refs/heads/master@{#28484}
2015-05-19 14:50:59 +00:00

82 lines
3.0 KiB
JavaScript

// 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.
// Flags: --harmony-arrow-functions
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)()"));