Bug 1828496 - Replace PropertyName* with PropertyKey for megamorphic accessor ops r=iain

Differential Revision: https://phabricator.services.mozilla.com/D175678
This commit is contained in:
Doug Thayer 2023-04-27 18:10:05 +00:00
parent fbebb6e2ac
commit c860b29212
9 changed files with 50 additions and 60 deletions

View file

@ -138,8 +138,8 @@ namespace jit {
_(js::jit::GetContextSensitiveInterpreterStub) \ _(js::jit::GetContextSensitiveInterpreterStub) \
_(js::jit::GetIndexFromString) \ _(js::jit::GetIndexFromString) \
_(js::jit::GetInt32FromStringPure) \ _(js::jit::GetInt32FromStringPure) \
_(js::jit::GetNativeDataPropertyByIdPure) \ _(js::jit::GetNativeDataPropertyPure) \
_(js::jit::GetNativeDataPropertyByNamePure) \ _(js::jit::GetNativeDataPropertyPureWithCacheLookup) \
_(js::jit::GetNativeDataPropertyByValuePure) \ _(js::jit::GetNativeDataPropertyByValuePure) \
_(js::jit::GlobalHasLiveOnDebuggerStatement) \ _(js::jit::GlobalHasLiveOnDebuggerStatement) \
_(js::jit::HandleCodeCoverageAtPC) \ _(js::jit::HandleCodeCoverageAtPC) \

View file

@ -204,9 +204,6 @@ JSString* CacheIRCloner::getStringField(uint32_t stubOffset) {
JSAtom* CacheIRCloner::getAtomField(uint32_t stubOffset) { JSAtom* CacheIRCloner::getAtomField(uint32_t stubOffset) {
return reinterpret_cast<JSAtom*>(readStubWord(stubOffset)); return reinterpret_cast<JSAtom*>(readStubWord(stubOffset));
} }
PropertyName* CacheIRCloner::getPropertyNameField(uint32_t stubOffset) {
return reinterpret_cast<PropertyName*>(readStubWord(stubOffset));
}
JS::Symbol* CacheIRCloner::getSymbolField(uint32_t stubOffset) { JS::Symbol* CacheIRCloner::getSymbolField(uint32_t stubOffset) {
return reinterpret_cast<JS::Symbol*>(readStubWord(stubOffset)); return reinterpret_cast<JS::Symbol*>(readStubWord(stubOffset));
} }
@ -1055,7 +1052,7 @@ void GetPropIRGenerator::attachMegamorphicNativeSlot(ObjOperandId objId,
if (cacheKind_ == CacheKind::GetProp || if (cacheKind_ == CacheKind::GetProp ||
cacheKind_ == CacheKind::GetPropSuper) { cacheKind_ == CacheKind::GetPropSuper) {
writer.megamorphicLoadSlotResult(objId, id.toAtom()->asPropertyName()); writer.megamorphicLoadSlotResult(objId, id);
} else { } else {
MOZ_ASSERT(cacheKind_ == CacheKind::GetElem || MOZ_ASSERT(cacheKind_ == CacheKind::GetElem ||
cacheKind_ == CacheKind::GetElemSuper); cacheKind_ == CacheKind::GetElemSuper);
@ -3052,8 +3049,7 @@ AttachDecision GetNameIRGenerator::tryAttachGlobalNameValue(ObjOperandId objId,
globalLexical->global().addressOfGenerationCount()); globalLexical->global().addressOfGenerationCount());
ObjOperandId holderId = writer.loadObject(holder); ObjOperandId holderId = writer.loadObject(holder);
#ifdef DEBUG #ifdef DEBUG
writer.assertPropertyLookup(holderId, id.toAtom()->asPropertyName(), writer.assertPropertyLookup(holderId, id, prop->slot());
prop->slot());
#endif #endif
EmitLoadSlotResult(writer, holderId, holder, *prop); EmitLoadSlotResult(writer, holderId, holder, *prop);
} else { } else {
@ -4035,7 +4031,7 @@ AttachDecision SetPropIRGenerator::tryAttachNativeSetSlot(HandleObject obj,
// Don't attach a megamorphic store slot stub for ops like JSOp::InitElem. // Don't attach a megamorphic store slot stub for ops like JSOp::InitElem.
if (mode_ == ICState::Mode::Megamorphic && cacheKind_ == CacheKind::SetProp && if (mode_ == ICState::Mode::Megamorphic && cacheKind_ == CacheKind::SetProp &&
IsPropertySetOp(JSOp(*pc_))) { IsPropertySetOp(JSOp(*pc_))) {
writer.megamorphicStoreSlot(objId, id.toAtom()->asPropertyName(), rhsId); writer.megamorphicStoreSlot(objId, id, rhsId);
writer.returnFromIC(); writer.returnFromIC();
trackAttached("SetMegamorphicNativeSlot"); trackAttached("SetMegamorphicNativeSlot");
return AttachDecision::Attach; return AttachDecision::Attach;

View file

@ -32,7 +32,6 @@ namespace js {
class BaseScript; class BaseScript;
class GetterSetter; class GetterSetter;
class PropertyName;
class Shape; class Shape;
namespace gc { namespace gc {
@ -64,7 +63,6 @@ class MOZ_RAII CacheIRCloner {
JSObject* getObjectField(uint32_t stubOffset); JSObject* getObjectField(uint32_t stubOffset);
JSString* getStringField(uint32_t stubOffset); JSString* getStringField(uint32_t stubOffset);
JSAtom* getAtomField(uint32_t stubOffset); JSAtom* getAtomField(uint32_t stubOffset);
PropertyName* getPropertyNameField(uint32_t stubOffset);
JS::Symbol* getSymbolField(uint32_t stubOffset); JS::Symbol* getSymbolField(uint32_t stubOffset);
BaseScript* getBaseScriptField(uint32_t stubOffset); BaseScript* getBaseScriptField(uint32_t stubOffset);
uint32_t getRawInt32Field(uint32_t stubOffset); uint32_t getRawInt32Field(uint32_t stubOffset);

View file

@ -7508,14 +7508,14 @@ bool CacheIRCompiler::emitLoadInstanceOfObjectResult(ValOperandId lhsId,
} }
bool CacheIRCompiler::emitMegamorphicLoadSlotResult(ObjOperandId objId, bool CacheIRCompiler::emitMegamorphicLoadSlotResult(ObjOperandId objId,
uint32_t nameOffset) { uint32_t idOffset) {
JitSpew(JitSpew_Codegen, "%s", __FUNCTION__); JitSpew(JitSpew_Codegen, "%s", __FUNCTION__);
AutoOutputRegister output(*this); AutoOutputRegister output(*this);
Register obj = allocator.useRegister(masm, objId); Register obj = allocator.useRegister(masm, objId);
StubFieldOffset name(nameOffset, StubField::Type::String); StubFieldOffset id(idOffset, StubField::Type::Id);
AutoScratchRegisterMaybeOutput id(allocator, masm, output); AutoScratchRegisterMaybeOutput idReg(allocator, masm, output);
AutoScratchRegister scratch1(allocator, masm); AutoScratchRegister scratch1(allocator, masm);
AutoScratchRegister scratch2(allocator, masm); AutoScratchRegister scratch2(allocator, masm);
AutoScratchRegisterMaybeOutputType scratch3(allocator, masm, output); AutoScratchRegisterMaybeOutputType scratch3(allocator, masm, output);
@ -7530,8 +7530,8 @@ bool CacheIRCompiler::emitMegamorphicLoadSlotResult(ObjOperandId objId,
#else #else
Label cacheHit; Label cacheHit;
if (JitOptions.enableWatchtowerMegamorphic) { if (JitOptions.enableWatchtowerMegamorphic) {
emitLoadStubField(name, id); emitLoadStubField(id, idReg);
masm.emitMegamorphicCacheLookupByValue(id.get(), obj, scratch1, scratch2, masm.emitMegamorphicCacheLookupByValue(idReg.get(), obj, scratch1, scratch2,
scratch3, output.valueReg(), scratch3, output.valueReg(),
&cacheHit); &cacheHit);
} else { } else {
@ -7542,27 +7542,32 @@ bool CacheIRCompiler::emitMegamorphicLoadSlotResult(ObjOperandId objId,
masm.branchIfNonNativeObj(obj, scratch1, failure->label()); masm.branchIfNonNativeObj(obj, scratch1, failure->label());
masm.Push(UndefinedValue()); masm.Push(UndefinedValue());
masm.moveStackPtrTo(id.get()); masm.moveStackPtrTo(idReg.get());
LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(), LiveRegisterSet volatileRegs(GeneralRegisterSet::Volatile(),
liveVolatileFloatRegs()); liveVolatileFloatRegs());
volatileRegs.takeUnchecked(scratch1); volatileRegs.takeUnchecked(scratch1);
volatileRegs.takeUnchecked(scratch2); volatileRegs.takeUnchecked(scratch2);
volatileRegs.takeUnchecked(scratch3); volatileRegs.takeUnchecked(scratch3);
volatileRegs.takeUnchecked(id); volatileRegs.takeUnchecked(idReg);
masm.PushRegsInMask(volatileRegs); masm.PushRegsInMask(volatileRegs);
using Fn = bool (*)(JSContext * cx, JSObject * obj, PropertyName * name, using Fn = bool (*)(JSContext * cx, JSObject * obj, PropertyKey id,
MegamorphicCache::Entry * cacheEntry, Value * vp); MegamorphicCache::Entry * cacheEntry, Value * vp);
masm.setupUnalignedABICall(scratch1); masm.setupUnalignedABICall(scratch1);
masm.loadJSContext(scratch1); masm.loadJSContext(scratch1);
masm.passABIArg(scratch1); masm.passABIArg(scratch1);
masm.passABIArg(obj); masm.passABIArg(obj);
emitLoadStubField(name, scratch2); emitLoadStubField(id, scratch2);
masm.passABIArg(scratch2); masm.passABIArg(scratch2);
masm.passABIArg(scratch3); masm.passABIArg(scratch3);
masm.passABIArg(id); masm.passABIArg(idReg);
masm.callWithABI<Fn, GetNativeDataPropertyByNamePure>();
#ifdef JS_CODEGEN_X86
masm.callWithABI<Fn, GetNativeDataPropertyPureWithCacheLookup>();
#else
masm.callWithABI<Fn, GetNativeDataPropertyPure>();
#endif
masm.storeCallPointerResult(scratch2); masm.storeCallPointerResult(scratch2);
masm.PopRegsInMask(volatileRegs); masm.PopRegsInMask(volatileRegs);
@ -7579,11 +7584,11 @@ bool CacheIRCompiler::emitMegamorphicLoadSlotResult(ObjOperandId objId,
} }
bool CacheIRCompiler::emitMegamorphicStoreSlot(ObjOperandId objId, bool CacheIRCompiler::emitMegamorphicStoreSlot(ObjOperandId objId,
uint32_t nameOffset, uint32_t idOffset,
ValOperandId rhsId) { ValOperandId rhsId) {
JitSpew(JitSpew_Codegen, "%s", __FUNCTION__); JitSpew(JitSpew_Codegen, "%s", __FUNCTION__);
Register obj = allocator.useRegister(masm, objId); Register obj = allocator.useRegister(masm, objId);
StubFieldOffset name(nameOffset, StubField::Type::String); StubFieldOffset id(idOffset, StubField::Type::Id);
ValueOperand val = allocator.useValueRegister(masm, rhsId); ValueOperand val = allocator.useValueRegister(masm, rhsId);
AutoScratchRegister scratch1(allocator, masm); AutoScratchRegister scratch1(allocator, masm);
@ -7604,13 +7609,13 @@ bool CacheIRCompiler::emitMegamorphicStoreSlot(ObjOperandId objId,
volatileRegs.takeUnchecked(val); volatileRegs.takeUnchecked(val);
masm.PushRegsInMask(volatileRegs); masm.PushRegsInMask(volatileRegs);
using Fn = bool (*)(JSContext * cx, JSObject * obj, PropertyName * name, using Fn =
Value * val); bool (*)(JSContext * cx, JSObject * obj, PropertyKey id, Value * val);
masm.setupUnalignedABICall(scratch1); masm.setupUnalignedABICall(scratch1);
masm.loadJSContext(scratch1); masm.loadJSContext(scratch1);
masm.passABIArg(scratch1); masm.passABIArg(scratch1);
masm.passABIArg(obj); masm.passABIArg(obj);
emitLoadStubField(name, scratch2); emitLoadStubField(id, scratch2);
masm.passABIArg(scratch2); masm.passABIArg(scratch2);
masm.passABIArg(val.scratchReg()); masm.passABIArg(val.scratchReg());
masm.callWithABI<Fn, SetNativeDataPropertyPure>(); masm.callWithABI<Fn, SetNativeDataPropertyPure>();
@ -9294,7 +9299,7 @@ bool CacheIRCompiler::emitAssertPropertyLookup(ObjOperandId objId,
masm.setupUnalignedABICall(id); masm.setupUnalignedABICall(id);
StubFieldOffset idField(idOffset, StubField::Type::String); StubFieldOffset idField(idOffset, StubField::Type::Id);
emitLoadStubField(idField, id); emitLoadStubField(idField, id);
StubFieldOffset slotField(slotOffset, StubField::Type::RawInt32); StubFieldOffset slotField(slotOffset, StubField::Type::RawInt32);
@ -9303,7 +9308,7 @@ bool CacheIRCompiler::emitAssertPropertyLookup(ObjOperandId objId,
masm.passABIArg(obj); masm.passABIArg(obj);
masm.passABIArg(id); masm.passABIArg(id);
masm.passABIArg(slot); masm.passABIArg(slot);
using Fn = void (*)(NativeObject*, PropertyName*, uint32_t); using Fn = void (*)(NativeObject*, PropertyKey, uint32_t);
masm.callWithABI<Fn, js::jit::AssertPropertyLookup>(); masm.callWithABI<Fn, js::jit::AssertPropertyLookup>();
masm.PopRegsInMask(save); masm.PopRegsInMask(save);

View file

@ -798,7 +798,7 @@
cost_estimate: 4 cost_estimate: 4
args: args:
obj: ObjId obj: ObjId
name: PropertyNameField name: IdField
- name: MegamorphicLoadSlotByValueResult - name: MegamorphicLoadSlotByValueResult
shared: true shared: true
@ -814,7 +814,7 @@
cost_estimate: 4 cost_estimate: 4
args: args:
obj: ObjId obj: ObjId
name: PropertyNameField name: IdField
rhs: ValId rhs: ValId
- name: MegamorphicSetElement - name: MegamorphicSetElement
@ -3061,7 +3061,7 @@
cost_estimate: 4 cost_estimate: 4
args: args:
obj: ObjId obj: ObjId
id: PropertyNameField id: IdField
slot: RawInt32Field slot: RawInt32Field
#ifdef FUZZING_JS_FUZZILLI #ifdef FUZZING_JS_FUZZILLI

View file

@ -4239,7 +4239,7 @@ void CodeGenerator::visitMegamorphicLoadSlot(LMegamorphicLoadSlot* lir) {
masm.passABIArg(temp2); masm.passABIArg(temp2);
masm.passABIArg(temp3); masm.passABIArg(temp3);
masm.callWithABI<Fn, GetNativeDataPropertyByIdPure>(); masm.callWithABI<Fn, GetNativeDataPropertyPure>();
MOZ_ASSERT(!output.aliases(ReturnReg)); MOZ_ASSERT(!output.aliases(ReturnReg));
masm.Pop(output); masm.Pop(output);
@ -4313,7 +4313,7 @@ void CodeGenerator::visitMegamorphicStoreSlot(LMegamorphicStoreSlot* lir) {
masm.moveStackPtrTo(temp0); masm.moveStackPtrTo(temp0);
using Fn = using Fn =
bool (*)(JSContext* cx, JSObject* obj, PropertyName* name, Value* val); bool (*)(JSContext * cx, JSObject * obj, PropertyKey id, Value * val);
masm.setupAlignedABICall(); masm.setupAlignedABICall();
masm.loadJSContext(temp1); masm.loadJSContext(temp1);
masm.passABIArg(temp1); masm.passABIArg(temp1);

View file

@ -81,7 +81,6 @@ arg_writer_info = {
"ObjectField": ("JSObject*", "writeObjectField"), "ObjectField": ("JSObject*", "writeObjectField"),
"StringField": ("JSString*", "writeStringField"), "StringField": ("JSString*", "writeStringField"),
"AtomField": ("JSAtom*", "writeStringField"), "AtomField": ("JSAtom*", "writeStringField"),
"PropertyNameField": ("PropertyName*", "writeStringField"),
"SymbolField": ("JS::Symbol*", "writeSymbolField"), "SymbolField": ("JS::Symbol*", "writeSymbolField"),
"BaseScriptField": ("BaseScript*", "writeBaseScriptField"), "BaseScriptField": ("BaseScript*", "writeBaseScriptField"),
"RawInt32Field": ("uint32_t", "writeRawInt32Field"), "RawInt32Field": ("uint32_t", "writeRawInt32Field"),
@ -180,7 +179,6 @@ arg_reader_info = {
"ObjectField": ("uint32_t", "Offset", "reader.stubOffset()"), "ObjectField": ("uint32_t", "Offset", "reader.stubOffset()"),
"StringField": ("uint32_t", "Offset", "reader.stubOffset()"), "StringField": ("uint32_t", "Offset", "reader.stubOffset()"),
"AtomField": ("uint32_t", "Offset", "reader.stubOffset()"), "AtomField": ("uint32_t", "Offset", "reader.stubOffset()"),
"PropertyNameField": ("uint32_t", "Offset", "reader.stubOffset()"),
"SymbolField": ("uint32_t", "Offset", "reader.stubOffset()"), "SymbolField": ("uint32_t", "Offset", "reader.stubOffset()"),
"BaseScriptField": ("uint32_t", "Offset", "reader.stubOffset()"), "BaseScriptField": ("uint32_t", "Offset", "reader.stubOffset()"),
"RawInt32Field": ("uint32_t", "Offset", "reader.stubOffset()"), "RawInt32Field": ("uint32_t", "Offset", "reader.stubOffset()"),
@ -265,7 +263,6 @@ arg_spewer_method = {
"ObjectField": "spewField", "ObjectField": "spewField",
"StringField": "spewField", "StringField": "spewField",
"AtomField": "spewField", "AtomField": "spewField",
"PropertyNameField": "spewField",
"SymbolField": "spewField", "SymbolField": "spewField",
"BaseScriptField": "spewField", "BaseScriptField": "spewField",
"RawInt32Field": "spewField", "RawInt32Field": "spewField",
@ -401,7 +398,6 @@ arg_length = {
"ObjectField": 1, "ObjectField": 1,
"StringField": 1, "StringField": 1,
"AtomField": 1, "AtomField": 1,
"PropertyNameField": 1,
"SymbolField": 1, "SymbolField": 1,
"BaseScriptField": 1, "BaseScriptField": 1,
"RawInt32Field": 1, "RawInt32Field": 1,

View file

@ -1648,16 +1648,12 @@ static MOZ_ALWAYS_INLINE bool GetNativeDataPropertyPureImpl(
} }
} }
bool GetNativeDataPropertyByNamePure(JSContext* cx, JSObject* obj, bool GetNativeDataPropertyPureWithCacheLookup(JSContext* cx, JSObject* obj,
PropertyName* name, PropertyKey id,
MegamorphicCacheEntry* entry, Value* vp) { MegamorphicCacheEntry* entry,
Value* vp) {
AutoUnsafeCallWithABI unsafe; AutoUnsafeCallWithABI unsafe;
jsid id = NameToId(name);
#ifndef JS_CODEGEN_X86
MOZ_ASSERT_IF(JitOptions.enableWatchtowerMegamorphic, entry);
#else
// If we're on x86, we didn't have enough registers to populate this // If we're on x86, we didn't have enough registers to populate this
// directly in Baseline JITted code, so we do the lookup here. // directly in Baseline JITted code, so we do the lookup here.
if (JitOptions.enableWatchtowerMegamorphic) { if (JitOptions.enableWatchtowerMegamorphic) {
@ -1688,13 +1684,12 @@ bool GetNativeDataPropertyByNamePure(JSContext* cx, JSObject* obj,
MOZ_ASSERT(entry->isMissingOwnProperty()); MOZ_ASSERT(entry->isMissingOwnProperty());
} }
} }
#endif
return GetNativeDataPropertyPureImpl(cx, obj, id, entry, vp); return GetNativeDataPropertyPureImpl(cx, obj, id, entry, vp);
} }
bool GetNativeDataPropertyByIdPure(JSContext* cx, JSObject* obj, PropertyKey id, bool GetNativeDataPropertyPure(JSContext* cx, JSObject* obj, PropertyKey id,
MegamorphicCacheEntry* entry, Value* vp) { MegamorphicCacheEntry* entry, Value* vp) {
AutoUnsafeCallWithABI unsafe; AutoUnsafeCallWithABI unsafe;
MOZ_ASSERT_IF(JitOptions.enableWatchtowerMegamorphic, entry); MOZ_ASSERT_IF(JitOptions.enableWatchtowerMegamorphic, entry);
return GetNativeDataPropertyPureImpl(cx, obj, id, entry, vp); return GetNativeDataPropertyPureImpl(cx, obj, id, entry, vp);
@ -1758,7 +1753,7 @@ bool GetNativeDataPropertyByValuePure(JSContext* cx, JSObject* obj,
return GetNativeDataPropertyPureImpl(cx, obj, id, entry, res); return GetNativeDataPropertyPureImpl(cx, obj, id, entry, res);
} }
bool SetNativeDataPropertyPure(JSContext* cx, JSObject* obj, PropertyName* name, bool SetNativeDataPropertyPure(JSContext* cx, JSObject* obj, PropertyKey id,
Value* val) { Value* val) {
AutoUnsafeCallWithABI unsafe; AutoUnsafeCallWithABI unsafe;
@ -1768,7 +1763,7 @@ bool SetNativeDataPropertyPure(JSContext* cx, JSObject* obj, PropertyName* name,
NativeObject* nobj = &obj->as<NativeObject>(); NativeObject* nobj = &obj->as<NativeObject>();
uint32_t index; uint32_t index;
PropMap* map = nobj->shape()->lookup(cx, NameToId(name), &index); PropMap* map = nobj->shape()->lookup(cx, id, &index);
if (!map) { if (!map) {
return false; return false;
} }
@ -2879,7 +2874,7 @@ void AssertMapObjectHash(JSContext* cx, MapObject* obj, const Value* value,
MOZ_ASSERT(actualHash == HashValue(cx, obj->getData(), value)); MOZ_ASSERT(actualHash == HashValue(cx, obj->getData(), value));
} }
void AssertPropertyLookup(NativeObject* obj, PropertyName* id, uint32_t slot) { void AssertPropertyLookup(NativeObject* obj, PropertyKey id, uint32_t slot) {
AutoUnsafeCallWithABI unsafe; AutoUnsafeCallWithABI unsafe;
#ifdef DEBUG #ifdef DEBUG
mozilla::Maybe<PropertyInfo> prop = obj->lookupPure(id); mozilla::Maybe<PropertyInfo> prop = obj->lookupPure(id);

View file

@ -545,13 +545,13 @@ bool CallDOMSetter(JSContext* cx, const JSJitInfo* jitInfo, HandleObject obj,
void HandleCodeCoverageAtPC(BaselineFrame* frame, jsbytecode* pc); void HandleCodeCoverageAtPC(BaselineFrame* frame, jsbytecode* pc);
void HandleCodeCoverageAtPrologue(BaselineFrame* frame); void HandleCodeCoverageAtPrologue(BaselineFrame* frame);
bool GetNativeDataPropertyByNamePure(JSContext* cx, JSObject* obj, bool GetNativeDataPropertyPure(JSContext* cx, JSObject* obj, PropertyKey id,
PropertyName* name, MegamorphicCacheEntry* entry, Value* vp);
MegamorphicCacheEntry* entry, Value* vp);
bool GetNativeDataPropertyByIdPure(JSContext* cx, JSObject* obj, PropertyKey id, bool GetNativeDataPropertyPureWithCacheLookup(JSContext* cx, JSObject* obj,
MegamorphicCacheEntry* cacheEntry, PropertyKey id,
Value* vp); MegamorphicCacheEntry* entry,
Value* vp);
bool GetNativeDataPropertyByValuePure(JSContext* cx, JSObject* obj, bool GetNativeDataPropertyByValuePure(JSContext* cx, JSObject* obj,
MegamorphicCacheEntry* cacheEntry, MegamorphicCacheEntry* cacheEntry,
@ -564,7 +564,7 @@ bool HasNativeDataPropertyPure(JSContext* cx, JSObject* obj,
bool HasNativeElementPure(JSContext* cx, NativeObject* obj, int32_t index, bool HasNativeElementPure(JSContext* cx, NativeObject* obj, int32_t index,
Value* vp); Value* vp);
bool SetNativeDataPropertyPure(JSContext* cx, JSObject* obj, PropertyName* name, bool SetNativeDataPropertyPure(JSContext* cx, JSObject* obj, PropertyKey id,
Value* val); Value* val);
bool ObjectHasGetterSetterPure(JSContext* cx, JSObject* objArg, jsid id, bool ObjectHasGetterSetterPure(JSContext* cx, JSObject* objArg, jsid id,
@ -690,7 +690,7 @@ void AssertSetObjectHash(JSContext* cx, SetObject* obj, const Value* value,
void AssertMapObjectHash(JSContext* cx, MapObject* obj, const Value* value, void AssertMapObjectHash(JSContext* cx, MapObject* obj, const Value* value,
mozilla::HashNumber actualHash); mozilla::HashNumber actualHash);
void AssertPropertyLookup(NativeObject* obj, PropertyName* id, uint32_t slot); void AssertPropertyLookup(NativeObject* obj, PropertyKey id, uint32_t slot);
// Functions used when JS_MASM_VERBOSE is enabled. // Functions used when JS_MASM_VERBOSE is enabled.
void AssumeUnreachable(const char* output); void AssumeUnreachable(const char* output);