bool ModuleNamespaceObject::ProxyHandler::get(JSContext* cx, HandleObject proxy, HandleValue receiver, HandleId id, MutableHandleValue vp) const { Rooted<ModuleNamespaceObject*> ns(cx, &proxy->as<ModuleNamespaceObject>()); if (JSID_IS_SYMBOL(id)) { Rooted<JS::Symbol*> symbol(cx, JSID_TO_SYMBOL(id)); if (symbol == cx->wellKnownSymbols().iterator) { vp.set(getEnumerateFunction(proxy)); return true; } return false; } ModuleEnvironmentObject* env; Shape* shape; if (!ns->bindings().lookup(id, &env, &shape)) return false; RootedValue value(cx, env->getSlot(shape->slot())); if (value.isMagic(JS_UNINITIALIZED_LEXICAL)) { ReportRuntimeLexicalError(cx, JSMSG_UNINITIALIZED_LEXICAL, id); return false; } vp.set(value); return true; }
bool ModuleNamespaceObject::ProxyHandler::getOwnPropertyDescriptor(JSContext* cx, HandleObject proxy, HandleId id, MutableHandle<PropertyDescriptor> desc) const { Rooted<ModuleNamespaceObject*> ns(cx, &proxy->as<ModuleNamespaceObject>()); if (JSID_IS_SYMBOL(id)) { Rooted<JS::Symbol*> symbol(cx, JSID_TO_SYMBOL(id)); if (symbol == cx->wellKnownSymbols().iterator) { RootedValue enumerateFun(cx, getEnumerateFunction(proxy)); desc.object().set(proxy); desc.setConfigurable(false); desc.setEnumerable(false); desc.setValue(enumerateFun); return true; } if (symbol == cx->wellKnownSymbols().toStringTag) { RootedValue value(cx, StringValue(cx->names().Module)); desc.object().set(proxy); desc.setWritable(false); desc.setEnumerable(false); desc.setConfigurable(true); desc.setValue(value); return true; } return true; } const IndirectBindingMap& bindings = ns->bindings(); ModuleEnvironmentObject* env; Shape* shape; if (!bindings.lookup(id, &env, &shape)) return true; RootedValue value(cx, env->getSlot(shape->slot())); if (value.isMagic(JS_UNINITIALIZED_LEXICAL)) { ReportRuntimeLexicalError(cx, JSMSG_UNINITIALIZED_LEXICAL, id); return false; } desc.object().set(env); desc.setConfigurable(false); desc.setEnumerable(true); desc.setValue(value); return true; }