Diff
Modified: trunk/JSTests/ChangeLog (212716 => 212717)
--- trunk/JSTests/ChangeLog 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/ChangeLog 2017-02-21 18:00:43 UTC (rev 212717)
@@ -1,3 +1,15 @@
+2017-02-21 Ryan Haddad <[email protected]>
+
+ 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 <[email protected]>
JSModuleNamespace object should have IC
Deleted: trunk/JSTests/modules/module-assert-access-binding.js (212716 => 212717)
--- trunk/JSTests/modules/module-assert-access-binding.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/modules/module-assert-access-binding.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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);
-}
Deleted: trunk/JSTests/modules/module-assert-access-namespace.js (212716 => 212717)
--- trunk/JSTests/modules/module-assert-access-namespace.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/modules/module-assert-access-namespace.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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);
-}
Deleted: trunk/JSTests/modules/namespace-empty.js (212716 => 212717)
--- trunk/JSTests/modules/namespace-empty.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/modules/namespace-empty.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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;
Deleted: trunk/JSTests/stress/module-namespace-access-change.js (212716 => 212717)
--- trunk/JSTests/stress/module-namespace-access-change.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/module-namespace-access-change.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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();
Deleted: trunk/JSTests/stress/module-namespace-access-non-constant.js (212716 => 212717)
--- trunk/JSTests/stress/module-namespace-access-non-constant.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/module-namespace-access-non-constant.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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();
Deleted: trunk/JSTests/stress/module-namespace-access-poly.js (212716 => 212717)
--- trunk/JSTests/stress/module-namespace-access-poly.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/module-namespace-access-poly.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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();
Deleted: trunk/JSTests/stress/module-namespace-access-transitive-exports.js (212716 => 212717)
--- trunk/JSTests/stress/module-namespace-access-transitive-exports.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/module-namespace-access-transitive-exports.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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();
Deleted: trunk/JSTests/stress/module-namespace-access.js (212716 => 212717)
--- trunk/JSTests/stress/module-namespace-access.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/module-namespace-access.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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();
Deleted: trunk/JSTests/stress/resources/module-namespace-access-transitive-exports-2.js (212716 => 212717)
--- trunk/JSTests/stress/resources/module-namespace-access-transitive-exports-2.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/resources/module-namespace-access-transitive-exports-2.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -1,10 +0,0 @@
-export let test = 42;
-export function cocoa()
-{
- return test;
-}
-
-export function change()
-{
- test = 55;
-}
Deleted: trunk/JSTests/stress/resources/module-namespace-access-transitive-exports.js (212716 => 212717)
--- trunk/JSTests/stress/resources/module-namespace-access-transitive-exports.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/resources/module-namespace-access-transitive-exports.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -1 +0,0 @@
-export * from "./module-namespace-access-transitive-exports-2.js"
Deleted: trunk/JSTests/stress/resources/module-namespace-access.js (212716 => 212717)
--- trunk/JSTests/stress/resources/module-namespace-access.js 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/JSTests/stress/resources/module-namespace-access.js 2017-02-21 18:00:43 UTC (rev 212717)
@@ -1,10 +0,0 @@
-export let test = 42;
-export function cocoa()
-{
- return test;
-}
-
-export function change()
-{
- test = 55;
-}
Modified: trunk/Source/_javascript_Core/CMakeLists.txt (212716 => 212717)
--- trunk/Source/_javascript_Core/CMakeLists.txt 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/CMakeLists.txt 2017-02-21 18:00:43 UTC (rev 212717)
@@ -228,7 +228,6 @@
bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp
bytecode/LazyOperandValueProfile.cpp
bytecode/MethodOfGettingAValueProfile.cpp
- bytecode/ModuleNamespaceAccessCase.cpp
bytecode/ModuleProgramCodeBlock.cpp
bytecode/ObjectPropertyCondition.cpp
bytecode/ObjectPropertyConditionSet.cpp
Modified: trunk/Source/_javascript_Core/ChangeLog (212716 => 212717)
--- trunk/Source/_javascript_Core/ChangeLog 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/ChangeLog 2017-02-21 18:00:43 UTC (rev 212717)
@@ -1,3 +1,15 @@
+2017-02-21 Ryan Haddad <[email protected]>
+
+ 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 <[email protected]>
JSModuleNamespace object should have IC
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (212716 => 212717)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2017-02-21 18:00:43 UTC (rev 212717)
@@ -2405,8 +2405,6 @@
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 */
@@ -4968,8 +4966,6 @@
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 */
@@ -7503,8 +7499,6 @@
0F426A461460CBAB00131F8F /* VirtualRegister.h */,
0F919D2215853CDE004A4E7D /* Watchpoint.cpp */,
0F919D2315853CDE004A4E7D /* Watchpoint.h */,
- 20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */,
- 4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */,
);
path = bytecode;
sourceTree = "<group>";
@@ -9254,7 +9248,6 @@
86704B8812DBA33700A9FE7B /* YarrParser.h in Headers */,
86704B8A12DBA33700A9FE7B /* YarrPattern.h in Headers */,
86704B4312DB8A8100A9FE7B /* YarrSyntaxChecker.h in Headers */,
- 9F63434577274FAFB9336C38 /* ModuleNamespaceAccessCase.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -10657,7 +10650,6 @@
86704B8612DBA33700A9FE7B /* YarrJIT.cpp in Sources */,
86704B8912DBA33700A9FE7B /* YarrPattern.cpp in Sources */,
86704B4212DB8A8100A9FE7B /* YarrSyntaxChecker.cpp in Sources */,
- 321D9E4CFB67423A97F191A7 /* ModuleNamespaceAccessCase.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Modified: trunk/Source/_javascript_Core/bytecode/AccessCase.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/bytecode/AccessCase.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/bytecode/AccessCase.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -37,10 +37,7 @@
#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 @@
case StringLength:
case DirectArgumentsLength:
case ScopedArgumentsLength:
- case ModuleNamespaceLoad:
case Replace:
break;
default:
@@ -152,7 +148,6 @@
case StringLength:
case DirectArgumentsLength:
case ScopedArgumentsLength:
- case ModuleNamespaceLoad:
return false;
default:
return true;
@@ -198,13 +193,6 @@
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 @@
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 @@
return;
}
- case ModuleNamespaceLoad: {
- this->as<ModuleNamespaceAccessCase>().emit(state, fallThrough);
- return;
- }
-
default: {
if (viaProxy()) {
fallThrough.append(
@@ -1014,7 +991,6 @@
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.
Modified: trunk/Source/_javascript_Core/bytecode/AccessCase.h (212716 => 212717)
--- trunk/Source/_javascript_Core/bytecode/AccessCase.h 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/bytecode/AccessCase.h 2017-02-21 18:00:43 UTC (rev 212717)
@@ -95,8 +95,7 @@
ArrayLength,
StringLength,
DirectArgumentsLength,
- ScopedArgumentsLength,
- ModuleNamespaceLoad,
+ ScopedArgumentsLength
};
enum State : uint8_t {
Modified: trunk/Source/_javascript_Core/bytecode/GetByIdStatus.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/bytecode/GetByIdStatus.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/bytecode/GetByIdStatus.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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 @@
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 @@
}
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 @@
case NoInformation:
case TakesSlowPath:
case Custom:
- case ModuleNamespace:
return false;
case Simple:
for (unsigned i = m_variants.size(); i--;) {
@@ -441,9 +420,6 @@
case Custom:
out.print("Custom");
break;
- case ModuleNamespace:
- out.print("ModuleNamespace");
- break;
case TakesSlowPath:
out.print("TakesSlowPath");
break;
Modified: trunk/Source/_javascript_Core/bytecode/GetByIdStatus.h (212716 => 212717)
--- trunk/Source/_javascript_Core/bytecode/GetByIdStatus.h 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/bytecode/GetByIdStatus.h 2017-02-21 18:00:43 UTC (rev 212717)
@@ -30,15 +30,10 @@
#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 @@
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 @@
{
ASSERT(state == NoInformation || state == TakesSlowPath || state == MakesCalls);
}
-
- GetByIdStatus(const ModuleNamespaceAccessCase&);
GetByIdStatus(
State state, bool wasSeenInJIT, const GetByIdVariant& variant = GetByIdVariant())
@@ -98,7 +84,6 @@
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; }
@@ -105,7 +90,7 @@
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; }
@@ -112,10 +97,6 @@
// 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 @@
State m_state;
Vector<GetByIdVariant, 1> m_variants;
bool m_wasSeenInJIT;
- JSModuleNamespaceObject* m_moduleNamespaceObject { nullptr };
- JSModuleEnvironment* m_moduleEnvironment { nullptr };
- ScopeOffset m_scopeOffset { };
};
} // namespace JSC
Deleted: trunk/Source/_javascript_Core/bytecode/ModuleNamespaceAccessCase.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/bytecode/ModuleNamespaceAccessCase.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/bytecode/ModuleNamespaceAccessCase.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2017 Yusuke Suzuki <[email protected]>.
- *
- * 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)
Deleted: trunk/Source/_javascript_Core/bytecode/ModuleNamespaceAccessCase.h (212716 => 212717)
--- trunk/Source/_javascript_Core/bytecode/ModuleNamespaceAccessCase.h 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/bytecode/ModuleNamespaceAccessCase.h 2017-02-21 18:00:43 UTC (rev 212717)
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2017 Yusuke Suzuki <[email protected]>.
- *
- * 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)
Modified: trunk/Source/_javascript_Core/bytecode/PolymorphicAccess.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/bytecode/PolymorphicAccess.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/bytecode/PolymorphicAccess.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -645,9 +645,6 @@
case AccessCase::ScopedArgumentsLength:
out.print("ScopedArgumentsLength");
return;
- case AccessCase::ModuleNamespaceLoad:
- out.print("ModuleNamespaceLoad");
- return;
}
RELEASE_ASSERT_NOT_REACHED();
Modified: trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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 @@
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 @@
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 @@
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()) {
Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.h (212716 => 212717)
--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.h 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.h 2017-02-21 18:00:43 UTC (rev 212717)
@@ -158,16 +158,6 @@
}
#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);
Modified: trunk/Source/_javascript_Core/jit/Repatch.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/jit/Repatch.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/jit/Repatch.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -46,10 +46,8 @@
#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 @@
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())
Modified: trunk/Source/_javascript_Core/runtime/AbstractModuleRecord.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/runtime/AbstractModuleRecord.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/runtime/AbstractModuleRecord.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -697,10 +697,9 @@
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 @@
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();
}
Modified: trunk/Source/_javascript_Core/runtime/JSModuleNamespaceObject.cpp (212716 => 212717)
--- trunk/Source/_javascript_Core/runtime/JSModuleNamespaceObject.cpp 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/runtime/JSModuleNamespaceObject.cpp 2017-02-21 18:00:43 UTC (rev 212717)
@@ -41,7 +41,7 @@
{
}
-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 @@
// 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,24 +87,8 @@
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)
{
VM& vm = exec->vm();
@@ -128,19 +104,31 @@
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));
@@ -147,10 +135,9 @@
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 @@
{
// 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);
}
Modified: trunk/Source/_javascript_Core/runtime/JSModuleNamespaceObject.h (212716 => 212717)
--- trunk/Source/_javascript_Core/runtime/JSModuleNamespaceObject.h 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/runtime/JSModuleNamespaceObject.h 2017-02-21 18:00:43 UTC (rev 212717)
@@ -25,25 +25,22 @@
#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,7 +61,7 @@
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:
@@ -71,43 +68,10 @@
static void destroy(JSCell*);
static void visitChildren(JSCell*, SlotVisitor&);
- WriteBarrierBase<AbstractModuleRecord>& moduleRecordAt(unsigned offset)
- {
- return moduleRecords()[offset];
- }
+ typedef WTF::ListHashSet<RefPtr<UniquedStringImpl>, IdentifierRepHash> OrderedIdentifierSet;
- 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;
-
- 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
Modified: trunk/Source/_javascript_Core/runtime/JSModuleRecord.h (212716 => 212717)
--- trunk/Source/_javascript_Core/runtime/JSModuleRecord.h 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/runtime/JSModuleRecord.h 2017-02-21 18:00:43 UTC (rev 212717)
@@ -40,6 +40,11 @@
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&);
Modified: trunk/Source/_javascript_Core/runtime/PropertySlot.h (212716 => 212717)
--- trunk/Source/_javascript_Core/runtime/PropertySlot.h 2017-02-21 17:25:02 UTC (rev 212716)
+++ trunk/Source/_javascript_Core/runtime/PropertySlot.h 2017-02-21 18:00:43 UTC (rev 212717)
@@ -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 ExecState;
class GetterSetter;
class JSObject;
-class JSModuleEnvironment;
// ECMA 262-3 8.6.1
// Property attributes
@@ -88,12 +86,6 @@
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 @@
, m_cacheability(CachingAllowed)
, m_propertyType(TypeUnset)
, m_internalMethodType(internalMethodType)
- , m_additionalDataType(AdditionalDataType::None)
, m_isTaintedByOpaqueObject(false)
{
}
@@ -172,23 +163,9 @@
DOMJIT::GetterSetter* domJIT() const
{
- if (m_additionalDataType == AdditionalDataType::DOMJIT)
- return m_additionalData.domJIT;
- return nullptr;
+ return m_domJIT;
}
- struct ModuleNamespaceSlot {
- JSModuleEnvironment* environment;
- unsigned scopeOffset;
- };
-
- std::optional<ModuleNamespaceSlot> moduleNamespaceSlot() const
- {
- if (m_additionalDataType == AdditionalDataType::ModuleNamespace)
- return m_additionalData.moduleNamespaceSlot;
- return std::nullopt;
- }
-
void setValue(JSObject* slotBase, unsigned attributes, JSValue value)
{
ASSERT(attributes == attributesForStructure(attributes));
@@ -229,14 +206,6 @@
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 @@
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,17 +232,9 @@
m_slotBase = slotBase;
m_propertyType = TypeCustom;
m_offset = !invalidOffset;
+ m_domJIT = domJIT;
}
- 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;
- }
- }
-
void setCustomGetterSetter(JSObject* slotBase, unsigned attributes, CustomGetterSetter* getterSetter)
{
ASSERT(attributes == attributesForStructure(attributes));
@@ -367,11 +328,7 @@
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;
};