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