Value SnapshotIterator::slotValue(const Slot &slot) { switch (slot.mode()) { case SnapshotReader::DOUBLE_REG: return DoubleValue(machine_.read(slot.floatReg())); case SnapshotReader::TYPED_REG: return FromTypedPayload(slot.knownType(), machine_.read(slot.reg())); case SnapshotReader::TYPED_STACK: { JSValueType type = slot.knownType(); if (type == JSVAL_TYPE_DOUBLE) return DoubleValue(ReadFrameDoubleSlot(fp_, slot.stackSlot())); return FromTypedPayload(type, ReadFrameSlot(fp_, slot.stackSlot())); } case SnapshotReader::UNTYPED: { jsval_layout layout; #if defined(JS_NUNBOX32) layout.s.tag = (JSValueTag)fromLocation(slot.type()); layout.s.payload.word = fromLocation(slot.payload()); #elif defined(JS_PUNBOX64) layout.asBits = fromLocation(slot.value()); #endif return IMPL_TO_JSVAL(layout); } case SnapshotReader::JS_UNDEFINED: return UndefinedValue(); case SnapshotReader::JS_NULL: return NullValue(); case SnapshotReader::JS_INT32: return Int32Value(slot.int32Value()); case SnapshotReader::CONSTANT: return ionScript_->getConstant(slot.constantIndex()); default: JS_NOT_REACHED("huh?"); return UndefinedValue(); } }
bool SnapshotIterator::slotReadable(const Slot &slot) { switch (slot.mode()) { case SnapshotReader::DOUBLE_REG: return machine_.has(slot.floatReg()); case SnapshotReader::TYPED_REG: return machine_.has(slot.reg()); case SnapshotReader::UNTYPED: #if defined(JS_NUNBOX32) return hasLocation(slot.type()) && hasLocation(slot.payload()); #elif defined(JS_PUNBOX64) return hasLocation(slot.value()); #endif default: return true; } }