30
30
// Check that %NewObjectFromBound works correctly when called from optimized
32
function foo(x, y, z) {
38
var foob = foo.bind({}, 1);
41
return %NewObjectFromBound(foob);
32
function foo1(x, y, z) {
38
function foo2(x, y, z) {
41
assertEquals(undefined, z);
44
function foo3(x, y, z) {
51
var foob1 = foo1.bind({}, 1);
52
var foob2 = foo2.bind({}, 1);
53
var foob3 = foo3.bind({}, 1);
57
return %NewObjectFromBound(foob1);
61
return %NewObjectFromBound(foob2);
65
return %NewObjectFromBound(foob3);
44
68
// Check that %NewObjectFromBound looks at correct frame for inlined function.
46
return f(y, z); /* f should be inlined into g, note rotated arguments */
70
return f1(y, z); /* f should be inlined into g, note rotated arguments */
73
function g2(z, y, x) {
74
return f2(y); /* f should be inlined into g, note argument count mismatch */
77
function g3(z, y, x) {
78
return f3(x, y, z); /* f should be inlined into g, note argument count mismatch */
49
81
// Check that %NewObjectFromBound looks at correct frame for inlined function.
52
var local_z = z2 >> 1;
54
var local_y = y2 >> 1;
56
return f(local_y, local_z); /* f should be inlined into h */
59
for (var i = 0; i < 5; i++) f(2, 3);
60
%OptimizeFunctionOnNextCall(f);
63
for (var i = 0; i < 5; i++) g(3, 2);
64
%OptimizeFunctionOnNextCall(g);
67
for (var i = 0; i < 5; i++) h(6, 4);
68
%OptimizeFunctionOnNextCall(h);
84
var local_z = z2 >> 1;
86
var local_y = y2 >> 1;
88
return f1(local_y, local_z); /* f should be inlined into h */
91
function h2(z2, y2, x2) {
92
var local_z = z2 >> 1;
94
var local_y = y2 >> 1;
96
return f2(local_y); /* f should be inlined into h */
99
function h3(z2, y2, x2) {
100
var local_z = z2 >> 1;
102
var local_y = y2 >> 1;
104
var local_x = x2 >> 1;
106
return f3(local_x, local_y, local_z); /* f should be inlined into h */
110
function invoke(f, args) {
111
for (var i = 0; i < 5; i++) f.apply(this, args);
112
%OptimizeFunctionOnNextCall(f);
118
invoke(f3, [2, 3, 4]);
120
invoke(g2, [3, 2, 4]);
121
invoke(g3, [4, 3, 2]);
123
invoke(h2, [6, 4, 8]);
124
invoke(h3, [8, 6, 4]);
71
126
// Check that %_IsConstructCall returns correct value when inlined
72
127
var NON_CONSTRUCT_MARKER = {};
73
128
var CONSTRUCT_MARKER = {};
75
130
return (!%_IsConstructCall()) ? NON_CONSTRUCT_MARKER : CONSTRUCT_MARKER;
78
133
function bar(x, y, z) {
134
var non_construct = baz(0); /* baz should be inlined */
135
assertEquals(non_construct, NON_CONSTRUCT_MARKER);
79
136
var non_construct = baz(); /* baz should be inlined */
80
137
assertEquals(non_construct, NON_CONSTRUCT_MARKER);
81
var construct = new baz();
138
var non_construct = baz(0, 0); /* baz should be inlined */
139
assertEquals(non_construct, NON_CONSTRUCT_MARKER);
140
var construct = new baz(0);
82
141
assertEquals(construct, CONSTRUCT_MARKER);
85
for (var i = 0; i < 5; i++) new bar(1, 2, 3);
86
%OptimizeFunctionOnNextCall(bar);
144
invoke(bar, [1, 2, 3]);