MIRType BaselineInspector::expectedPropertyAccessInputType(jsbytecode* pc) { if (!hasICScript()) { return MIRType::Value; } const ICEntry& entry = icEntryFromPC(pc); MIRType type = MIRType::None; for (ICStub* stub = entry.firstStub(); stub; stub = stub->next()) { MIRType stubType = MIRType::None; if (stub->isCacheIR_Monitored()) { stubType = GetCacheIRExpectedInputType(stub->toCacheIR_Monitored()); if (stubType == MIRType::Value) { return MIRType::Value; } } else if (stub->isGetElem_Fallback() || stub->isGetProp_Fallback()) { // If we have an unoptimizable access, don't try to optimize. if (stub->toFallbackStub()->state().hasFailures()) { return MIRType::Value; } } else { MOZ_CRASH("Unexpected stub"); } if (type != MIRType::None) { if (type != stubType) { return MIRType::Value; } } else { type = stubType; } } return (type == MIRType::None) ? MIRType::Value : type; }
bool BaselineInspector::hasSeenNegativeIndexGetElement(jsbytecode *pc) { if (!hasBaselineScript()) return false; const ICEntry &entry = icEntryFromPC(pc); ICStub *stub = entry.fallbackStub(); if (stub->isGetElem_Fallback()) return stub->toGetElem_Fallback()->hasNegativeIndex(); return false; }