JSModuleEnvironment.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 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #pragma once 30 31 #include "JSLexicalEnvironment.h" 32 33 namespace JSC { 34 35 class AbstractModuleRecord; 36 class Register; 37 38 class JSModuleEnvironment final : public JSLexicalEnvironment { 39 friend class JIT; 40 friend class LLIntOffsetsExtractor; 41 public: 42 using Base = JSLexicalEnvironment; 43 static constexpr unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetOwnSpecialPropertyNames; 44 45 static JSModuleEnvironment* create(VM& vm, JSGlobalObject* globalObject, JSScope* currentScope, SymbolTable* symbolTable, JSValue initialValue, AbstractModuleRecord* moduleRecord) 46 { 47 Structure* structure = globalObject->moduleEnvironmentStructure(); 48 return create(vm, structure, currentScope, symbolTable, initialValue, moduleRecord); 49 } 50 51 DECLARE_INFO; 52 53 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject) 54 { 55 return Structure::create(vm, globalObject, jsNull(), TypeInfo(ModuleEnvironmentType, StructureFlags), info()); 56 } 57 58 static size_t offsetOfModuleRecord(SymbolTable* symbolTable) 59 { 60 size_t offset = Base::allocationSize(symbolTable); 61 ASSERT(WTF::roundUpToMultipleOf<sizeof(WriteBarrier<AbstractModuleRecord>)>(offset) == offset); 62 return offset; 63 } 64 65 static size_t allocationSize(SymbolTable* symbolTable) 66 { 67 return offsetOfModuleRecord(symbolTable) + sizeof(WriteBarrier<AbstractModuleRecord>); 68 } 69 70 AbstractModuleRecord* moduleRecord() 71 { 72 return moduleRecordSlot().get(); 73 } 74 75 static bool getOwnPropertySlot(JSObject*, JSGlobalObject*, PropertyName, PropertySlot&); 76 static void getOwnSpecialPropertyNames(JSObject*, JSGlobalObject*, PropertyNameArray&, DontEnumPropertiesMode); 77 static bool put(JSCell*, JSGlobalObject*, PropertyName, JSValue, PutPropertySlot&); 78 static bool deleteProperty(JSCell*, JSGlobalObject*, PropertyName, DeletePropertySlot&); 79 80 private: 81 JSModuleEnvironment(VM&, Structure*, JSScope*, SymbolTable*); 82 83 static JSModuleEnvironment* create(VM&, Structure*, JSScope*, SymbolTable*, JSValue initialValue, AbstractModuleRecord*); 84 85 void finishCreation(VM&, JSValue initialValue, AbstractModuleRecord*); 86 87 WriteBarrierBase<AbstractModuleRecord>& moduleRecordSlot() 88 { 89 return *bitwise_cast<WriteBarrierBase<AbstractModuleRecord>*>(bitwise_cast<char*>(this) + offsetOfModuleRecord(symbolTable())); 90 } 91 92 static void visitChildren(JSCell*, SlotVisitor&); 93 }; 94 95 inline JSModuleEnvironment::JSModuleEnvironment(VM& vm, Structure* structure, JSScope* currentScope, SymbolTable* symbolTable) 96 : Base(vm, structure, currentScope, symbolTable) 97 { 98 } 99 100 } // namespace JSC