@@ -383,6 +383,9 @@ Maybe<InlinableSetterData> FindInlinableSetterData(ICCacheIRStub* stub) {
383383 const CacheIRStubInfo* stubInfo = stub->stubInfo ();
384384 const uint8_t * stubData = stub->stubDataStart ();
385385
386+ ObjOperandId maybeCalleeOperand;
387+ uintptr_t maybeRawCallee = 0 ;
388+
386389 CacheIRReader reader (stubInfo);
387390 while (reader.more ()) {
388391 const uint8_t * opStart = reader.currentPosition ();
@@ -393,40 +396,51 @@ Maybe<InlinableSetterData> FindInlinableSetterData(ICCacheIRStub* stub) {
393396 mozilla::DebugOnly<const uint8_t *> argStart = reader.currentPosition ();
394397
395398 switch (op) {
399+ case CacheOp::LoadObject: {
400+ // If we load a constant object, remember it in case it's the callee.
401+ maybeCalleeOperand = reader.objOperandId ();
402+ uint32_t maybeCalleeOffset = reader.stubOffset ();
403+ maybeRawCallee = stubInfo->getStubRawWord (stubData, maybeCalleeOffset);
404+ break ;
405+ }
396406 case CacheOp::CallScriptedSetter: {
397- data.emplace ();
398- data->receiverOperand = reader.objOperandId ();
399-
400- uint32_t setterOffset = reader.stubOffset ();
401- uintptr_t rawTarget = stubInfo->getStubRawWord (stubData, setterOffset);
402- data->target = reinterpret_cast <JSFunction*>(rawTarget);
403-
404- data->rhsOperand = reader.valOperandId ();
405- data->sameRealm = reader.readBool ();
407+ ObjOperandId receiverOperand = reader.objOperandId ();
408+ ObjOperandId calleeOperand = reader.objOperandId ();
409+ ValOperandId rhsOperand = reader.valOperandId ();
410+ bool sameRealm = reader.readBool ();
406411 (void )reader.stubOffset (); // nargsAndFlags
407412
408- data->endOfSharedPrefix = opStart;
413+ if (maybeCalleeOperand == calleeOperand) {
414+ data.emplace ();
415+ data->target = reinterpret_cast <JSFunction*>(maybeRawCallee);
416+ data->receiverOperand = receiverOperand;
417+ data->calleeOperand = calleeOperand;
418+ data->rhsOperand = rhsOperand;
419+ data->sameRealm = sameRealm;
420+ data->endOfSharedPrefix = opStart;
421+ }
409422 break ;
410423 }
411424 case CacheOp::CallInlinedSetter: {
412- data.emplace ();
413- data->receiverOperand = reader.objOperandId ();
414-
415- uint32_t setterOffset = reader.stubOffset ();
416- uintptr_t rawTarget = stubInfo->getStubRawWord (stubData, setterOffset);
417- data->target = reinterpret_cast <JSFunction*>(rawTarget);
418-
419- data->rhsOperand = reader.valOperandId ();
420-
425+ ObjOperandId receiverOperand = reader.objOperandId ();
426+ ObjOperandId calleeOperand = reader.objOperandId ();
427+ ValOperandId rhsOperand = reader.valOperandId ();
421428 uint32_t icScriptOffset = reader.stubOffset ();
422429 uintptr_t rawICScript =
423430 stubInfo->getStubRawWord (stubData, icScriptOffset);
424- data->icScript = reinterpret_cast <ICScript*>(rawICScript);
425-
426- data->sameRealm = reader.readBool ();
431+ bool sameRealm = reader.readBool ();
427432 (void )reader.stubOffset (); // nargsAndFlags
428433
429- data->endOfSharedPrefix = opStart;
434+ if (maybeCalleeOperand == calleeOperand) {
435+ data.emplace ();
436+ data->target = reinterpret_cast <JSFunction*>(maybeRawCallee);
437+ data->receiverOperand = receiverOperand;
438+ data->calleeOperand = calleeOperand;
439+ data->rhsOperand = rhsOperand;
440+ data->icScript = reinterpret_cast <ICScript*>(rawICScript);
441+ data->sameRealm = sameRealm;
442+ data->endOfSharedPrefix = opStart;
443+ }
430444 break ;
431445 }
432446 default :
@@ -886,8 +900,9 @@ bool TrialInliner::maybeInlineSetter(ICEntry& entry, ICFallbackStub* fallback,
886900 ValOperandId rhsValId (writer.setInputOperandId (1 ));
887901 cloneSharedPrefix (stub, data->endOfSharedPrefix , writer);
888902
889- writer.callInlinedSetter (data->receiverOperand , data->target ,
890- data->rhsOperand , newICScript, data->sameRealm );
903+ writer.callInlinedSetter (data->receiverOperand , data->calleeOperand ,
904+ data->target , data->rhsOperand , newICScript,
905+ data->sameRealm );
891906 writer.returnFromIC ();
892907
893908 return replaceICStub (entry, fallback, writer, kind);
0 commit comments