bool JavaScriptShared::toDescriptor(JSContext *cx, const PPropertyDescriptor &in, MutableHandle<JSPropertyDescriptor> out) { out.setAttributes(in.attrs()); out.setShortId(in.shortid()); if (!toValue(cx, in.value(), out.value())) return false; Rooted<JSObject*> obj(cx); if (!unwrap(cx, in.objId(), &obj)) return false; out.object().set(obj); if (!in.getter()) { out.setGetter(nullptr); } else if (in.attrs() & JSPROP_GETTER) { Rooted<JSObject*> getter(cx); if (!unwrap(cx, in.getter(), &getter)) return false; out.setGetter(JS_DATA_TO_FUNC_PTR(JSPropertyOp, getter.get())); } else { if (in.getter() == DefaultPropertyOp) out.setGetter(JS_PropertyStub); else out.setGetter(UnknownPropertyStub); } if (!in.setter()) { out.setSetter(nullptr); } else if (in.attrs() & JSPROP_SETTER) { Rooted<JSObject*> setter(cx); if (!unwrap(cx, in.setter(), &setter)) return false; out.setSetter(JS_DATA_TO_FUNC_PTR(JSStrictPropertyOp, setter.get())); } else { if (in.setter() == DefaultPropertyOp) out.setSetter(JS_StrictPropertyStub); else if (in.setter() == GetterOnlyPropertyStub) out.setSetter(js_GetterOnlyPropertyStub); else out.setSetter(UnknownStrictPropertyStub); } return true; }