static bool CloneProperties(JSContext *cx, HandleObject obj, HandleObject clone, CloneMemory &clonedObjects) { RootedId id(cx); RootedValue val(cx); AutoIdVector ids(cx); { AutoCompartment ac(cx, obj); if (!GetPropertyNames(cx, obj, JSITER_OWNONLY, &ids)) return false; } for (uint32_t i = 0; i < ids.length(); i++) { id = ids[i]; if (!GetUnclonedValue(cx, obj, id, &val) || !CloneValue(cx, &val, clonedObjects) || !JS_DefinePropertyById(cx, clone, id, val.get(), NULL, NULL, 0)) { return false; } } if (SelfHostedClass::is(cx, obj->getClass())) { for (uint32_t i = 0; i < JSCLASS_RESERVED_SLOTS(obj->getClass()); i++) { val = obj->getReservedSlot(i); if (!CloneValue(cx, &val, clonedObjects)) return false; clone->setReservedSlot(i, val); } /* Privates are not cloned, so be careful! */ if (obj->hasPrivate()) clone->setPrivate(obj->getPrivate()); } return true; }