RawShape BaselineInspector::maybeMonomorphicShapeForPropertyOp(jsbytecode *pc) { if (!hasBaselineScript()) return NULL; JS_ASSERT(isValidPC(pc)); const ICEntry &entry = icEntryFromPC(pc); ICStub *stub = entry.firstStub(); ICStub *next = stub->next(); if (!next || !next->isFallback()) return NULL; if (stub->isGetProp_Native()) { JS_ASSERT(next->isGetProp_Fallback()); if (next->toGetProp_Fallback()->hadUnoptimizableAccess()) return NULL; return stub->toGetProp_Native()->shape(); } if (stub->isSetProp_Native()) { JS_ASSERT(next->isSetProp_Fallback()); if (next->toSetProp_Fallback()->hadUnoptimizableAccess()) return NULL; return stub->toSetProp_Native()->shape(); } return NULL; }
bool BaselineInspector::commonSetPropFunction( jsbytecode* pc, JSObject** holder, Shape** holderShape, JSFunction** commonSetter, bool* isOwnProperty, ReceiverVector& receivers, ObjectGroupVector& convertUnboxedGroups) { if (!hasICScript()) { return false; } MOZ_ASSERT(receivers.empty()); MOZ_ASSERT(convertUnboxedGroups.empty()); *commonSetter = nullptr; const ICEntry& entry = icEntryFromPC(pc); for (ICStub* stub = entry.firstStub(); stub; stub = stub->next()) { if (stub->isCacheIR_Updated()) { if (!AddCacheIRSetPropFunction(stub->toCacheIR_Updated(), holder, holderShape, commonSetter, isOwnProperty, receivers, convertUnboxedGroups)) { return false; } } else if (!stub->isFallback() || stub->toFallbackStub()->state().hasFailures()) { // We have an unoptimizable access, so don't try to optimize. return false; } } if (!*commonSetter) { return false; } MOZ_ASSERT(*isOwnProperty == !*holder); return true; }
bool BaselineInspector::megamorphicGetterSetterFunction( jsbytecode* pc, bool isGetter, JSFunction** getterOrSetter) { if (!hasICScript()) { return false; } *getterOrSetter = nullptr; const ICEntry& entry = icEntryFromPC(pc); for (ICStub* stub = entry.firstStub(); stub; stub = stub->next()) { if (stub->isCacheIR_Monitored()) { MOZ_ASSERT(isGetter); JSFunction* getter = GetMegamorphicGetterSetterFunction( stub, stub->toCacheIR_Monitored()->stubInfo(), isGetter); if (!getter || (*getterOrSetter && *getterOrSetter != getter)) { return false; } *getterOrSetter = getter; continue; } if (stub->isCacheIR_Updated()) { MOZ_ASSERT(!isGetter); JSFunction* setter = GetMegamorphicGetterSetterFunction( stub, stub->toCacheIR_Updated()->stubInfo(), isGetter); if (!setter || (*getterOrSetter && *getterOrSetter != setter)) { return false; } *getterOrSetter = setter; continue; } if (stub->isFallback()) { if (stub->toFallbackStub()->state().hasFailures()) { return false; } if (stub->toFallbackStub()->state().mode() != ICState::Mode::Megamorphic) { return false; } continue; } return false; } if (!*getterOrSetter) { return false; } return true; }
ICStub * BaselineInspector::monomorphicStub(jsbytecode *pc) { if (!hasBaselineScript()) return NULL; const ICEntry &entry = icEntryFromPC(pc); ICStub *stub = entry.firstStub(); ICStub *next = stub->next(); if (!next || !next->isFallback()) return NULL; return stub; }
bool BaselineInspector::dimorphicStub(jsbytecode *pc, ICStub **pfirst, ICStub **psecond) { if (!hasBaselineScript()) return false; const ICEntry &entry = icEntryFromPC(pc); ICStub *stub = entry.firstStub(); ICStub *next = stub->next(); ICStub *after = next ? next->next() : NULL; if (!after || !after->isFallback()) return false; *pfirst = stub; *psecond = next; return true; }
ICStub* BaselineInspector::monomorphicStub(jsbytecode* pc) { if (!hasBaselineScript()) return nullptr; // IonBuilder::analyzeNewLoopTypes may call this (via expectedResultType // below) on code that's unreachable, according to BytecodeAnalysis. Use // maybeICEntryFromPC to handle this. const ICEntry* entry = maybeICEntryFromPC(pc); if (!entry) return nullptr; ICStub* stub = entry->firstStub(); ICStub* next = stub->next(); if (!next || !next->isFallback()) return nullptr; return stub; }