/ runtime / JSModuleEnvironment.h
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