// 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) { %PrepareFunctionForOptimization(outer); 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); })();