blob: c3f807a422454057a1b1e394d093a58ac1946de1 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --allow-natives-syntax
6
7// This test suite checks that the receiver value (i.e. the 'this' binding) is
8// correctly converted even when the callee function is inlined. This behavior
9// is specified by ES6, section 9.2.1.2 "OrdinaryCallBindThis".
10
11var global = this;
12function test(outer, inner, check) {
13 check(outer());
14 check(outer());
15 %OptimizeFunctionOnNextCall(outer);
16 check(outer());
17}
18
19
20// -----------------------------------------------------------------------------
21// Test undefined in sloppy mode.
22(function UndefinedSloppy() {
23 function check(x) {
24 assertEquals("object", typeof x);
25 assertSame(global, x);
26 }
27 function inner(x) {
28 return this;
29 }
30 function outer() {
31 return sloppy();
32 }
33 global.sloppy = inner;
34 test(outer, inner, check);
35})();
36
37
38// -----------------------------------------------------------------------------
39// Test undefined in strict mode.
40(function UndefinedStrict() {
41 function check(x) {
42 assertEquals("undefined", typeof x);
43 assertSame(undefined, x);
44 }
45 function inner(x) {
46 "use strict";
47 return this;
48 }
49 function outer() {
50 return strict();
51 }
52 global.strict = inner;
53 test(outer, inner, check);
54})();
55
56
57// -----------------------------------------------------------------------------
58// Test primitive number in sloppy mode.
59(function NumberSloppy() {
60 function check(x) {
61 assertEquals("object", typeof x);
62 assertInstanceof(x, Number);
63 }
64 function inner(x) {
65 return this;
66 }
67 function outer() {
68 return (0).sloppy();
69 }
70 Number.prototype.sloppy = inner;
71 test(outer, inner, check);
72})();
73
74
75// -----------------------------------------------------------------------------
76// Test primitive number in strict mode.
77(function NumberStrict() {
78 function check(x) {
79 assertEquals("number", typeof x);
80 assertSame(0, x);
81 }
82 function inner(x) {
83 "use strict";
84 return this;
85 }
86 function outer() {
87 return (0).strict();
88 }
89 Number.prototype.strict = inner;
90 test(outer, inner, check);
91})();
92
93
94// -----------------------------------------------------------------------------
95// Test primitive string in sloppy mode.
96(function StringSloppy() {
97 function check(x) {
98 assertEquals("object", typeof x);
99 assertInstanceof(x, String);
100 }
101 function inner(x) {
102 return this;
103 }
104 function outer() {
105 return ("s").sloppy();
106 }
107 String.prototype.sloppy = inner;
108 test(outer, inner, check);
109})();
110
111
112// -----------------------------------------------------------------------------
113// Test primitive string in strict mode.
114(function StringStrict() {
115 function check(x) {
116 assertEquals("string", typeof x);
117 assertSame("s", x);
118 }
119 function inner(x) {
120 "use strict";
121 return this;
122 }
123 function outer() {
124 return ("s").strict();
125 }
126 String.prototype.strict = inner;
127 test(outer, inner, check);
128})();