Unreviewed, rolling out r212712.
authorryanhaddad@apple.com <ryanhaddad@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Feb 2017 18:00:43 +0000 (18:00 +0000)
committerryanhaddad@apple.com <ryanhaddad@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Feb 2017 18:00:43 +0000 (18:00 +0000)
This change broke the CLoop build.

Reverted changeset:

"JSModuleNamespace object should have IC"
https://bugs.webkit.org/show_bug.cgi?id=160590
http://trac.webkit.org/changeset/212712

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@212717 268f45cc-cd09-0410-ab3c-d52691b4dbfc

30 files changed:
JSTests/ChangeLog
JSTests/modules/module-assert-access-binding.js [deleted file]
JSTests/modules/module-assert-access-namespace.js [deleted file]
JSTests/modules/namespace-empty.js [deleted file]
JSTests/stress/module-namespace-access-change.js [deleted file]
JSTests/stress/module-namespace-access-non-constant.js [deleted file]
JSTests/stress/module-namespace-access-poly.js [deleted file]
JSTests/stress/module-namespace-access-transitive-exports.js [deleted file]
JSTests/stress/module-namespace-access.js [deleted file]
JSTests/stress/resources/module-namespace-access-transitive-exports-2.js [deleted file]
JSTests/stress/resources/module-namespace-access-transitive-exports.js [deleted file]
JSTests/stress/resources/module-namespace-access.js [deleted file]
Source/JavaScriptCore/CMakeLists.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
Source/JavaScriptCore/bytecode/AccessCase.cpp
Source/JavaScriptCore/bytecode/AccessCase.h
Source/JavaScriptCore/bytecode/GetByIdStatus.cpp
Source/JavaScriptCore/bytecode/GetByIdStatus.h
Source/JavaScriptCore/bytecode/ModuleNamespaceAccessCase.cpp [deleted file]
Source/JavaScriptCore/bytecode/ModuleNamespaceAccessCase.h [deleted file]
Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp
Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
Source/JavaScriptCore/jit/AssemblyHelpers.h
Source/JavaScriptCore/jit/Repatch.cpp
Source/JavaScriptCore/runtime/AbstractModuleRecord.cpp
Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp
Source/JavaScriptCore/runtime/JSModuleNamespaceObject.h
Source/JavaScriptCore/runtime/JSModuleRecord.h
Source/JavaScriptCore/runtime/PropertySlot.h

index 5f36ee9..8c24266 100644 (file)
@@ -1,3 +1,15 @@
+2017-02-21  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r212712.
+
+        This change broke the CLoop build.
+
+        Reverted changeset:
+
+        "JSModuleNamespace object should have IC"
+        https://bugs.webkit.org/show_bug.cgi?id=160590
+        http://trac.webkit.org/changeset/212712
+
 2017-02-21  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         JSModuleNamespace object should have IC
diff --git a/JSTests/modules/module-assert-access-binding.js b/JSTests/modules/module-assert-access-binding.js
deleted file mode 100644 (file)
index 563cc9d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-import {shouldBe} from "./resources/assert.js";
-
-let array = [];
-for (let i = 0; i < 4000000; i++) {
-    array.push(i);
-}
-
-for (let i = 0; i < 4000000; i++) {
-    shouldBe(array[i], i);
-}
diff --git a/JSTests/modules/module-assert-access-namespace.js b/JSTests/modules/module-assert-access-namespace.js
deleted file mode 100644 (file)
index fe090bd..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-import * as assert from "./resources/assert.js";
-
-let array = [];
-for (let i = 0; i < 4000000; i++) {
-    array.push(i);
-}
-
-for (let i = 0; i < 4000000; i++) {
-    assert.shouldBe(array[i], i);
-}
diff --git a/JSTests/modules/namespace-empty.js b/JSTests/modules/namespace-empty.js
deleted file mode 100644 (file)
index 398048c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-import * as ns from "./namespace-empty.js"
-import {shouldThrow} from "./resources/assert.js"
-
-function access(ns)
-{
-    return ns.test;
-}
-noInline(access);
-
-for (var i = 0; i < 1e3; ++i) {
-    shouldThrow(() => {
-        access(ns);
-    }, `ReferenceError: Cannot access uninitialized variable.`);
-}
-
-
-export let test = 42;
diff --git a/JSTests/stress/module-namespace-access-change.js b/JSTests/stress/module-namespace-access-change.js
deleted file mode 100644 (file)
index 6e49567..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function access(namespace)
-{
-    return namespace.test;
-}
-noInline(access);
-
-import("./resources/module-namespace-access.js").then((ns) => {
-    for (var i = 0; i < 1e4; ++i)
-        shouldBe(access(ns), 42)
-    ns.change();
-    for (var i = 0; i < 1e4; ++i)
-        shouldBe(access(ns), 55)
-});
-drainMicrotasks();
diff --git a/JSTests/stress/module-namespace-access-non-constant.js b/JSTests/stress/module-namespace-access-non-constant.js
deleted file mode 100644 (file)
index 02d7065..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-import("./resources/module-namespace-access.js").then((ns) => {
-    ns.change();
-    for (var i = 0; i < 1e6; ++i) {
-        shouldBe(ns.test, 55);
-        shouldBe(ns.cocoa(), 55);
-    }
-});
-drainMicrotasks();
diff --git a/JSTests/stress/module-namespace-access-poly.js b/JSTests/stress/module-namespace-access-poly.js
deleted file mode 100644 (file)
index 5dfcac7..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-function access(ns)
-{
-    return ns.test;
-}
-noInline(access);
-
-import("./resources/module-namespace-access.js").then((ns) => {
-    for (var i = 0; i < 1e4; ++i) {
-        shouldBe(access(ns), 42);
-    }
-    let nonNS = { test: 50 };
-    let nonNS2 = { ok: 22, test: 52 };
-    for (var i = 0; i < 1e4; ++i) {
-        shouldBe(access(ns), 42);
-        shouldBe(access(nonNS), 50);
-        shouldBe(access(nonNS2), 52);
-    }
-});
-drainMicrotasks();
diff --git a/JSTests/stress/module-namespace-access-transitive-exports.js b/JSTests/stress/module-namespace-access-transitive-exports.js
deleted file mode 100644 (file)
index b74e5e5..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-import("./resources/module-namespace-access-transitive-exports.js").then((ns) => {
-    for (var i = 0; i < 1e6; ++i) {
-        shouldBe(ns.test, 42);
-        shouldBe(ns.cocoa(), 42);
-    }
-});
-drainMicrotasks();
diff --git a/JSTests/stress/module-namespace-access.js b/JSTests/stress/module-namespace-access.js
deleted file mode 100644 (file)
index 2ac1409..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-function shouldBe(actual, expected) {
-    if (actual !== expected)
-        throw new Error('bad value: ' + actual);
-}
-
-import("./resources/module-namespace-access.js").then((ns) => {
-    for (var i = 0; i < 1e6; ++i) {
-        shouldBe(ns.test, 42);
-        shouldBe(ns.cocoa(), 42);
-    }
-});
-drainMicrotasks();
diff --git a/JSTests/stress/resources/module-namespace-access-transitive-exports-2.js b/JSTests/stress/resources/module-namespace-access-transitive-exports-2.js
deleted file mode 100644 (file)
index 54df32c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-export let test = 42;
-export function cocoa()
-{
-    return test;
-}
-
-export function change()
-{
-    test = 55;
-}
diff --git a/JSTests/stress/resources/module-namespace-access-transitive-exports.js b/JSTests/stress/resources/module-namespace-access-transitive-exports.js
deleted file mode 100644 (file)
index 68019ca..0000000
+++ /dev/null
@@ -1 +0,0 @@
-export * from "./module-namespace-access-transitive-exports-2.js"
diff --git a/JSTests/stress/resources/module-namespace-access.js b/JSTests/stress/resources/module-namespace-access.js
deleted file mode 100644 (file)
index 54df32c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-export let test = 42;
-export function cocoa()
-{
-    return test;
-}
-
-export function change()
-{
-    test = 55;
-}
index 0d1c337..4e0d79f 100644 (file)
@@ -228,7 +228,6 @@ set(JavaScriptCore_SOURCES
     bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp
     bytecode/LazyOperandValueProfile.cpp
     bytecode/MethodOfGettingAValueProfile.cpp
-    bytecode/ModuleNamespaceAccessCase.cpp
     bytecode/ModuleProgramCodeBlock.cpp
     bytecode/ObjectPropertyCondition.cpp
     bytecode/ObjectPropertyConditionSet.cpp
index b70174e..3beb18b 100644 (file)
@@ -1,3 +1,15 @@
+2017-02-21  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r212712.
+
+        This change broke the CLoop build.
+
+        Reverted changeset:
+
+        "JSModuleNamespace object should have IC"
+        https://bugs.webkit.org/show_bug.cgi?id=160590
+        http://trac.webkit.org/changeset/212712
+
 2017-02-21  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         JSModuleNamespace object should have IC
index dff2fe7..5425b9e 100644 (file)
                FED94F2F171E3E2300BE77A4 /* Watchdog.h in Headers */ = {isa = PBXBuildFile; fileRef = FED94F2C171E3E2300BE77A4 /* Watchdog.h */; settings = {ATTRIBUTES = (Private, ); }; };
                FEF040511AAE662D00BD28B0 /* CompareAndSwapTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEF040501AAE662D00BD28B0 /* CompareAndSwapTest.cpp */; };
                FEFD6FC61D5E7992008F2F0B /* JSStringInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = FEFD6FC51D5E7970008F2F0B /* JSStringInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               321D9E4CFB67423A97F191A7 /* ModuleNamespaceAccessCase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */; };
-               9F63434577274FAFB9336C38 /* ModuleNamespaceAccessCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
                FEF040501AAE662D00BD28B0 /* CompareAndSwapTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CompareAndSwapTest.cpp; path = API/tests/CompareAndSwapTest.cpp; sourceTree = "<group>"; };
                FEF040521AAEC4ED00BD28B0 /* CompareAndSwapTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CompareAndSwapTest.h; path = API/tests/CompareAndSwapTest.h; sourceTree = "<group>"; };
                FEFD6FC51D5E7970008F2F0B /* JSStringInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStringInlines.h; sourceTree = "<group>"; };
-               20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ModuleNamespaceAccessCase.cpp; path = ModuleNamespaceAccessCase.cpp; sourceTree = "<group>"; };
-               4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ModuleNamespaceAccessCase.h; path = ModuleNamespaceAccessCase.h; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
                                0F426A461460CBAB00131F8F /* VirtualRegister.h */,
                                0F919D2215853CDE004A4E7D /* Watchpoint.cpp */,
                                0F919D2315853CDE004A4E7D /* Watchpoint.h */,
-                               20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */,
-                               4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */,
                        );
                        path = bytecode;
                        sourceTree = "<group>";
                                86704B8812DBA33700A9FE7B /* YarrParser.h in Headers */,
                                86704B8A12DBA33700A9FE7B /* YarrPattern.h in Headers */,
                                86704B4312DB8A8100A9FE7B /* YarrSyntaxChecker.h in Headers */,
-                               9F63434577274FAFB9336C38 /* ModuleNamespaceAccessCase.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                86704B8612DBA33700A9FE7B /* YarrJIT.cpp in Sources */,
                                86704B8912DBA33700A9FE7B /* YarrPattern.cpp in Sources */,
                                86704B4212DB8A8100A9FE7B /* YarrSyntaxChecker.cpp in Sources */,
-                               321D9E4CFB67423A97F191A7 /* ModuleNamespaceAccessCase.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index 658ea0f..16a1a53 100644 (file)
 #include "HeapInlines.h"
 #include "IntrinsicGetterAccessCase.h"
 #include "JSCJSValueInlines.h"
-#include "JSModuleEnvironment.h"
-#include "JSModuleNamespaceObject.h"
 #include "LinkBuffer.h"
-#include "ModuleNamespaceAccessCase.h"
 #include "PolymorphicAccess.h"
 #include "ScopedArguments.h"
 #include "ScratchRegisterAllocator.h"
@@ -68,7 +65,6 @@ std::unique_ptr<AccessCase> AccessCase::create(VM& vm, JSCell* owner, AccessType
     case StringLength:
     case DirectArgumentsLength:
     case ScopedArgumentsLength:
-    case ModuleNamespaceLoad:
     case Replace:
         break;
     default:
@@ -152,7 +148,6 @@ bool AccessCase::guardedByStructureCheck() const
     case StringLength:
     case DirectArgumentsLength:
     case ScopedArgumentsLength:
-    case ModuleNamespaceLoad:
         return false;
     default:
         return true;
@@ -198,13 +193,6 @@ bool AccessCase::canReplace(const AccessCase& other) const
     case DirectArgumentsLength:
     case ScopedArgumentsLength:
         return other.type() == type();
-    case ModuleNamespaceLoad: {
-        if (other.type() != type())
-            return false;
-        auto& thisCase = this->as<ModuleNamespaceAccessCase>();
-        auto& otherCase = this->as<ModuleNamespaceAccessCase>();
-        return thisCase.moduleNamespaceObject() == otherCase.moduleNamespaceObject();
-    }
     default:
         if (!guardedByStructureCheck() || !other.guardedByStructureCheck())
             return false;
@@ -251,12 +239,6 @@ bool AccessCase::visitWeak(VM& vm) const
         auto& intrinsic = this->as<IntrinsicGetterAccessCase>();
         if (intrinsic.intrinsicFunction() && !Heap::isMarked(intrinsic.intrinsicFunction()))
             return false;
-    } else if (type() == ModuleNamespaceLoad) {
-        auto& accessCase = this->as<ModuleNamespaceAccessCase>();
-        if (accessCase.moduleNamespaceObject() && !Heap::isMarked(accessCase.moduleNamespaceObject()))
-            return false;
-        if (accessCase.moduleEnvironment() && !Heap::isMarked(accessCase.moduleEnvironment()))
-            return false;
     }
 
     return true;
@@ -362,11 +344,6 @@ void AccessCase::generateWithGuard(
         return;
     }
 
-    case ModuleNamespaceLoad: {
-        this->as<ModuleNamespaceAccessCase>().emit(state, fallThrough);
-        return;
-    }
-
     default: {
         if (viaProxy()) {
             fallThrough.append(
@@ -1014,7 +991,6 @@ void AccessCase::generateImpl(AccessGenerationState& state)
         
     case DirectArgumentsLength:
     case ScopedArgumentsLength:
-    case ModuleNamespaceLoad:
         // These need to be handled by generateWithGuard(), since the guard is part of the
         // algorithm. We can be sure that nobody will call generate() directly for these since they
         // are not guarded by structure checks.
index 9f8a200..29e1adf 100644 (file)
@@ -95,8 +95,7 @@ public:
         ArrayLength,
         StringLength,
         DirectArgumentsLength,
-        ScopedArgumentsLength,
-        ModuleNamespaceLoad,
+        ScopedArgumentsLength
     };
 
     enum State : uint8_t {
index df2b6a8..eb571ff 100644 (file)
@@ -34,7 +34,6 @@
 #include "JSScope.h"
 #include "LLIntData.h"
 #include "LowLevelInterpreter.h"
-#include "ModuleNamespaceAccessCase.h"
 #include "PolymorphicAccess.h"
 #include "StructureStubInfo.h"
 #include <wtf/ListDump.h>
@@ -44,15 +43,6 @@ namespace DOMJIT {
 class GetterSetter;
 }
 
-GetByIdStatus::GetByIdStatus(const ModuleNamespaceAccessCase& accessCase)
-    : m_state(ModuleNamespace)
-    , m_wasSeenInJIT(true)
-    , m_moduleNamespaceObject(accessCase.moduleNamespaceObject())
-    , m_moduleEnvironment(accessCase.moduleEnvironment())
-    , m_scopeOffset(accessCase.scopeOffset())
-{
-}
-
 bool GetByIdStatus::appendVariant(const GetByIdVariant& variant)
 {
     // Attempt to merge this variant with an already existing variant.
@@ -205,16 +195,6 @@ GetByIdStatus GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback(
     }
         
     case CacheType::Stub: {
-        if (list->size() == 1) {
-            const AccessCase& access = list->at(0);
-            switch (access.type()) {
-            case AccessCase::ModuleNamespaceLoad:
-                return GetByIdStatus(access.as<ModuleNamespaceAccessCase>());
-            default:
-                break;
-            }
-        }
-
         for (unsigned listIndex = 0; listIndex < list->size(); ++listIndex) {
             const AccessCase& access = list->at(listIndex);
             if (access.viaProxy())
@@ -396,7 +376,6 @@ bool GetByIdStatus::makesCalls() const
     case NoInformation:
     case TakesSlowPath:
     case Custom:
-    case ModuleNamespace:
         return false;
     case Simple:
         for (unsigned i = m_variants.size(); i--;) {
@@ -441,9 +420,6 @@ void GetByIdStatus::dump(PrintStream& out) const
     case Custom:
         out.print("Custom");
         break;
-    case ModuleNamespace:
-        out.print("ModuleNamespace");
-        break;
     case TakesSlowPath:
         out.print("TakesSlowPath");
         break;
index bd8fc78..e8aad89 100644 (file)
 #include "ConcurrentJSLock.h"
 #include "ExitingJITType.h"
 #include "GetByIdVariant.h"
-#include "ScopeOffset.h"
 
 namespace JSC {
 
-class AccessCase;
 class CodeBlock;
-class JSModuleEnvironment;
-class JSModuleNamespaceObject;
-class ModuleNamespaceAccessCase;
 class StructureStubInfo;
 
 typedef HashMap<CodeOrigin, StructureStubInfo*, CodeOriginApproximateHash> StubInfoMap;
@@ -46,19 +41,12 @@ typedef HashMap<CodeOrigin, StructureStubInfo*, CodeOriginApproximateHash> StubI
 class GetByIdStatus {
 public:
     enum State {
-        // It's uncached so we have no information.
-        NoInformation,
-        // It's cached for a simple access to a known object property with
-        // a possible structure chain and a possible specific value.
-        Simple,
-        // It's cached for a custom accessor with a possible structure chain.
-        Custom,
-        // It's cached for an access to a module namespace object's binding.
-        ModuleNamespace,
-        // It's known to often take slow path.
-        TakesSlowPath,
-        // It's known to take paths that make calls.
-        MakesCalls,
+        NoInformation,  // It's uncached so we have no information.
+        Simple,         // It's cached for a simple access to a known object property with
+                        // a possible structure chain and a possible specific value.
+        Custom,         // It's cached for a custom accessor with a possible structure chain.
+        TakesSlowPath,  // It's known to often take slow path.
+        MakesCalls      // It's known to take paths that make calls.
     };
 
     GetByIdStatus()
@@ -71,8 +59,6 @@ public:
     {
         ASSERT(state == NoInformation || state == TakesSlowPath || state == MakesCalls);
     }
-
-    GetByIdStatus(const ModuleNamespaceAccessCase&);
     
     GetByIdStatus(
         State state, bool wasSeenInJIT, const GetByIdVariant& variant = GetByIdVariant())
@@ -98,24 +84,19 @@ public:
     bool operator!() const { return !isSet(); }
     bool isSimple() const { return m_state == Simple; }
     bool isCustom() const { return m_state == Custom; }
-    bool isModuleNamespace() const { return m_state == ModuleNamespace; }
 
     size_t numVariants() const { return m_variants.size(); }
     const Vector<GetByIdVariant, 1>& variants() const { return m_variants; }
     const GetByIdVariant& at(size_t index) const { return m_variants[index]; }
     const GetByIdVariant& operator[](size_t index) const { return at(index); }
 
-    bool takesSlowPath() const { return m_state == TakesSlowPath || m_state == MakesCalls || m_state == Custom || m_state == ModuleNamespace; }
+    bool takesSlowPath() const { return m_state == TakesSlowPath || m_state == MakesCalls || m_state == Custom; }
     bool makesCalls() const;
     
     bool wasSeenInJIT() const { return m_wasSeenInJIT; }
     
     // Attempts to reduce the set of variants to fit the given structure set. This may be approximate.
     void filter(const StructureSet&);
-
-    JSModuleNamespaceObject* moduleNamespaceObject() const { return m_moduleNamespaceObject; }
-    JSModuleEnvironment* moduleEnvironment() const { return m_moduleEnvironment; }
-    ScopeOffset scopeOffset() const { return m_scopeOffset; }
     
     void dump(PrintStream&) const;
     
@@ -135,9 +116,6 @@ private:
     State m_state;
     Vector<GetByIdVariant, 1> m_variants;
     bool m_wasSeenInJIT;
-    JSModuleNamespaceObject* m_moduleNamespaceObject { nullptr };
-    JSModuleEnvironment* m_moduleEnvironment { nullptr };
-    ScopeOffset m_scopeOffset { };
 };
 
 } // namespace JSC
diff --git a/Source/JavaScriptCore/bytecode/ModuleNamespaceAccessCase.cpp b/Source/JavaScriptCore/bytecode/ModuleNamespaceAccessCase.cpp
deleted file mode 100644 (file)
index 3c168c6..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2017 Yusuke Suzuki <utatane.tea@gmail.com>.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "ModuleNamespaceAccessCase.h"
-
-#if ENABLE(JIT)
-
-#include "CCallHelpers.h"
-#include "HeapInlines.h"
-#include "JSModuleEnvironment.h"
-#include "JSModuleNamespaceObject.h"
-#include "PolymorphicAccess.h"
-#include "StructureStubInfo.h"
-
-namespace JSC {
-
-ModuleNamespaceAccessCase::ModuleNamespaceAccessCase(VM& vm, JSCell* owner, JSModuleNamespaceObject* moduleNamespaceObject, JSModuleEnvironment* moduleEnvironment, ScopeOffset scopeOffset)
-    : Base(vm, owner, ModuleNamespaceLoad, invalidOffset, nullptr, ObjectPropertyConditionSet())
-    , m_scopeOffset(scopeOffset)
-{
-    m_moduleNamespaceObject.set(vm, owner, moduleNamespaceObject);
-    m_moduleEnvironment.set(vm, owner, moduleEnvironment);
-}
-
-std::unique_ptr<AccessCase> ModuleNamespaceAccessCase::create(VM& vm, JSCell* owner, JSModuleNamespaceObject* moduleNamespaceObject, JSModuleEnvironment* moduleEnvironment, ScopeOffset scopeOffset)
-{
-    return std::unique_ptr<AccessCase>(new ModuleNamespaceAccessCase(vm, owner, moduleNamespaceObject, moduleEnvironment, scopeOffset));
-}
-
-ModuleNamespaceAccessCase::~ModuleNamespaceAccessCase()
-{
-}
-
-std::unique_ptr<AccessCase> ModuleNamespaceAccessCase::clone() const
-{
-    std::unique_ptr<ModuleNamespaceAccessCase> result(new ModuleNamespaceAccessCase(*this));
-    result->resetState();
-    return WTFMove(result);
-}
-
-void ModuleNamespaceAccessCase::emit(AccessGenerationState& state, MacroAssembler::JumpList& fallThrough)
-{
-    CCallHelpers& jit = *state.jit;
-    JSValueRegs valueRegs = state.valueRegs;
-    GPRReg baseGPR = state.baseGPR;
-
-    fallThrough.append(
-        jit.branchPtr(
-            CCallHelpers::NotEqual,
-            baseGPR,
-            CCallHelpers::TrustedImmPtr(m_moduleNamespaceObject.get())));
-
-    jit.loadValue(&m_moduleEnvironment->variableAt(m_scopeOffset), valueRegs);
-    state.failAndIgnore.append(jit.branchIfEmpty(valueRegs));
-    state.succeed();
-}
-
-
-} // namespace JSC
-
-#endif // ENABLE(JIT)
diff --git a/Source/JavaScriptCore/bytecode/ModuleNamespaceAccessCase.h b/Source/JavaScriptCore/bytecode/ModuleNamespaceAccessCase.h
deleted file mode 100644 (file)
index 333075f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2017 Yusuke Suzuki <utatane.tea@gmail.com>.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#if ENABLE(JIT)
-
-#include "AccessCase.h"
-
-namespace JSC {
-
-class JSModuleEnvironment;
-class JSModuleNamespaceObject;
-
-class ModuleNamespaceAccessCase : public AccessCase {
-public:
-    using Base = AccessCase;
-    friend class AccessCase;
-
-    JSModuleNamespaceObject* moduleNamespaceObject() const { return m_moduleNamespaceObject.get(); }
-    JSModuleEnvironment* moduleEnvironment() const { return m_moduleEnvironment.get(); }
-    ScopeOffset scopeOffset() const { return m_scopeOffset; }
-
-    static std::unique_ptr<AccessCase> create(VM&, JSCell* owner, JSModuleNamespaceObject*, JSModuleEnvironment*, ScopeOffset);
-
-    std::unique_ptr<AccessCase> clone() const override;
-
-    void emit(AccessGenerationState&, MacroAssembler::JumpList& fallThrough);
-
-    ~ModuleNamespaceAccessCase();
-
-private:
-    ModuleNamespaceAccessCase(VM&, JSCell* owner, JSModuleNamespaceObject*, JSModuleEnvironment*, ScopeOffset);
-
-    WriteBarrier<JSModuleNamespaceObject> m_moduleNamespaceObject;
-    WriteBarrier<JSModuleEnvironment> m_moduleEnvironment;
-    ScopeOffset m_scopeOffset;
-};
-
-} // namespace JSC
-
-#endif // ENABLE(JIT)
index f062bc5..0cec026 100644 (file)
@@ -645,9 +645,6 @@ void printInternal(PrintStream& out, AccessCase::AccessType type)
     case AccessCase::ScopedArgumentsLength:
         out.print("ScopedArgumentsLength");
         return;
-    case AccessCase::ModuleNamespaceLoad:
-        out.print("ModuleNamespaceLoad");
-        return;
     }
 
     RELEASE_ASSERT_NOT_REACHED();
index 584deeb..882c9e0 100644 (file)
@@ -46,7 +46,6 @@
 #include "Heap.h"
 #include "JSCInlines.h"
 #include "JSModuleEnvironment.h"
-#include "JSModuleNamespaceObject.h"
 #include "NumberConstructor.h"
 #include "ObjectConstructor.h"
 #include "PreciseJumpTargets.h"
@@ -224,7 +223,6 @@ private:
     Node* handlePutByOffset(Node* base, unsigned identifier, PropertyOffset, const InferredType::Descriptor&, Node* value);
     Node* handleGetByOffset(SpeculatedType, Node* base, unsigned identifierNumber, PropertyOffset, const InferredType::Descriptor&, NodeType = GetByOffset);
     bool handleDOMJITGetter(int resultOperand, const GetByIdVariant&, Node* thisNode, unsigned identifierNumber, SpeculatedType prediction);
-    bool handleModuleNamespaceLoad(int resultOperand, SpeculatedType, Node* base, GetByIdStatus);
 
     // Create a presence ObjectPropertyCondition based on some known offset and structure set. Does not
     // check the validity of the condition, but it may return a null one if it encounters a contradiction.
@@ -2846,34 +2844,6 @@ bool ByteCodeParser::handleDOMJITGetter(int resultOperand, const GetByIdVariant&
     return true;
 }
 
-bool ByteCodeParser::handleModuleNamespaceLoad(int resultOperand, SpeculatedType prediction, Node* base, GetByIdStatus getById)
-{
-    if (m_inlineStackTop->m_exitProfile.hasExitSite(m_currentIndex, BadCell))
-        return false;
-    addToGraph(CheckCell, OpInfo(m_graph.freeze(getById.moduleNamespaceObject())), Edge(base, CellUse));
-
-    // Ideally we wouldn't have to do this Phantom. But:
-    //
-    // For the constant case: we must do it because otherwise we would have no way of knowing
-    // that the scope is live at OSR here.
-    //
-    // For the non-constant case: GetClosureVar could be DCE'd, but baseline's implementation
-    // won't be able to handle an Undefined scope.
-    addToGraph(Phantom, base);
-
-    // Constant folding in the bytecode parser is important for performance. This may not
-    // have executed yet. If it hasn't, then we won't have a prediction. Lacking a
-    // prediction, we'd otherwise think that it has to exit. Then when it did execute, we
-    // would recompile. But if we can fold it here, we avoid the exit.
-    m_graph.freeze(getById.moduleEnvironment());
-    if (JSValue value = m_graph.tryGetConstantClosureVar(getById.moduleEnvironment(), getById.scopeOffset())) {
-        set(VirtualRegister(resultOperand), weakJSConstant(value));
-        return true;
-    }
-    set(VirtualRegister(resultOperand), addToGraph(GetClosureVar, OpInfo(getById.scopeOffset().offset()), OpInfo(prediction), weakJSConstant(getById.moduleEnvironment())));
-    return true;
-}
-
 template<typename ChecksFunctor>
 bool ByteCodeParser::handleTypedArrayConstructor(
     int resultOperand, InternalFunction* function, int registerOffset,
@@ -3468,14 +3438,6 @@ void ByteCodeParser::handleGetById(
     else
         getById = TryGetById;
 
-    if (getById != TryGetById && getByIdStatus.isModuleNamespace()) {
-        if (handleModuleNamespaceLoad(destinationOperand, prediction, base, getByIdStatus)) {
-            if (m_graph.compilation())
-                m_graph.compilation()->noticeInlinedGetById();
-            return;
-        }
-    }
-
     // Special path for custom accessors since custom's offset does not have any meanings.
     // So, this is completely different from Simple one. But we have a chance to optimize it when we use DOMJIT.
     if (Options::useDOMJIT() && getByIdStatus.isCustom()) {
index 49c7f9c..fb6376a 100644 (file)
@@ -158,16 +158,6 @@ public:
         }
 #endif
     }
-
-    void loadValue(void* address, JSValueRegs regs)
-    {
-#if USE(JSVALUE64)
-        load64(address, regs.gpr());
-#else
-        load32(bitwise_cast<void*>(bitwise_cast<uintptr_t>(address) + PayloadOffset), regs.payloadGPR());
-        load32(bitwise_cast<void*>(bitwise_cast<uintptr_t>(address) + TagOffset), regs.tagGPR());
-#endif
-    }
     
     // Note that this clobbers offset.
     void loadProperty(GPRReg object, GPRReg offset, JSValueRegs result);
index bab11b6..d2fb604 100644 (file)
 #include "JIT.h"
 #include "JITInlines.h"
 #include "JSCInlines.h"
-#include "JSModuleNamespaceObject.h"
 #include "JSWebAssembly.h"
 #include "LinkBuffer.h"
-#include "ModuleNamespaceAccessCase.h"
 #include "PolymorphicAccess.h"
 #include "ScopedArguments.h"
 #include "ScratchRegisterAllocator.h"
@@ -194,11 +192,6 @@ static InlineCacheAction tryCacheGetByID(ExecState* exec, JSValue baseValue, con
                 newCase = AccessCase::create(vm, codeBlock, AccessCase::ScopedArgumentsLength);
         }
     }
-
-    if (!propertyName.isSymbol() && isJSModuleNamespaceObject(baseValue) && !slot.isUnset()) {
-        if (auto moduleNamespaceSlot = slot.moduleNamespaceSlot())
-            newCase = ModuleNamespaceAccessCase::create(vm, codeBlock, jsCast<JSModuleNamespaceObject*>(baseValue), moduleNamespaceSlot->environment, ScopeOffset(moduleNamespaceSlot->scopeOffset));
-    }
     
     if (!newCase) {
         if (!slot.isCacheable() && !slot.isUnset())
index f8854e2..13129a6 100644 (file)
@@ -697,10 +697,9 @@ JSModuleNamespaceObject* AbstractModuleRecord::getModuleNamespace(ExecState* exe
     IdentifierSet exportedNames;
     getExportedNames(exec, this, exportedNames);
 
-    Vector<std::pair<Identifier, Resolution>> resolutions;
+    IdentifierSet unambiguousNames;
     for (auto& name : exportedNames) {
-        Identifier ident = Identifier::fromUid(exec, name.get());
-        const Resolution resolution = resolveExport(exec, ident);
+        const AbstractModuleRecord::Resolution resolution = resolveExport(exec, Identifier::fromUid(exec, name.get()));
         switch (resolution.type) {
         case Resolution::Type::NotFound:
             throwSyntaxError(exec, scope, makeString("Exported binding name '", String(name.get()), "' is not found."));
@@ -714,12 +713,12 @@ JSModuleNamespaceObject* AbstractModuleRecord::getModuleNamespace(ExecState* exe
             break;
 
         case Resolution::Type::Resolved:
-            resolutions.append({ WTFMove(ident), resolution });
+            unambiguousNames.add(name);
             break;
         }
     }
 
-    m_moduleNamespaceObject.set(vm, this, JSModuleNamespaceObject::create(exec, globalObject, globalObject->moduleNamespaceObjectStructure(), this, WTFMove(resolutions)));
+    m_moduleNamespaceObject.set(vm, this, JSModuleNamespaceObject::create(exec, globalObject, globalObject->moduleNamespaceObjectStructure(), this, unambiguousNames));
     return m_moduleNamespaceObject.get();
 }
 
index 3606882..797dfea 100644 (file)
@@ -41,7 +41,7 @@ JSModuleNamespaceObject::JSModuleNamespaceObject(VM& vm, Structure* structure)
 {
 }
 
-void JSModuleNamespaceObject::finishCreation(ExecState* exec, JSGlobalObject*, AbstractModuleRecord* moduleRecord, Vector<std::pair<Identifier, AbstractModuleRecord::Resolution>>&& resolutions)
+void JSModuleNamespaceObject::finishCreation(ExecState* exec, JSGlobalObject*, AbstractModuleRecord* moduleRecord, const IdentifierSet& exports)
 {
     VM& vm = exec->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
@@ -54,25 +54,17 @@ void JSModuleNamespaceObject::finishCreation(ExecState* exec, JSGlobalObject*, A
     //     The list is ordered as if an Array of those String values had been sorted using Array.prototype.sort using SortCompare as comparefn.
     //
     // Sort the exported names by the code point order.
-    std::sort(resolutions.begin(), resolutions.end(), [] (const auto& lhs, const auto& rhs) {
-        return codePointCompare(lhs.first.impl(), rhs.first.impl()) < 0;
+    Vector<UniquedStringImpl*> temporaryVector(exports.size(), nullptr);
+    std::transform(exports.begin(), exports.end(), temporaryVector.begin(), [](const RefPtr<WTF::UniquedStringImpl>& ref) {
+        return ref.get();
     });
+    std::sort(temporaryVector.begin(), temporaryVector.end(), [] (UniquedStringImpl* lhs, UniquedStringImpl* rhs) {
+        return codePointCompare(lhs, rhs) < 0;
+    });
+    for (auto* identifier : temporaryVector)
+        m_exports.add(identifier);
 
     m_moduleRecord.set(vm, this, moduleRecord);
-    {
-        unsigned moduleRecordOffset = 0;
-        m_names.reserveCapacity(resolutions.size());
-        for (const auto& pair : resolutions) {
-            moduleRecordAt(moduleRecordOffset).set(vm, this, pair.second.moduleRecord);
-            m_names.append(pair.first);
-            m_exports.add(pair.first.impl(), ExportEntry {
-                pair.second.localName,
-                moduleRecordOffset
-            });
-            ++moduleRecordOffset;
-        }
-    }
-
     putDirect(vm, vm.propertyNames->toStringTagSymbol, jsString(&vm, "Module"), DontEnum | DontDelete | ReadOnly);
 
     // http://www.ecma-international.org/ecma-262/6.0/#sec-module-namespace-exotic-objects-getprototypeof
@@ -95,22 +87,6 @@ void JSModuleNamespaceObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
     ASSERT_GC_OBJECT_INHERITS(thisObject, info());
     Base::visitChildren(thisObject, visitor);
     visitor.append(thisObject->m_moduleRecord);
-    for (unsigned i = 0; i < thisObject->m_names.size(); ++i)
-        visitor.appendHidden(thisObject->moduleRecordAt(i));
-}
-
-static JSValue getValue(JSModuleEnvironment* environment, PropertyName localName, ScopeOffset& scopeOffset)
-{
-    SymbolTable* symbolTable = environment->symbolTable();
-    {
-        ConcurrentJSLocker locker(symbolTable->m_lock);
-        auto iter = symbolTable->find(locker, localName.uid());
-        ASSERT(iter != symbolTable->end(locker));
-        SymbolTableEntry& entry = iter->value;
-        ASSERT(!entry.isNull());
-        scopeOffset = entry.scopeOffset();
-    }
-    return environment->variableAt(scopeOffset).get();
 }
 
 bool JSModuleNamespaceObject::getOwnPropertySlot(JSObject* cell, ExecState* exec, PropertyName propertyName, PropertySlot& slot)
@@ -128,29 +104,40 @@ bool JSModuleNamespaceObject::getOwnPropertySlot(JSObject* cell, ExecState* exec
     if (propertyName.isSymbol())
         return JSObject::getOwnPropertySlot(thisObject, exec, propertyName, slot);
 
+    // FIXME: Add IC for module namespace object.
+    // https://bugs.webkit.org/show_bug.cgi?id=160590
+    slot.disableCaching();
     slot.setIsTaintedByOpaqueObject();
-
-    auto iterator = thisObject->m_exports.find(propertyName.uid());
-    if (iterator == thisObject->m_exports.end())
+    if (!thisObject->m_exports.contains(propertyName.uid()))
         return false;
-    ExportEntry& exportEntry = iterator->value;
 
     switch (slot.internalMethodType()) {
-    case PropertySlot::InternalMethodType::GetOwnProperty:
-    case PropertySlot::InternalMethodType::Get: {
-        JSModuleEnvironment* environment = thisObject->moduleRecordAt(exportEntry.moduleRecordOffset)->moduleEnvironment();
-        ScopeOffset scopeOffset;
-        JSValue value = getValue(environment, exportEntry.localName, scopeOffset);
+    case PropertySlot::InternalMethodType::Get:
+    case PropertySlot::InternalMethodType::GetOwnProperty: {
+        AbstractModuleRecord* moduleRecord = thisObject->moduleRecord();
+
+        AbstractModuleRecord::Resolution resolution = moduleRecord->resolveExport(exec, Identifier::fromUid(exec, propertyName.uid()));
+        ASSERT(resolution.type != AbstractModuleRecord::Resolution::Type::NotFound && resolution.type != AbstractModuleRecord::Resolution::Type::Ambiguous);
+
+        AbstractModuleRecord* targetModule = resolution.moduleRecord;
+        JSModuleEnvironment* targetEnvironment = targetModule->moduleEnvironment();
+
+        PropertySlot trampolineSlot(targetEnvironment, PropertySlot::InternalMethodType::Get);
+        bool found = targetEnvironment->methodTable(vm)->getOwnPropertySlot(targetEnvironment, exec, resolution.localName, trampolineSlot);
+        ASSERT_UNUSED(found, found);
+
+        JSValue value = trampolineSlot.getValue(exec, propertyName);
+        ASSERT(!scope.exception());
+
         // If the value is filled with TDZ value, throw a reference error.
         if (!value) {
             throwVMError(exec, scope, createTDZError(exec));
             return false;
         }
 
-        slot.setValueModuleNamespace(thisObject, DontDelete, value, environment, scopeOffset);
+        slot.setValue(thisObject, DontDelete, value);
         return true;
     }
-
     case PropertySlot::InternalMethodType::HasProperty: {
         // Do not perform [[Get]] for [[HasProperty]].
         // [[Get]] / [[GetOwnProperty]] onto namespace object could throw an error while [[HasProperty]] just returns true here.
@@ -202,8 +189,8 @@ void JSModuleNamespaceObject::getOwnPropertyNames(JSObject* cell, ExecState* exe
 {
     // http://www.ecma-international.org/ecma-262/6.0/#sec-module-namespace-exotic-objects-ownpropertykeys
     JSModuleNamespaceObject* thisObject = jsCast<JSModuleNamespaceObject*>(cell);
-    for (const auto& name : thisObject->m_names)
-        propertyNames.add(name.impl());
+    for (const auto& name : thisObject->m_exports)
+        propertyNames.add(name.get());
     return JSObject::getOwnPropertyNames(thisObject, exec, propertyNames, mode);
 }
 
index fb8ed37..b72f543 100644 (file)
 
 #pragma once
 
-#include "AbstractModuleRecord.h"
 #include "JSDestructibleObject.h"
-#include "ScopeOffset.h"
+#include <wtf/ListHashSet.h>
 
 namespace JSC {
 
-class JSModuleNamespaceObject final : public JSDestructibleObject {
+class AbstractModuleRecord;
+
+class JSModuleNamespaceObject : public JSDestructibleObject {
 public:
     typedef JSDestructibleObject Base;
     static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | GetOwnPropertySlotIsImpureForPropertyAbsence | IsImmutablePrototypeExoticObject;
 
-    static JSModuleNamespaceObject* create(ExecState* exec, JSGlobalObject* globalObject, Structure* structure, AbstractModuleRecord* moduleRecord, Vector<std::pair<Identifier, AbstractModuleRecord::Resolution>>&& resolutions)
+    static JSModuleNamespaceObject* create(ExecState* exec, JSGlobalObject* globalObject, Structure* structure, AbstractModuleRecord* moduleRecord, const IdentifierSet& exports)
     {
-        JSModuleNamespaceObject* object =
-            new (
-                NotNull,
-                allocateCell<JSModuleNamespaceObject>(exec->vm().heap, JSModuleNamespaceObject::allocationSize(resolutions.size())))
-            JSModuleNamespaceObject(exec->vm(), structure);
-        object->finishCreation(exec, globalObject, moduleRecord, WTFMove(resolutions));
+        JSModuleNamespaceObject* object = new (NotNull, allocateCell<JSModuleNamespaceObject>(exec->vm().heap)) JSModuleNamespaceObject(exec->vm(), structure);
+        object->finishCreation(exec, globalObject, moduleRecord, exports);
         return object;
     }
 
@@ -64,50 +61,17 @@ public:
     AbstractModuleRecord* moduleRecord() { return m_moduleRecord.get(); }
 
 protected:
-    JS_EXPORT_PRIVATE void finishCreation(ExecState*, JSGlobalObject*, AbstractModuleRecord*, Vector<std::pair<Identifier, AbstractModuleRecord::Resolution>>&&);
+    JS_EXPORT_PRIVATE void finishCreation(ExecState*, JSGlobalObject*, AbstractModuleRecord*, const IdentifierSet& exports);
     JS_EXPORT_PRIVATE JSModuleNamespaceObject(VM&, Structure*);
 
 private:
     static void destroy(JSCell*);
     static void visitChildren(JSCell*, SlotVisitor&);
 
-    WriteBarrierBase<AbstractModuleRecord>& moduleRecordAt(unsigned offset)
-    {
-        return moduleRecords()[offset];
-    }
-
-    WriteBarrierBase<AbstractModuleRecord>* moduleRecords()
-    {
-        return bitwise_cast<WriteBarrierBase<AbstractModuleRecord>*>(bitwise_cast<char*>(this) + offsetOfModuleRecords());
-    }
-
-    static size_t offsetOfModuleRecords()
-    {
-        return WTF::roundUpToMultipleOf<sizeof(WriteBarrier<AbstractModuleRecord>)>(sizeof(JSModuleNamespaceObject));
-    }
-
-    static size_t allocationSize(unsigned moduleRecords)
-    {
-        return offsetOfModuleRecords() + moduleRecords * sizeof(WriteBarrier<AbstractModuleRecord>);
-    }
-
-    struct ExportEntry {
-        Identifier localName;
-        unsigned moduleRecordOffset;
-    };
-
-    typedef HashMap<RefPtr<UniquedStringImpl>, ExportEntry, IdentifierRepHash, HashTraits<RefPtr<UniquedStringImpl>>> ExportMap;
+    typedef WTF::ListHashSet<RefPtr<UniquedStringImpl>, IdentifierRepHash> OrderedIdentifierSet;
 
-    ExportMap m_exports;
-    Vector<Identifier> m_names;
+    OrderedIdentifierSet m_exports;
     WriteBarrier<AbstractModuleRecord> m_moduleRecord;
 };
 
-inline bool isJSModuleNamespaceObject(JSCell* cell)
-{
-    return cell->classInfo(*cell->vm()) == JSModuleNamespaceObject::info();
-}
-
-inline bool isJSModuleNamespaceObject(JSValue v) { return v.isCell() && isJSModuleNamespaceObject(v.asCell()); }
-
 } // namespace JSC
index 020947b..9e69b0f 100644 (file)
@@ -40,6 +40,11 @@ public:
 
     DECLARE_EXPORT_INFO;
 
+    JSModuleEnvironment* moduleEnvironment()
+    {
+        ASSERT(m_moduleEnvironment);
+        return m_moduleEnvironment.get();
+    }
     static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
     static JSModuleRecord* create(ExecState*, VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&);
 
index a7f0a60..387e31b 100644 (file)
@@ -23,7 +23,6 @@
 #include "JSCJSValue.h"
 #include "PropertyName.h"
 #include "PropertyOffset.h"
-#include "ScopeOffset.h"
 #include <wtf/Assertions.h>
 
 namespace JSC {
@@ -33,7 +32,6 @@ class GetterSetter;
 class ExecState;
 class GetterSetter;
 class JSObject;
-class JSModuleEnvironment;
 
 // ECMA 262-3 8.6.1
 // Property attributes
@@ -88,12 +86,6 @@ public:
         VMInquiry, // Our VM is just poking around. When this is the InternalMethodType, getOwnPropertySlot is not allowed to do user observable actions.
     };
 
-    enum class AdditionalDataType : uint8_t {
-        None,
-        DOMJIT, // Annotated with DOMJIT information.
-        ModuleNamespace, // ModuleNamespaceObject's environment access.
-    };
-
     explicit PropertySlot(const JSValue thisValue, InternalMethodType internalMethodType)
         : m_offset(invalidOffset)
         , m_thisValue(thisValue)
@@ -102,7 +94,6 @@ public:
         , m_cacheability(CachingAllowed)
         , m_propertyType(TypeUnset)
         , m_internalMethodType(internalMethodType)
-        , m_additionalDataType(AdditionalDataType::None)
         , m_isTaintedByOpaqueObject(false)
     {
     }
@@ -172,21 +163,7 @@ public:
 
     DOMJIT::GetterSetter* domJIT() const
     {
-        if (m_additionalDataType == AdditionalDataType::DOMJIT)
-            return m_additionalData.domJIT;
-        return nullptr;
-    }
-
-    struct ModuleNamespaceSlot {
-        JSModuleEnvironment* environment;
-        unsigned scopeOffset;
-    };
-
-    std::optional<ModuleNamespaceSlot> moduleNamespaceSlot() const
-    {
-        if (m_additionalDataType == AdditionalDataType::ModuleNamespace)
-            return m_additionalData.moduleNamespaceSlot;
-        return std::nullopt;
+        return m_domJIT;
     }
 
     void setValue(JSObject* slotBase, unsigned attributes, JSValue value)
@@ -229,14 +206,6 @@ public:
         m_offset = invalidOffset;
     }
 
-    void setValueModuleNamespace(JSObject* slotBase, unsigned attributes, JSValue value, JSModuleEnvironment* environment, ScopeOffset scopeOffset)
-    {
-        setValue(slotBase, attributes, value);
-        m_additionalDataType = AdditionalDataType::ModuleNamespace;
-        m_additionalData.moduleNamespaceSlot.environment = environment;
-        m_additionalData.moduleNamespaceSlot.scopeOffset = scopeOffset.offset();
-    }
-
     void setCustom(JSObject* slotBase, unsigned attributes, GetValueFunc getValue)
     {
         ASSERT(attributes == attributesForStructure(attributes));
@@ -251,7 +220,7 @@ public:
         m_offset = invalidOffset;
     }
     
-    void setCacheableCustom(JSObject* slotBase, unsigned attributes, GetValueFunc getValue)
+    void setCacheableCustom(JSObject* slotBase, unsigned attributes, GetValueFunc getValue, DOMJIT::GetterSetter* domJIT = nullptr)
     {
         ASSERT(attributes == attributesForStructure(attributes));
         
@@ -263,15 +232,7 @@ public:
         m_slotBase = slotBase;
         m_propertyType = TypeCustom;
         m_offset = !invalidOffset;
-    }
-
-    void setCacheableCustom(JSObject* slotBase, unsigned attributes, GetValueFunc getValue, DOMJIT::GetterSetter* domJIT)
-    {
-        setCacheableCustom(slotBase, attributes, getValue);
-        if (domJIT) {
-            m_additionalDataType = AdditionalDataType::DOMJIT;
-            m_additionalData.domJIT = domJIT;
-        }
+        m_domJIT = domJIT;
     }
 
     void setCustomGetterSetter(JSObject* slotBase, unsigned attributes, CustomGetterSetter* getterSetter)
@@ -367,11 +328,7 @@ private:
     CacheabilityType m_cacheability;
     PropertyType m_propertyType;
     InternalMethodType m_internalMethodType;
-    AdditionalDataType m_additionalDataType;
-    union {
-        DOMJIT::GetterSetter* domJIT;
-        ModuleNamespaceSlot moduleNamespaceSlot;
-    } m_additionalData;
+    DOMJIT::GetterSetter* m_domJIT { nullptr };
     bool m_isTaintedByOpaqueObject;
 };