JSModuleNamespaceObject.h
1 /* 2 * Copyright (C) 2015-2020 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #pragma once 27 28 #include "AbstractModuleRecord.h" 29 #include "JSDestructibleObject.h" 30 31 namespace JSC { 32 33 class JSModuleNamespaceObject final : public JSNonFinalObject { 34 public: 35 using Base = JSNonFinalObject; 36 static constexpr unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetOwnPropertyNames | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | GetOwnPropertySlotIsImpureForPropertyAbsence | IsImmutablePrototypeExoticObject; 37 38 static constexpr bool needsDestruction = true; 39 static void destroy(JSCell*); 40 41 template<typename CellType, SubspaceAccess mode> 42 static IsoSubspace* subspaceFor(VM& vm) 43 { 44 return vm.moduleNamespaceObjectSpace<mode>(); 45 } 46 47 static JSModuleNamespaceObject* create(JSGlobalObject* globalObject, Structure* structure, AbstractModuleRecord* moduleRecord, Vector<std::pair<Identifier, AbstractModuleRecord::Resolution>>&& resolutions) 48 { 49 VM& vm = getVM(globalObject); 50 JSModuleNamespaceObject* object = new (NotNull, allocateCell<JSModuleNamespaceObject>(vm.heap)) JSModuleNamespaceObject(vm, structure); 51 object->finishCreation(globalObject, moduleRecord, WTFMove(resolutions)); 52 return object; 53 } 54 55 JS_EXPORT_PRIVATE static bool getOwnPropertySlot(JSObject*, JSGlobalObject*, PropertyName, PropertySlot&); 56 JS_EXPORT_PRIVATE static bool getOwnPropertySlotByIndex(JSObject*, JSGlobalObject*, unsigned propertyName, PropertySlot&); 57 JS_EXPORT_PRIVATE static bool put(JSCell*, JSGlobalObject*, PropertyName, JSValue, PutPropertySlot&); 58 JS_EXPORT_PRIVATE static bool putByIndex(JSCell*, JSGlobalObject*, unsigned propertyName, JSValue, bool shouldThrow); 59 JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, JSGlobalObject*, PropertyName, DeletePropertySlot&); 60 JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, JSGlobalObject*, PropertyNameArray&, DontEnumPropertiesMode); 61 JS_EXPORT_PRIVATE static bool defineOwnProperty(JSObject*, JSGlobalObject*, PropertyName, const PropertyDescriptor&, bool shouldThrow); 62 63 DECLARE_EXPORT_INFO; 64 65 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 66 { 67 return Structure::create(vm, globalObject, prototype, TypeInfo(ModuleNamespaceObjectType, StructureFlags), info()); 68 } 69 70 AbstractModuleRecord* moduleRecord() { return m_moduleRecord.get(); } 71 72 private: 73 JS_EXPORT_PRIVATE JSModuleNamespaceObject(VM&, Structure*); 74 JS_EXPORT_PRIVATE void finishCreation(JSGlobalObject*, AbstractModuleRecord*, Vector<std::pair<Identifier, AbstractModuleRecord::Resolution>>&&); 75 static void visitChildren(JSCell*, SlotVisitor&); 76 bool getOwnPropertySlotCommon(JSGlobalObject*, PropertyName, PropertySlot&); 77 78 struct ExportEntry { 79 Identifier localName; 80 WriteBarrier<AbstractModuleRecord> moduleRecord; 81 }; 82 83 typedef HashMap<RefPtr<UniquedStringImpl>, ExportEntry, IdentifierRepHash, HashTraits<RefPtr<UniquedStringImpl>>> ExportMap; 84 85 ExportMap m_exports; 86 Vector<Identifier> m_names; 87 WriteBarrier<AbstractModuleRecord> m_moduleRecord; 88 89 friend size_t cellSize(VM&, JSCell*); 90 }; 91 92 } // namespace JSC