| Index: test/mjsunit/compiler/inline-construct.js
|
| diff --git a/test/mjsunit/compiler/inline-construct.js b/test/mjsunit/compiler/inline-construct.js
|
| index f73e8910ad17558197cf406968eb7cb64bd79391..fa784cfc99e21c7c4b51c5797a2cfe7d68ab98eb 100644
|
| --- a/test/mjsunit/compiler/inline-construct.js
|
| +++ b/test/mjsunit/compiler/inline-construct.js
|
| @@ -32,43 +32,46 @@
|
| function TestInlinedConstructor(constructor, closure) {
|
| var result;
|
| var counter = { value:0 };
|
| + var noDeopt = { deopt:0 };
|
| + var forceDeopt = { /*empty*/ };
|
|
|
| - result = closure(constructor, 11, 12, counter);
|
| - assertEquals(23, result);
|
| + result = closure(constructor, 11, noDeopt, counter);
|
| + assertEquals(11, result);
|
| assertEquals(1, counter.value);
|
|
|
| - result = closure(constructor, 23, 19, counter);
|
| - assertEquals(42, result);
|
| + result = closure(constructor, 23, noDeopt, counter);
|
| + assertEquals(23, result);
|
| assertEquals(2, counter.value);
|
|
|
| %OptimizeFunctionOnNextCall(closure);
|
| - result = closure(constructor, 1, 42, counter);
|
| - assertEquals(43, result);
|
| + result = closure(constructor, 42, noDeopt, counter);
|
| + assertEquals(42, result);
|
| assertEquals(3, counter.value);
|
|
|
| - result = closure(constructor, "foo", "bar", counter);
|
| - assertEquals("foobar", result)
|
| + result = closure(constructor, 127, forceDeopt, counter);
|
| + assertEquals(127, result)
|
| assertEquals(4, counter.value);
|
|
|
| %DeoptimizeFunction(closure);
|
| %ClearFunctionTypeFeedback(closure);
|
| + %ClearFunctionTypeFeedback(constructor);
|
| }
|
|
|
| -function value_context(constructor, a, b, counter) {
|
| - var obj = new constructor(a, b, counter);
|
| +function value_context(constructor, val, deopt, counter) {
|
| + var obj = new constructor(val, deopt, counter);
|
| return obj.x;
|
| }
|
|
|
| -function test_context(constructor, a, b, counter) {
|
| - if (!new constructor(a, b, counter)) {
|
| +function test_context(constructor, val, deopt, counter) {
|
| + if (!new constructor(val, deopt, counter)) {
|
| assertUnreachable("should not happen");
|
| }
|
| - return a + b;
|
| + return val;
|
| }
|
|
|
| -function effect_context(constructor, a, b, counter) {
|
| - new constructor(a, b, counter);
|
| - return a + b;
|
| +function effect_context(constructor, val, deopt, counter) {
|
| + new constructor(val, deopt, counter);
|
| + return val;
|
| }
|
|
|
| function TestInAllContexts(constructor) {
|
| @@ -79,17 +82,19 @@ function TestInAllContexts(constructor) {
|
|
|
|
|
| // Test constructor returning nothing in all contexts.
|
| -function c1(a, b, counter) {
|
| - this.x = a + b;
|
| +function c1(val, deopt, counter) {
|
| + deopt.deopt;
|
| + this.x = val;
|
| counter.value++;
|
| }
|
| TestInAllContexts(c1);
|
|
|
|
|
| // Test constructor returning an object in all contexts.
|
| -function c2(a, b, counter) {
|
| +function c2(val, deopt, counter) {
|
| var obj = {};
|
| - obj.x = a + b;
|
| + deopt.deopt;
|
| + obj.x = val;
|
| counter.value++;
|
| return obj;
|
| }
|
| @@ -97,8 +102,9 @@ TestInAllContexts(c2);
|
|
|
|
|
| // Test constructor returning a primitive value in all contexts.
|
| -function c3(a, b, counter) {
|
| - this.x = a + b;
|
| +function c3(val, deopt, counter) {
|
| + deopt.deopt;
|
| + this.x = val;
|
| counter.value++;
|
| return "not an object";
|
| }
|
| @@ -137,9 +143,10 @@ assertEquals("foo1", f_too_few("foo"))
|
|
|
|
|
| // Test constructor that cannot be inlined.
|
| -function c_unsupported_syntax(a, b, counter) {
|
| +function c_unsupported_syntax(val, deopt, counter) {
|
| try {
|
| - this.x = a + b;
|
| + deopt.deopt;
|
| + this.x = val;
|
| counter.value++;
|
| } catch(e) {
|
| throw new Error();
|
| @@ -150,9 +157,10 @@ TestInAllContexts(c_unsupported_syntax);
|
|
|
| // Regression test: Inlined constructors called as functions do not get their
|
| // implicit receiver object set to undefined, even in strict mode.
|
| -function c_strict(a, b, counter) {
|
| +function c_strict(val, deopt, counter) {
|
| "use strict";
|
| - this.x = a + b;
|
| + deopt.deopt;
|
| + this.x = val;
|
| counter.value++;
|
| }
|
| TestInAllContexts(c_strict);
|
|
|