mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-03 14:28:39 +09:00
Enable nursery strings fixes from 67. Still crashes.
Enable nursery strings fixes from 67. Still crashes.
This commit is contained in:
parent
58e3dd88fa
commit
6acf628a7b
13 changed files with 94 additions and 66 deletions
|
|
@ -1079,14 +1079,8 @@ EmitPostWriteBarrierS(MacroAssembler& masm,
|
|||
masm.bind(&exit);
|
||||
}
|
||||
|
||||
enum class FieldToBarrier {
|
||||
REGEXP_PENDING_INPUT,
|
||||
REGEXP_MATCHES_INPUT,
|
||||
DEPENDENT_STRING_BASE
|
||||
};
|
||||
|
||||
static void
|
||||
EmitStoreBufferMutation(MacroAssembler& masm, Register holder, FieldToBarrier field,
|
||||
EmitStoreBufferMutation(MacroAssembler& masm, Register holder, size_t offset,
|
||||
Register buffer,
|
||||
LiveGeneralRegisterSet& liveVolatiles,
|
||||
void (*fun)(js::gc::StoreBuffer*, js::gc::Cell**))
|
||||
|
|
@ -1105,19 +1099,7 @@ EmitStoreBufferMutation(MacroAssembler& masm, Register holder, FieldToBarrier fi
|
|||
regs.takeUnchecked(holder);
|
||||
Register addrReg = regs.takeAny();
|
||||
|
||||
switch (field) {
|
||||
case FieldToBarrier::REGEXP_PENDING_INPUT:
|
||||
masm.computeEffectiveAddress(Address(holder, RegExpStatics::offsetOfPendingInput()), addrReg);
|
||||
break;
|
||||
|
||||
case FieldToBarrier::REGEXP_MATCHES_INPUT:
|
||||
masm.computeEffectiveAddress(Address(holder, RegExpStatics::offsetOfMatchesInput()), addrReg);
|
||||
break;
|
||||
|
||||
case FieldToBarrier::DEPENDENT_STRING_BASE:
|
||||
masm.leaNewDependentStringBase(holder, addrReg);
|
||||
break;
|
||||
}
|
||||
masm.computeEffectiveAddress(Address(holder, offset), addrReg);
|
||||
|
||||
bool needExtraReg = !regs.empty();
|
||||
if (needExtraReg) {
|
||||
|
|
@ -1140,7 +1122,7 @@ EmitStoreBufferMutation(MacroAssembler& masm, Register holder, FieldToBarrier fi
|
|||
// Warning: this function modifies prev and next.
|
||||
static void
|
||||
EmitPostWriteBarrierS(MacroAssembler& masm,
|
||||
Register string, FieldToBarrier field,
|
||||
Register holder, size_t offset,
|
||||
Register prev, Register next,
|
||||
LiveGeneralRegisterSet& liveVolatiles)
|
||||
{
|
||||
|
|
@ -1160,7 +1142,7 @@ EmitPostWriteBarrierS(MacroAssembler& masm,
|
|||
|
||||
// buffer->putCell(cellp)
|
||||
masm.bind(&putCell);
|
||||
EmitStoreBufferMutation(masm, string, field, storebuffer, liveVolatiles,
|
||||
EmitStoreBufferMutation(masm, holder, offset, storebuffer, liveVolatiles,
|
||||
JSString::addCellAddressToStoreBuffer);
|
||||
masm.jump(&exit);
|
||||
|
||||
|
|
@ -1169,7 +1151,7 @@ EmitPostWriteBarrierS(MacroAssembler& masm,
|
|||
masm.branchPtr(Assembler::Equal, prev, ImmWord(0), &exit);
|
||||
masm.loadStoreBuffer(prev, storebuffer);
|
||||
masm.branchPtr(Assembler::Equal, storebuffer, ImmWord(0), &exit);
|
||||
EmitStoreBufferMutation(masm, string, field, storebuffer, liveVolatiles,
|
||||
EmitStoreBufferMutation(masm, holder, offset, storebuffer, liveVolatiles,
|
||||
JSString::removeCellAddressFromStoreBuffer);
|
||||
|
||||
masm.bind(&exit);
|
||||
|
|
@ -1216,6 +1198,7 @@ PrepareAndExecuteRegExp(JSContext* cx, MacroAssembler& masm, Register regexp, Re
|
|||
Register temp1, Register temp2, Register temp3,
|
||||
size_t inputOutputDataStartOffset,
|
||||
RegExpShared::CompilationMode mode,
|
||||
bool stringsCanBeInNursery,
|
||||
Label* notFound, Label* failure)
|
||||
{
|
||||
size_t matchPairsStartOffset = inputOutputDataStartOffset + sizeof(irregexp::InputOutputData);
|
||||
|
|
@ -1393,22 +1376,26 @@ PrepareAndExecuteRegExp(JSContext* cx, MacroAssembler& masm, Register regexp, Re
|
|||
masm.patchableCallPreBarrier(matchesInputAddress, MIRType::String);
|
||||
masm.patchableCallPreBarrier(lazySourceAddress, MIRType::String);
|
||||
|
||||
if (stringsCanBeInNursery) {
|
||||
// Writing into RegExpStatics tenured memory; must post-barrier.
|
||||
if (temp1.volatile_())
|
||||
volatileRegs.add(temp1);
|
||||
|
||||
if (temp1.volatile_())
|
||||
volatileRegs.add(temp1);
|
||||
masm.loadPtr(pendingInputAddress, temp2);
|
||||
masm.storePtr(input, pendingInputAddress);
|
||||
masm.movePtr(input, temp3);
|
||||
EmitPostWriteBarrierS(masm, temp1, RegExpStatics::offsetOfPendingInput(),
|
||||
temp2 /* prev */, temp3 /* next */, volatileRegs);
|
||||
|
||||
// Writing into RegExpStatics tenured memory; must post-barrier.
|
||||
masm.loadPtr(pendingInputAddress, temp2);
|
||||
masm.storePtr(input, pendingInputAddress);
|
||||
masm.movePtr(input, temp3);
|
||||
EmitPostWriteBarrierS(masm, temp1, FieldToBarrier::REGEXP_PENDING_INPUT,
|
||||
temp2 /* prev */, temp3 /* next */, volatileRegs);
|
||||
|
||||
masm.loadPtr(matchesInputAddress, temp2);
|
||||
masm.storePtr(input, matchesInputAddress);
|
||||
masm.movePtr(input, temp3);
|
||||
EmitPostWriteBarrierS(masm, temp1, FieldToBarrier::REGEXP_MATCHES_INPUT,
|
||||
temp2 /* prev */, temp3 /* next */, volatileRegs);
|
||||
masm.loadPtr(matchesInputAddress, temp2);
|
||||
masm.storePtr(input, matchesInputAddress);
|
||||
masm.movePtr(input, temp3);
|
||||
EmitPostWriteBarrierS(masm, temp1, RegExpStatics::offsetOfMatchesInput(),
|
||||
temp2 /* prev */, temp3 /* next */, volatileRegs);
|
||||
} else {
|
||||
masm.storePtr(input, pendingInputAddress);
|
||||
masm.storePtr(input, matchesInputAddress);
|
||||
}
|
||||
|
||||
masm.storePtr(lastIndex, Address(temp1, RegExpStatics::offsetOfLazyIndex()));
|
||||
masm.store32(Imm32(1), Address(temp1, RegExpStatics::offsetOfPendingLazyEvaluation()));
|
||||
|
|
@ -1449,6 +1436,7 @@ public:
|
|||
// Caller should call generateFallback after masm.ret(), to generate
|
||||
// fallback path.
|
||||
void generate(MacroAssembler& masm, const JSAtomState& names,
|
||||
CompileRuntime* runtime,
|
||||
bool latin1, Register string,
|
||||
Register base, Register temp1, Register temp2,
|
||||
BaseIndex startIndexAddress, BaseIndex limitIndexAddress,
|
||||
|
|
@ -1461,6 +1449,7 @@ public:
|
|||
|
||||
void
|
||||
CreateDependentString::generate(MacroAssembler& masm, const JSAtomState& names,
|
||||
CompileRuntime* runtime,
|
||||
bool latin1, Register string,
|
||||
Register base, Register temp1, Register temp2,
|
||||
BaseIndex startIndexAddress, BaseIndex limitIndexAddress,
|
||||
|
|
@ -1715,7 +1704,7 @@ JitCompartment::generateRegExpMatcherStub(JSContext* cx)
|
|||
Label notFound, oolEntry;
|
||||
if (!PrepareAndExecuteRegExp(cx, masm, regexp, input, lastIndex,
|
||||
temp1, temp2, temp5, inputOutputDataStartOffset,
|
||||
RegExpShared::Normal, ¬Found, &oolEntry))
|
||||
RegExpShared::Normal, stringsCanBeInNursery, ¬Found, &oolEntry))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
|
@ -1813,7 +1802,9 @@ JitCompartment::generateRegExpMatcherStub(JSContext* cx)
|
|||
Label isUndefined, storeDone;
|
||||
masm.branch32(Assembler::LessThan, stringIndexAddress, Imm32(0), &isUndefined);
|
||||
|
||||
depStr[isLatin].generate(masm, cx->names(), isLatin, temp3, input, temp4, temp5,
|
||||
depStr[isLatin].generate(masm, cx->names(),
|
||||
CompileRuntime::get(cx->runtime()),
|
||||
isLatin, temp3, input, temp4, temp5,
|
||||
stringIndexAddress, stringLimitAddress, stringsCanBeInNursery, failure);
|
||||
|
||||
masm.storeValue(JSVAL_TYPE_STRING, temp3, stringAddress);
|
||||
|
|
@ -2030,7 +2021,8 @@ JitCompartment::generateRegExpSearcherStub(JSContext* cx)
|
|||
Label notFound, oolEntry;
|
||||
if (!PrepareAndExecuteRegExp(cx, masm, regexp, input, lastIndex,
|
||||
temp1, temp2, temp3, inputOutputDataStartOffset,
|
||||
RegExpShared::Normal, ¬Found, &oolEntry))
|
||||
RegExpShared::Normal, stringsCanBeInNursery,
|
||||
¬Found, &oolEntry))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
|
@ -2181,7 +2173,8 @@ JitCompartment::generateRegExpTesterStub(JSContext* cx)
|
|||
Label notFound, oolEntry;
|
||||
if (!PrepareAndExecuteRegExp(cx, masm, regexp, input, lastIndex,
|
||||
temp1, temp2, temp3, 0,
|
||||
RegExpShared::MatchOnly, ¬Found, &oolEntry))
|
||||
RegExpShared::MatchOnly, stringsCanBeInNursery,
|
||||
¬Found, &oolEntry))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
|
@ -3768,11 +3761,13 @@ EmitPostWriteBarrier(MacroAssembler& masm, Register objreg, JSObject* maybeConst
|
|||
Register runtimereg = regs.takeAny();
|
||||
masm.mov(ImmPtr(GetJitContext()->runtime), runtimereg);
|
||||
|
||||
void (*fun)(JSRuntime*, JSObject*) = isGlobal ? PostGlobalWriteBarrier : PostWriteBarrier;
|
||||
masm.setupUnalignedABICall(regs.takeAny());
|
||||
masm.passABIArg(runtimereg);
|
||||
masm.passABIArg(objreg);
|
||||
masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, fun));
|
||||
if (isGlobal)
|
||||
masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, PostGlobalWriteBarrier));
|
||||
else
|
||||
masm.callWithABI(JS_FUNC_TO_DATA_PTR(void*, PostWriteBarrier));
|
||||
|
||||
masm.bind(&exit);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue