void MacroAssembler::branchTestValue(Condition cond, const ValueOperand& lhs, const Value& rhs, Label* label) { MOZ_ASSERT(cond == Equal || cond == NotEqual); jsval_layout jv = JSVAL_TO_IMPL(rhs); if (rhs.isMarkable()) cmpPtr(lhs.payloadReg(), ImmGCPtr(reinterpret_cast<gc::Cell*>(rhs.toGCThing()))); else cmpPtr(lhs.payloadReg(), ImmWord(jv.s.payload.i32)); if (cond == Equal) { Label done; j(NotEqual, &done); { cmp32(lhs.typeReg(), Imm32(jv.s.tag)); j(Equal, label); } bind(&done); } else { j(NotEqual, label); cmp32(lhs.typeReg(), Imm32(jv.s.tag)); j(NotEqual, label); } }
void MacroAssemblerX86::branchTestValue(Condition cond, const ValueOperand &value, const Value &v, Label *label) { jsval_layout jv = JSVAL_TO_IMPL(v); if (v.isMarkable()) cmpl(value.payloadReg(), ImmGCPtr(reinterpret_cast<gc::Cell *>(v.toGCThing()))); else cmpl(value.payloadReg(), Imm32(jv.s.payload.i32)); if (cond == Equal) { Label done; j(NotEqual, &done); { cmpl(value.typeReg(), Imm32(jv.s.tag)); j(Equal, label); } bind(&done); } else { MOZ_ASSERT(cond == NotEqual); j(NotEqual, label); cmpl(value.typeReg(), Imm32(jv.s.tag)); j(NotEqual, label); } }
bool HeapSlot::preconditionForWriteBarrierPost(NativeObject* obj, Kind kind, uint32_t slot, const Value& target) const { bool isCorrectSlot = kind == Slot ? obj->getSlotAddressUnchecked(slot)->get() == target : static_cast<HeapSlot*>(obj->getDenseElements() + slot)->get() == target; bool isBlackToGray = target.isMarkable() && IsMarkedBlack(obj) && JS::GCThingIsMarkedGray(JS::GCCellPtr(target)); return isCorrectSlot && !isBlackToGray; }
static void NukeSlot(JSObject *wrapper, uint32_t slot, Value v) { Value old = wrapper->getSlot(slot); if (old.isMarkable()) { Zone *zone = ZoneOfValue(old); AutoMarkInDeadZone amd(zone); wrapper->setReservedSlot(slot, v); } else { wrapper->setReservedSlot(slot, v); } }
static void NukeSlot(ProxyObject *proxy, uint32_t slot) { Value old = proxy->getSlot(slot); if (old.isMarkable()) { Zone *zone = ZoneOfValue(old); AutoMarkInDeadZone amd(zone); proxy->setReservedSlot(slot, NullValue()); } else { proxy->setReservedSlot(slot, NullValue()); } }
static void NukeSlot(JSObject *wrapper, uint32_t slot, Value v) { Value old = wrapper->getSlot(slot); if (old.isMarkable()) { Cell *cell = static_cast<Cell *>(old.toGCThing()); AutoMarkInDeadCompartment amd(cell->compartment()); wrapper->setReservedSlot(slot, v); } else { wrapper->setReservedSlot(slot, v); } }
void ValueReadBarrier(const Value &value) { JS_ASSERT(!CurrentThreadIsIonCompiling()); if (value.isObject()) JSObject::readBarrier(&value.toObject()); else if (value.isString()) JSString::readBarrier(value.toString()); else if (value.isSymbol()) JS::Symbol::readBarrier(value.toSymbol()); else JS_ASSERT(!value.isMarkable()); }