| Index: test/mjsunit/track-fields.js
|
| diff --git a/test/mjsunit/track-fields.js b/test/mjsunit/track-fields.js
|
| index ced2bb3b67bf85faf67f2b24bfb949d5738cef53..ed533e088670250b4174288228facdc2f421d7a7 100644
|
| --- a/test/mjsunit/track-fields.js
|
| +++ b/test/mjsunit/track-fields.js
|
| @@ -118,3 +118,69 @@ poly_load(of1, false);
|
| poly_load(of2, true);
|
| %OptimizeFunctionOnNextCall(poly_load);
|
| assertEquals("[object Object]10", poly_load(of1, true));
|
| +
|
| +// Ensure small object literals with doubles do not share double storage.
|
| +function object_literal() { return {"a":1.5}; }
|
| +var o8 = object_literal();
|
| +var o9 = object_literal();
|
| +o8.a = 4.6
|
| +assertEquals(1.5, o9.a);
|
| +
|
| +// Ensure double storage is not leaked in the case of polymorphic loads.
|
| +function load_poly(o) {
|
| + return o.a;
|
| +}
|
| +
|
| +var o10 = { "a": 1.6 };
|
| +var o11 = { "b": 1, "a": 1.7 };
|
| +load_poly(o10);
|
| +load_poly(o10);
|
| +load_poly(o11);
|
| +%OptimizeFunctionOnNextCall(load_poly);
|
| +var val = load_poly(o10);
|
| +o10.a = 19.5;
|
| +assertFalse(o10.a == val);
|
| +
|
| +// Ensure polymorphic loads only go monomorphic when the representations are
|
| +// compatible.
|
| +
|
| +// Check polymorphic load from double + object fields.
|
| +function load_mono(o) {
|
| + return o.a1;
|
| +}
|
| +
|
| +var object = {"x": 1};
|
| +var o10 = { "a1": 1.6 };
|
| +var o11 = { "a1": object, "b": 1 };
|
| +load_mono(o10);
|
| +load_mono(o10);
|
| +load_mono(o11);
|
| +%OptimizeFunctionOnNextCall(load_mono);
|
| +assertEquals(object, load_mono(o11));
|
| +
|
| +// Check polymorphic load from smi + object fields.
|
| +function load_mono2(o) {
|
| + return o.a2;
|
| +}
|
| +
|
| +var o12 = { "a2": 5 };
|
| +var o13 = { "a2": object, "b": 1 };
|
| +load_mono2(o12);
|
| +load_mono2(o12);
|
| +load_mono2(o13);
|
| +%OptimizeFunctionOnNextCall(load_mono2);
|
| +assertEquals(object, load_mono2(o13));
|
| +
|
| +// Check polymorphic load from double + double fields.
|
| +function load_mono3(o) {
|
| + return o.a3;
|
| +}
|
| +
|
| +var o14 = { "a3": 1.6 };
|
| +var o15 = { "a3": 1.8, "b": 1 };
|
| +load_mono3(o14);
|
| +load_mono3(o14);
|
| +load_mono3(o15);
|
| +%OptimizeFunctionOnNextCall(load_mono3);
|
| +assertEquals(1.6, load_mono3(o14));
|
| +assertEquals(1.8, load_mono3(o15));
|
|
|