void js::ObjectImpl::markChildren(JSTracer *trc) { MarkTypeObject(trc, &type_, "type"); MarkShape(trc, &shape_, "shape"); const Class *clasp = type_->clasp(); JSObject *obj = asObjectPtr(); if (clasp->trace) clasp->trace(trc, obj); if (shape_->isNative()) { MarkObjectSlots(trc, obj, 0, obj->slotSpan()); do { if (obj->denseElementsAreCopyOnWrite()) { HeapPtrObject &owner = getElementsHeader()->ownerObject(); if (owner != this) { MarkObject(trc, &owner, "objectElementsOwner"); break; } } gc::MarkArraySlots(trc, obj->getDenseInitializedLength(), obj->getDenseElementsAllowCopyOnWrite(), "objectElements"); } while (false); } }
bool js::intrinsic_IsPackedArray(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); JS_ASSERT(args.length() == 1); JS_ASSERT(args[0].isObject()); JSObject *obj = &args[0].toObject(); bool isPacked = obj->is<ArrayObject>() && !obj->type()->hasAllFlags(types::OBJECT_FLAG_NON_PACKED) && obj->getDenseInitializedLength() == obj->as<ArrayObject>().length(); args.rval().setBoolean(isPacked); return true; }
void js::ObjectImpl::markChildren(JSTracer *trc) { MarkTypeObject(trc, &type_, "type"); MarkShape(trc, &shape_, "shape"); Class *clasp = type_->clasp; JSObject *obj = asObjectPtr(); if (clasp->trace) clasp->trace(trc, obj); if (shape_->isNative()) { MarkObjectSlots(trc, obj, 0, obj->slotSpan()); gc::MarkArraySlots(trc, obj->getDenseInitializedLength(), obj->getDenseElements(), "objectElements"); } }