AsmJSModule::~AsmJSModule() { scriptSource_->decref(); if (code_) { for (unsigned i = 0; i < numExits(); i++) { AsmJSModule::ExitDatum &exitDatum = exitIndexToGlobalDatum(i); if (!exitDatum.fun) continue; if (!exitDatum.fun->hasScript()) continue; JSScript *script = exitDatum.fun->nonLazyScript(); if (!script->hasIonScript()) continue; jit::DependentAsmJSModuleExit exit(this, i); script->ionScript()->removeDependentAsmJSModule(exit); } DeallocateExecutableMemory(code_, pod.totalBytes_); } for (size_t i = 0; i < numFunctionCounts(); i++) js_delete(functionCounts(i)); }
BailoutFrameInfo::BailoutFrameInfo(const JitActivationIterator &activations, BailoutStack *bailout) : machine_(bailout->machine()) { uint8_t *sp = bailout->parentStackPointer(); framePointer_ = sp + bailout->frameSize(); topFrameSize_ = framePointer_ - sp; JSScript *script = ScriptFromCalleeToken(((JitFrameLayout *) framePointer_)->calleeToken()); JitActivation *activation = activations.activation()->asJit(); topIonScript_ = script->ionScript(); attachOnJitActivation(activations); if (bailout->frameClass() == FrameSizeClass::None()) { snapshotOffset_ = bailout->snapshotOffset(); return; } // Compute the snapshot offset from the bailout ID. JSRuntime *rt = activation->compartment()->runtimeFromMainThread(); JitCode *code = rt->jitRuntime()->getBailoutTable(bailout->frameClass()); uintptr_t tableOffset = bailout->tableOffset(); uintptr_t tableStart = reinterpret_cast<uintptr_t>(Assembler::BailoutTableStart(code->raw())); MOZ_ASSERT(tableOffset >= tableStart && tableOffset < tableStart + code->instructionsSize()); MOZ_ASSERT((tableOffset - tableStart) % BAILOUT_TABLE_ENTRY_SIZE == 0); uint32_t bailoutId = ((tableOffset - tableStart) / BAILOUT_TABLE_ENTRY_SIZE) - 1; MOZ_ASSERT(bailoutId < BAILOUT_TABLE_SIZE); snapshotOffset_ = topIonScript_->bailoutToSnapshot(bailoutId); }
uint32_t ion::CachedShapeGuardFailure() { JSContext *cx = GetIonContext()->cx; JSScript *script = GetBailedJSScript(cx); JS_ASSERT(!script->ionScript()->invalidated()); script->failedShapeGuard = true; // Purge JM caches in the script and all inlined script, to avoid baking in // the same shape guard next time. for (size_t i = 0; i < script->ionScript()->scriptEntries(); i++) mjit::PurgeCaches(script->ionScript()->getScript(i)); IonSpew(IonSpew_Invalidate, "Invalidating due to shape guard failure"); return Invalidate(cx, script); }
BailoutFrameInfo::BailoutFrameInfo(const JitActivationIterator& activations, BailoutStack* bailout) : machine_(bailout->machineState()) { uint8_t* sp = bailout->parentStackPointer(); framePointer_ = sp + bailout->frameSize(); topFrameSize_ = framePointer_ - sp; JSScript* script = ScriptFromCalleeToken(((JitFrameLayout*) framePointer_)->calleeToken()); topIonScript_ = script->ionScript(); attachOnJitActivation(activations); snapshotOffset_ = bailout->snapshotOffset(); }
uint32_t ion::ShapeGuardFailure() { JSContext *cx = GetIonContext()->cx; JSScript *script = GetBailedJSScript(cx); JS_ASSERT(!script->ionScript()->invalidated()); script->failedShapeGuard = true; IonSpew(IonSpew_Invalidate, "Invalidating due to shape guard failure"); return Invalidate(cx, script); }
AsmJSModule::~AsmJSModule() { if (code_) { for (unsigned i = 0; i < numExits(); i++) { AsmJSModule::ExitDatum &exitDatum = exitIndexToGlobalDatum(i); if (!exitDatum.fun) continue; if (!exitDatum.fun->hasScript()) continue; JSScript *script = exitDatum.fun->nonLazyScript(); if (!script->hasIonScript()) continue; ion::DependentAsmJSModuleExit exit(this, i); script->ionScript()->removeDependentAsmJSModule(exit); } } for (size_t i = 0; i < numFunctionCounts(); i++) js_delete(functionCounts(i)); }