bool invalidateBailedOutScripts() { RootedScript script(cx_, fun_->toFunction()->nonLazyScript()); // Sometimes the script is collected or invalidated already, // for example when a full GC runs at an inconvenient time. if (!script->hasParallelIonScript()) { JS_ASSERT(hasNoPendingInvalidations()); return true; } IonScript *ion = script->parallelIonScript(); JS_ASSERT(pendingInvalidations.length() == ion->parallelInvalidatedScriptEntries()); Vector<types::RecompileInfo> invalid(cx_); for (uint32_t i = 0; i < pendingInvalidations.length(); i++) { JSScript *script = pendingInvalidations[i]; if (script && !hasScript(invalid, script)) { JS_ASSERT(script->hasParallelIonScript()); if (!invalid.append(script->parallelIonScript()->recompileInfo())) return false; ion->parallelInvalidatedScriptList()[i] = script; } pendingInvalidations[i] = NULL; } Invalidate(cx_, invalid); return true; }
inline bool hasNoPendingInvalidations() { for (uint32_t i = 0; i < pendingInvalidations.length(); i++) { if (pendingInvalidations[i] != NULL) return false; } return true; }