IonBailoutIterator::IonBailoutIterator(const IonActivationIterator &activations, BailoutStack *bailout) : IonFrameIterator(activations), machine_(bailout->machine()) { uint8_t *sp = bailout->parentStackPointer(); uint8_t *fp = sp + bailout->frameSize(); current_ = fp; type_ = IonFrame_OptimizedJS; topFrameSize_ = current_ - sp; topIonScript_ = script()->ion; if (bailout->frameClass() == FrameSizeClass::None()) { snapshotOffset_ = bailout->snapshotOffset(); return; } // Compute the snapshot offset from the bailout ID. IonActivation *activation = activations.activation(); JSCompartment *jsCompartment = activation->compartment(); IonCompartment *ionCompartment = jsCompartment->ionCompartment(); IonCode *code = ionCompartment->getBailoutTable(bailout->frameClass()); uintptr_t tableOffset = bailout->tableOffset(); uintptr_t tableStart = reinterpret_cast<uintptr_t>(code->raw()); JS_ASSERT(tableOffset >= tableStart && tableOffset < tableStart + code->instructionsSize()); JS_ASSERT((tableOffset - tableStart) % BAILOUT_TABLE_ENTRY_SIZE == 0); uint32_t bailoutId = ((tableOffset - tableStart) / BAILOUT_TABLE_ENTRY_SIZE) - 1; JS_ASSERT(bailoutId < BAILOUT_TABLE_SIZE); snapshotOffset_ = topIonScript_->bailoutToSnapshot(bailoutId); }
/* * Move an IonBuilder for which compilation has either finished, failed, or * been cancelled into the Ion compartment's finished compilations list. * All off thread compilations which are started must eventually be finished. */ static void FinishOffThreadIonCompile(ion::IonBuilder *builder) { JSCompartment *compartment = builder->script->compartment(); JS_ASSERT(compartment->rt->workerThreadState->isLocked()); compartment->ionCompartment()->finishedOffThreadCompilations().append(builder); }