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)); |