| Index: test/mjsunit/compiler/inline-construct.js
|
| diff --git a/test/mjsunit/compiler/inline-construct.js b/test/mjsunit/compiler/inline-construct.js
|
| index 16e19a7d7c885e40b96bdce069bf2b3fbd2017ea..af9e69c94020e2ea44283e689d9dd0d0b4809223 100644
|
| --- a/test/mjsunit/compiler/inline-construct.js
|
| +++ b/test/mjsunit/compiler/inline-construct.js
|
| @@ -25,7 +25,7 @@
|
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
| -// Flags: --allow-natives-syntax --inline-construct
|
| +// Flags: --allow-natives-syntax --expose-gc --inline-construct
|
|
|
| // Test inlining of constructor calls.
|
|
|
| @@ -47,29 +47,37 @@ function TestInlinedConstructor(closure) {
|
| assertEquals(4, counter.value);
|
| }
|
|
|
| +function TestInAllContexts(constructor) {
|
| + function value_context(a, b, counter) {
|
| + var obj = new constructor(a, b, counter);
|
| + return obj.x;
|
| + }
|
| + function test_context(a, b, counter) {
|
| + if (!new constructor(a, b, counter)) {
|
| + assertUnreachable("should not happen");
|
| + }
|
| + return a + b;
|
| + }
|
| + function effect_context(a, b, counter) {
|
| + new constructor(a, b, counter);
|
| + return a + b;
|
| + }
|
| + TestInlinedConstructor(value_context);
|
| + TestInlinedConstructor(test_context);
|
| + TestInlinedConstructor(effect_context);
|
| + %DeoptimizeFunction(value_context);
|
| + %DeoptimizeFunction(test_context);
|
| + %DeoptimizeFunction(effect_context);
|
| + gc(); // Makes V8 forget about type information for *_context.
|
| +}
|
| +
|
|
|
| // Test constructor returning nothing in all contexts.
|
| function c1(a, b, counter) {
|
| this.x = a + b;
|
| counter.value++;
|
| }
|
| -function c1_value_context(a, b, counter) {
|
| - var obj = new c1(a, b, counter);
|
| - return obj.x;
|
| -}
|
| -function c1_test_context(a, b, counter) {
|
| - if (!new c1(a, b, counter)) {
|
| - assertUnreachable("should not happen");
|
| - }
|
| - return a + b;
|
| -}
|
| -function c1_effect_context(a, b, counter) {
|
| - new c1(a, b, counter);
|
| - return a + b;
|
| -}
|
| -TestInlinedConstructor(c1_value_context);
|
| -TestInlinedConstructor(c1_test_context);
|
| -TestInlinedConstructor(c1_effect_context);
|
| +TestInAllContexts(c1);
|
|
|
|
|
| // Test constructor returning an object in all contexts.
|
| @@ -79,23 +87,7 @@ function c2(a, b, counter) {
|
| counter.value++;
|
| return obj;
|
| }
|
| -function c2_value_context(a, b, counter) {
|
| - var obj = new c2(a, b, counter);
|
| - return obj.x;
|
| -}
|
| -function c2_test_context(a, b, counter) {
|
| - if (!new c2(a, b, counter)) {
|
| - assertUnreachable("should not happen");
|
| - }
|
| - return a + b;
|
| -}
|
| -function c2_effect_context(a, b, counter) {
|
| - new c2(a, b, counter);
|
| - return a + b;
|
| -}
|
| -TestInlinedConstructor(c2_value_context);
|
| -TestInlinedConstructor(c2_test_context);
|
| -TestInlinedConstructor(c2_effect_context);
|
| +TestInAllContexts(c2);
|
|
|
|
|
| // Test constructor returning a primitive value in all contexts.
|
| @@ -104,23 +96,7 @@ function c3(a, b, counter) {
|
| counter.value++;
|
| return "not an object";
|
| }
|
| -function c3_value_context(a, b, counter) {
|
| - var obj = new c3(a, b, counter);
|
| - return obj.x;
|
| -}
|
| -function c3_test_context(a, b, counter) {
|
| - if (!new c3(a, b, counter)) {
|
| - assertUnreachable("should not happen");
|
| - }
|
| - return a + b;
|
| -}
|
| -function c3_effect_context(a, b, counter) {
|
| - new c3(a, b, counter);
|
| - return a + b;
|
| -}
|
| -TestInlinedConstructor(c3_value_context);
|
| -TestInlinedConstructor(c3_test_context);
|
| -TestInlinedConstructor(c3_effect_context);
|
| +TestInAllContexts(c3);
|
|
|
|
|
| // Test constructor called with too many arguments.
|
| @@ -163,8 +139,14 @@ function c_unsupported_syntax(a, b, counter) {
|
| throw new Error();
|
| }
|
| }
|
| -function f_unsupported_syntax(a, b, counter) {
|
| - var obj = new c_unsupported_syntax(a, b, counter);
|
| - return obj.x;
|
| +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) {
|
| + "use strict";
|
| + this.x = a + b;
|
| + counter.value++;
|
| }
|
| -TestInlinedConstructor(f_unsupported_syntax);
|
| +TestInAllContexts(c_strict);
|
|
|