bool AddonWrapper<Base>::set(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id, JS::HandleValue v, JS::HandleValue receiver, JS::ObjectOpResult& result) const { Rooted<JSPropertyDescriptor> desc(cx); if (!InterposeProperty(cx, wrapper, nullptr, id, &desc)) return false; if (!desc.object()) return Base::set(cx, wrapper, id, v, receiver, result); if (desc.setter()) { MOZ_ASSERT(desc.hasSetterObject()); JS::AutoValueVector args(cx); if (!args.append(v)) return false; RootedValue fval(cx, ObjectValue(*desc.setterObject())); RootedValue ignored(cx); if (!JS::Call(cx, receiver, fval, args, &ignored)) return false; return result.succeed(); } return result.failCantSetInterposed(); }
bool AddonWrapper<Base>::getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id, MutableHandle<JSPropertyDescriptor> desc) const { if (!InterposeProperty(cx, wrapper, nullptr, id, desc)) return false; if (desc.object()) return true; return Base::getOwnPropertyDescriptor(cx, wrapper, id, desc); }
bool AddonWrapper<Base>::delete_(JSContext* cx, HandleObject wrapper, HandleId id, ObjectOpResult& result) const { Rooted<JSPropertyDescriptor> desc(cx); if (!InterposeProperty(cx, wrapper, nullptr, id, &desc)) return false; if (!desc.object()) return Base::delete_(cx, wrapper, id, result); js::ReportErrorWithId(cx, "unable to delete interposed property %s", id); return false; }
bool AddonWrapper<Base>::defineProperty(JSContext* cx, HandleObject wrapper, HandleId id, Handle<PropertyDescriptor> desc, ObjectOpResult& result) const { Rooted<PropertyDescriptor> interpDesc(cx); if (!InterposeProperty(cx, wrapper, nullptr, id, &interpDesc)) return false; if (!interpDesc.object()) return Base::defineProperty(cx, wrapper, id, desc, result); js::ReportASCIIErrorWithId(cx, "unable to modify interposed property %s", id); return false; }
bool AddonWrapper<Base>::get(JSContext* cx, JS::Handle<JSObject*> wrapper, JS::Handle<Value> receiver, JS::Handle<jsid> id, JS::MutableHandle<JS::Value> vp) const { PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER); Rooted<JSPropertyDescriptor> desc(cx); if (!InterposeProperty(cx, wrapper, nullptr, id, &desc)) return false; if (!desc.object()) return Base::get(cx, wrapper, receiver, id, vp); if (desc.getter()) { return Call(cx, receiver, desc.getterObject(), HandleValueArray::empty(), vp); } else { vp.set(desc.value()); return true; } }
bool AddonWrapper<Base>::get(JSContext* cx, JS::Handle<JSObject*> wrapper, JS::Handle<JSObject*> receiver, JS::Handle<jsid> id, JS::MutableHandle<JS::Value> vp) const { Rooted<JSPropertyDescriptor> desc(cx); if (!InterposeProperty(cx, wrapper, nullptr, id, &desc)) return false; if (!desc.object()) return Base::get(cx, wrapper, receiver, id, vp); if (desc.getter()) { MOZ_ASSERT(desc.hasGetterObject()); AutoValueVector args(cx); RootedValue fval(cx, ObjectValue(*desc.getterObject())); return JS_CallFunctionValue(cx, receiver, fval, args, vp); } else { vp.set(desc.value()); return true; } }