bool TypeInferenceOracle::canEnterInlinedFunction(RawScript caller, jsbytecode *pc, RawFunction target) { AssertCanGC(); RootedScript targetScript(cx, target->nonLazyScript()); // Make sure empty script has type information, to allow inlining in more cases. if (targetScript->length == 1) { if (!targetScript->ensureRanInference(cx)) return false; } if (!targetScript->hasAnalysis() || !targetScript->analysis()->ranInference() || !targetScript->analysis()->ranSSA()) { return false; } if (!targetScript->analysis()->ionInlineable()) return false; if (targetScript->needsArgsObj()) return false; if (!targetScript->compileAndGo) return false; if (targetScript->analysis()->usesScopeChain()) return false; if (target->getType(cx)->unknownProperties()) return false; JSOp op = JSOp(*pc); TypeSet *returnTypes = TypeScript::ReturnTypes(targetScript); TypeSet *callReturn = getCallReturn(caller, pc); if (op == JSOP_NEW) { if (!returnTypes->isSubsetIgnorePrimitives(callReturn)) return false; } else { if (!returnTypes->isSubset(callReturn)) return false; } // TI calls ObjectStateChange to trigger invalidation of the caller. HeapTypeSet::WatchObjectStateChange(cx, target->getType(cx)); return true; }
bool TypeInferenceOracle::canEnterInlinedFunction(RawFunction target) { RootedScript targetScript(cx, target->nonLazyScript()); // Make sure empty script has type information, to allow inlining in more cases. if (targetScript->length == 1) { if (!targetScript->ensureRanInference(cx)) return false; } if (!targetScript->hasAnalysis() || !targetScript->analysis()->ranInference() || !targetScript->analysis()->ranSSA()) { return false; } if (!targetScript->analysis()->ionInlineable()) return false; if (targetScript->needsArgsObj()) return false; if (!targetScript->compileAndGo) return false; if (targetScript->analysis()->usesScopeChain()) return false; types::TypeObject *targetType = target->getType(cx); if (!targetType || targetType->unknownProperties()) return false; // TI calls ObjectStateChange to trigger invalidation of the caller. HeapTypeSet::WatchObjectStateChange(cx, targetType); return true; }