| // 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); | |
| })(); |