bool RegExpObjectBuilder::getOrCreate() { if (reobj_) return true; // Note: RegExp objects are always allocated in the tenured heap. This is // not strictly required, but simplifies embedding them in jitcode. NativeObject *obj = NewNativeBuiltinClassInstance(cx, &RegExpObject::class_, TenuredObject); if (!obj) return false; obj->initPrivate(nullptr); reobj_ = &obj->as<RegExpObject>(); return true; }
bool RegExpObjectBuilder::getOrCreateClone(HandleTypeObject type) { MOZ_ASSERT(!reobj_); MOZ_ASSERT(type->clasp() == &RegExpObject::class_); JSObject *parent = type->proto().toObject()->getParent(); // Note: RegExp objects are always allocated in the tenured heap. This is // not strictly required, but simplifies embedding them in jitcode. NativeObject *clone = NewNativeObjectWithType(cx->asJSContext(), type, parent, TenuredObject); if (!clone) return false; clone->initPrivate(nullptr); reobj_ = &clone->as<RegExpObject>(); return true; }
/* * This method is used to trace TypedArrayObjects and DataViewObjects. We need * a custom tracer to move the object's data pointer if its owner was moved and * stores its data inline. */ /* static */ void ArrayBufferViewObject::trace(JSTracer* trc, JSObject* objArg) { NativeObject* obj = &objArg->as<NativeObject>(); HeapSlot& bufSlot = obj->getFixedSlotRef(TypedArrayObject::BUFFER_SLOT); TraceEdge(trc, &bufSlot, "typedarray.buffer"); // Update obj's data pointer if it moved. if (bufSlot.isObject()) { if (IsArrayBuffer(&bufSlot.toObject())) { ArrayBufferObject& buf = AsArrayBuffer(MaybeForwarded(&bufSlot.toObject())); uint32_t offset = uint32_t(obj->getFixedSlot(TypedArrayObject::BYTEOFFSET_SLOT).toInt32()); MOZ_ASSERT(buf.dataPointer() != nullptr); if (buf.forInlineTypedObject()) { // The data is inline with an InlineTypedObject associated with the // buffer. Get a new address for the typed object if it moved. JSObject* view = buf.firstView(); // Mark the object to move it into the tenured space. TraceManuallyBarrieredEdge(trc, &view, "typed array nursery owner"); MOZ_ASSERT(view->is<InlineTypedObject>()); MOZ_ASSERT(view != obj); void* srcData = obj->getPrivate(); void* dstData = view->as<InlineTypedObject>().inlineTypedMem() + offset; obj->setPrivateUnbarriered(dstData); // We can't use a direct forwarding pointer here, as there might // not be enough bytes available, and other views might have data // pointers whose forwarding pointers would overlap this one. trc->runtime()->gc.nursery.maybeSetForwardingPointer(trc, srcData, dstData, /* direct = */ false); } else { // The data may or may not be inline with the buffer. The buffer // can only move during a compacting GC, in which case its // objectMoved hook has already updated the buffer's data pointer. obj->initPrivate(buf.dataPointer() + offset); } } } }