Bug 1401014 - Fix resume point in IonBuilder::setPropTryInlineAccess draft
authorTed Campbell <tcampbell@mozilla.com>
Wed, 20 Sep 2017 00:50:20 -0400
changeset 667483 1cb0704c0d52849406b47760c8a519ceec75e79c
parent 665900 27e7b4261e4b5a016e09adb5332a181e43ab520e
child 732397 06b1f2267619860b8c17e42782bc6b5bb7a2eb39
push id80724
push userbmo:tcampbell@mozilla.com
push dateWed, 20 Sep 2017 04:52:59 +0000
bugs1401014
milestone57.0a1
Bug 1401014 - Fix resume point in IonBuilder::setPropTryInlineAccess MozReview-Commit-ID: L5VpnS41tiH
js/src/jit-test/tests/ion/bug1401014.js
js/src/jit/IonBuilder.cpp
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/ion/bug1401014.js
@@ -0,0 +1,52 @@
+// Prevent optimizing top-level
+with ({}) { }
+
+
+// Unboxed object constructor candidate
+function Thing() {
+    this.a = {};    // Object || null
+    this.b = {};    // Object || null
+}
+
+(new Thing());
+(new Thing()).a = null;
+(new Thing()).b = null;
+
+
+var arr = new Array(1000);
+arr[0];
+
+var ctx = new Thing();
+
+function funPsh(t, x) {
+    t.a = x;
+}
+
+function funBug(t, i) {
+    t.b = t.a;      // GETPROP t.a
+    t.a = null;     // SETPROP t.a
+    arr[i] = 0;     // Bailout on uninitialized elements
+    return t.b;
+}
+
+// Ion compile
+for (var i = 0; i < 20000; ++i) {
+    funBug(ctx, 0);
+    funPsh(ctx, {});
+}
+
+// Invalidate
+let tmp = { a: null, b: {} };
+funBug(tmp, 0);
+
+// Ion compile
+for (var i = 0; i < 20000; ++i) {
+    funBug(ctx, 0);
+    funPsh(ctx, {});
+}
+
+// Trigger bailout
+let res = funBug(ctx, 500);
+
+// Result should not be clobbered by |t.a = null|
+assertEq(res === null, false);
--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -12023,20 +12023,22 @@ IonBuilder::setPropTryInlineAccess(bool*
             return Ok();
 
         obj = addGroupGuard(obj, group, Bailout_ShapeGuard);
 
         if (needsPostBarrier(value))
             current->add(MPostWriteBarrier::New(alloc(), obj, value));
 
         const UnboxedLayout::Property* property = group->unboxedLayout().lookup(name);
-        storeUnboxedProperty(obj, property->offset, property->type, value);
+        MInstruction* store = storeUnboxedProperty(obj, property->offset, property->type, value);
 
         current->push(value);
 
+        MOZ_TRY(resumeAfter(store));
+
         trackOptimizationOutcome(TrackedOutcome::Monomorphic);
         *emitted = true;
         return Ok();
     }
 
     MOZ_ASSERT(receivers.length() > 1);
     spew("Inlining polymorphic SETPROP");