| Index: test/mjsunit/compiler/receiver-conversion.js
|
| diff --git a/test/mjsunit/compiler/receiver-conversion.js b/test/mjsunit/compiler/receiver-conversion.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c3f807a422454057a1b1e394d093a58ac1946de1
|
| --- /dev/null
|
| +++ b/test/mjsunit/compiler/receiver-conversion.js
|
| @@ -0,0 +1,128 @@
|
| +// 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: --allow-natives-syntax
|
| +
|
| +// This test suite checks that the receiver value (i.e. the 'this' binding) is
|
| +// correctly converted even when the callee function is inlined. This behavior
|
| +// is specified by ES6, section 9.2.1.2 "OrdinaryCallBindThis".
|
| +
|
| +var global = this;
|
| +function test(outer, inner, check) {
|
| + check(outer());
|
| + check(outer());
|
| + %OptimizeFunctionOnNextCall(outer);
|
| + check(outer());
|
| +}
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Test undefined in sloppy mode.
|
| +(function UndefinedSloppy() {
|
| + function check(x) {
|
| + assertEquals("object", typeof x);
|
| + assertSame(global, x);
|
| + }
|
| + function inner(x) {
|
| + return this;
|
| + }
|
| + function outer() {
|
| + return sloppy();
|
| + }
|
| + global.sloppy = inner;
|
| + test(outer, inner, check);
|
| +})();
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Test undefined in strict mode.
|
| +(function UndefinedStrict() {
|
| + function check(x) {
|
| + assertEquals("undefined", typeof x);
|
| + assertSame(undefined, x);
|
| + }
|
| + function inner(x) {
|
| + "use strict";
|
| + return this;
|
| + }
|
| + function outer() {
|
| + return strict();
|
| + }
|
| + global.strict = inner;
|
| + test(outer, inner, check);
|
| +})();
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Test primitive number in sloppy mode.
|
| +(function NumberSloppy() {
|
| + function check(x) {
|
| + assertEquals("object", typeof x);
|
| + assertInstanceof(x, Number);
|
| + }
|
| + function inner(x) {
|
| + return this;
|
| + }
|
| + function outer() {
|
| + return (0).sloppy();
|
| + }
|
| + Number.prototype.sloppy = inner;
|
| + test(outer, inner, check);
|
| +})();
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Test primitive number in strict mode.
|
| +(function NumberStrict() {
|
| + function check(x) {
|
| + assertEquals("number", typeof x);
|
| + assertSame(0, x);
|
| + }
|
| + function inner(x) {
|
| + "use strict";
|
| + return this;
|
| + }
|
| + function outer() {
|
| + return (0).strict();
|
| + }
|
| + Number.prototype.strict = inner;
|
| + test(outer, inner, check);
|
| +})();
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Test primitive string in sloppy mode.
|
| +(function StringSloppy() {
|
| + function check(x) {
|
| + assertEquals("object", typeof x);
|
| + assertInstanceof(x, String);
|
| + }
|
| + function inner(x) {
|
| + return this;
|
| + }
|
| + function outer() {
|
| + return ("s").sloppy();
|
| + }
|
| + String.prototype.sloppy = inner;
|
| + test(outer, inner, check);
|
| +})();
|
| +
|
| +
|
| +// -----------------------------------------------------------------------------
|
| +// Test primitive string in strict mode.
|
| +(function StringStrict() {
|
| + function check(x) {
|
| + assertEquals("string", typeof x);
|
| + assertSame("s", x);
|
| + }
|
| + function inner(x) {
|
| + "use strict";
|
| + return this;
|
| + }
|
| + function outer() {
|
| + return ("s").strict();
|
| + }
|
| + String.prototype.strict = inner;
|
| + test(outer, inner, check);
|
| +})();
|
|
|