Bug 1801985: Generate postbarrier in ObjectToIterator r=jandem

Differential Revision: https://phabricator.services.mozilla.com/D167340
This commit is contained in:
Iain Ireland 2023-01-24 16:48:15 +00:00
parent 69fee90fda
commit 02aa0faaee
2 changed files with 19 additions and 5 deletions

View file

@ -14063,13 +14063,30 @@ void CodeGenerator::visitObjectToIterator(LObjectToIterator* lir) {
masm.storePtr(
obj, Address(nativeIter, NativeIterator::offsetOfObjectBeingIterated()));
masm.or32(Imm32(NativeIterator::Flags::Active), iterFlagsAddr);
// The postbarrier for |objectBeingIterated| is generated separately by the
// transpiler.
Register enumeratorsAddr = temp2;
masm.movePtr(ImmPtr(lir->mir()->enumeratorsAddr()), enumeratorsAddr);
masm.registerIterator(enumeratorsAddr, nativeIter, temp3);
// Generate post-write barrier for storing to |iterObj->objectBeingIterated_|.
// We already know that |iterObj| is tenured, so we only have to check |obj|.
Label skipBarrier;
masm.branchPtrInNurseryChunk(Assembler::NotEqual, obj, temp2, &skipBarrier);
{
LiveRegisterSet save = liveVolatileRegs(lir);
save.takeUnchecked(temp);
save.takeUnchecked(temp2);
save.takeUnchecked(temp3);
if (iterObj.volatile_()) {
save.addUnchecked(iterObj);
}
masm.PushRegsInMask(save);
emitPostWriteBarrier(iterObj);
masm.PopRegsInMask(save);
}
masm.bind(&skipBarrier);
masm.bind(ool->rejoin());
}

View file

@ -743,9 +743,6 @@ bool WarpCacheIRTranspiler::emitObjectToIteratorResult(
return false;
}
auto* barrier = MPostWriteBarrier::New(alloc(), ins, obj);
add(barrier);
return true;
}