[JSC] Introduce import.meta
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 5 Oct 2017 03:57:38 +0000 (03:57 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 5 Oct 2017 03:57:38 +0000 (03:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=177703

Reviewed by Filip Pizlo.

JSTests:

* modules/import-meta-syntax.js: Added.
(shouldThrow):
(shouldNotThrow):
* modules/import-meta.js: Added.
* modules/import-meta/cocoa.js: Added.
* modules/resources/assert.js:
(export.shouldNotThrow):
* stress/import-syntax.js:

Source/JavaScriptCore:

This patch adds stage 3 `import.meta`[1].
We add a new hook function moduleLoaderCreateImportMetaProperties, which creates
import meta properties object to this module. And we set this object as @meta
private variable in module environments. So module code can access this by accessing
@meta private variable.

[1]: https://github.com/tc39/proposal-import-meta

* builtins/BuiltinNames.h:
* builtins/ModuleLoaderPrototype.js:
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::BytecodeGenerator):
* jsc.cpp:
(GlobalObject::moduleLoaderCreateImportMetaProperties):
* parser/Parser.cpp:
(JSC::Parser<LexerType>::parseModuleSourceElements):
(JSC::Parser<LexerType>::parseMemberExpression):
* runtime/JSGlobalObject.cpp:
* runtime/JSGlobalObject.h:
* runtime/JSModuleLoader.cpp:
(JSC::JSModuleLoader::createImportMetaProperties):
* runtime/JSModuleLoader.h:
* runtime/JSModuleRecord.cpp:
(JSC::JSModuleRecord::link):
(JSC::JSModuleRecord::instantiateDeclarations):
* runtime/JSModuleRecord.h:
* runtime/ModuleLoaderPrototype.cpp:
(JSC::moduleLoaderPrototypeModuleDeclarationInstantiation):

Source/WebCore:

* bindings/js/JSDOMWindowBase.cpp:
* bindings/js/JSWorkerGlobalScopeBase.cpp:

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

22 files changed:
JSTests/ChangeLog
JSTests/modules/import-meta-syntax.js [new file with mode: 0644]
JSTests/modules/import-meta.js [new file with mode: 0644]
JSTests/modules/import-meta/cocoa.js [new file with mode: 0644]
JSTests/modules/resources/assert.js
JSTests/stress/import-syntax.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/builtins/BuiltinNames.h
Source/JavaScriptCore/builtins/ModuleLoaderPrototype.js
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
Source/JavaScriptCore/jsc.cpp
Source/JavaScriptCore/parser/Parser.cpp
Source/JavaScriptCore/runtime/JSGlobalObject.cpp
Source/JavaScriptCore/runtime/JSGlobalObject.h
Source/JavaScriptCore/runtime/JSModuleLoader.cpp
Source/JavaScriptCore/runtime/JSModuleLoader.h
Source/JavaScriptCore/runtime/JSModuleRecord.cpp
Source/JavaScriptCore/runtime/JSModuleRecord.h
Source/JavaScriptCore/runtime/ModuleLoaderPrototype.cpp
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMWindowBase.cpp
Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp

index a6ad5da..a0e534b 100644 (file)
@@ -1,3 +1,19 @@
+2017-09-30  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Introduce import.meta
+        https://bugs.webkit.org/show_bug.cgi?id=177703
+
+        Reviewed by Filip Pizlo.
+
+        * modules/import-meta-syntax.js: Added.
+        (shouldThrow):
+        (shouldNotThrow):
+        * modules/import-meta.js: Added.
+        * modules/import-meta/cocoa.js: Added.
+        * modules/resources/assert.js:
+        (export.shouldNotThrow):
+        * stress/import-syntax.js:
+
 2017-10-04  Saam Barati  <sbarati@apple.com>
 
         Make pertinent AccessCases watch the poly proto watchpoint
diff --git a/JSTests/modules/import-meta-syntax.js b/JSTests/modules/import-meta-syntax.js
new file mode 100644 (file)
index 0000000..3edf4e5
--- /dev/null
@@ -0,0 +1,25 @@
+import { shouldThrow, shouldNotThrow } from "./resources/assert.js";
+
+shouldThrow(() => {
+    new Function(`import.meta`);
+}, `SyntaxError: import.meta is only valid inside modules.`);
+
+shouldNotThrow(() => {
+    checkModuleSyntax(`import.meta`);
+});
+
+shouldThrow(() => {
+    checkModuleSyntax(`(import.cocoa)`);
+}, `SyntaxError: Unexpected identifier 'cocoa'. "import." can only followed with meta.:1`);
+
+shouldThrow(() => {
+    checkModuleSyntax(`(import["Cocoa"])`);
+}, `SyntaxError: Unexpected token '['. import call expects exactly one argument.:1`);
+
+shouldThrow(() => {
+    checkModuleSyntax(`import.cocoa`);
+}, `SyntaxError: Unexpected identifier 'cocoa'. "import." can only followed with meta.:1`);
+
+shouldThrow(() => {
+    checkModuleSyntax(`import["Cocoa"]`);
+}, `SyntaxError: Unexpected token '['. Expected namespace import or import list.:1`);
diff --git a/JSTests/modules/import-meta.js b/JSTests/modules/import-meta.js
new file mode 100644 (file)
index 0000000..02fd14e
--- /dev/null
@@ -0,0 +1,11 @@
+import { shouldBe, shouldNotBe } from "./resources/assert.js";
+import { cocoa } from "./import-meta/cocoa.js"
+
+shouldNotBe(cocoa, import.meta);
+shouldBe(typeof cocoa, "object");
+shouldBe(typeof import.meta, "object");
+shouldBe(import.meta.filename.endsWith("import-meta.js"), true);
+shouldBe(cocoa.filename.endsWith("cocoa.js"), true);
+
+shouldBe(Reflect.getPrototypeOf(cocoa), null);
+shouldBe(Reflect.getPrototypeOf(import.meta), null);
diff --git a/JSTests/modules/import-meta/cocoa.js b/JSTests/modules/import-meta/cocoa.js
new file mode 100644 (file)
index 0000000..96d1205
--- /dev/null
@@ -0,0 +1,4 @@
+let meta = import.meta;
+export {
+    meta as cocoa
+}
index fbf3bd5..6d94fb0 100644 (file)
@@ -22,3 +22,7 @@ export function shouldThrow(func, errorMessage) {
     if (String(error) !== errorMessage)
         throw new Error(`bad error: ${String(error)}`);
 }
+
+export function shouldNotThrow(func) {
+    func();
+}
index 934fcf2..2b96be4 100644 (file)
@@ -27,7 +27,7 @@ async function testSyntax(script, message) {
 
 testSyntaxError(`import)`, `SyntaxError: Unexpected token ')'. import call expects exactly one argument.`);
 testSyntaxError(`new import(`, `SyntaxError: Cannot use new with import.`);
-testSyntaxError(`import.hello()`, `SyntaxError: Unexpected token '.'. import call expects exactly one argument.`);
+testSyntaxError(`import.hello()`, `SyntaxError: Unexpected identifier 'hello'. "import." can only followed with meta.`);
 testSyntaxError(`import[`, `SyntaxError: Unexpected token '['. import call expects exactly one argument.`);
 testSyntaxError(`import<`, `SyntaxError: Unexpected token '<'. import call expects exactly one argument.`);
 
index 1e83301..5fd9933 100644 (file)
@@ -1,3 +1,39 @@
+2017-09-30  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Introduce import.meta
+        https://bugs.webkit.org/show_bug.cgi?id=177703
+
+        Reviewed by Filip Pizlo.
+
+        This patch adds stage 3 `import.meta`[1].
+        We add a new hook function moduleLoaderCreateImportMetaProperties, which creates
+        import meta properties object to this module. And we set this object as @meta
+        private variable in module environments. So module code can access this by accessing
+        @meta private variable.
+
+        [1]: https://github.com/tc39/proposal-import-meta
+
+        * builtins/BuiltinNames.h:
+        * builtins/ModuleLoaderPrototype.js:
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::BytecodeGenerator):
+        * jsc.cpp:
+        (GlobalObject::moduleLoaderCreateImportMetaProperties):
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseModuleSourceElements):
+        (JSC::Parser<LexerType>::parseMemberExpression):
+        * runtime/JSGlobalObject.cpp:
+        * runtime/JSGlobalObject.h:
+        * runtime/JSModuleLoader.cpp:
+        (JSC::JSModuleLoader::createImportMetaProperties):
+        * runtime/JSModuleLoader.h:
+        * runtime/JSModuleRecord.cpp:
+        (JSC::JSModuleRecord::link):
+        (JSC::JSModuleRecord::instantiateDeclarations):
+        * runtime/JSModuleRecord.h:
+        * runtime/ModuleLoaderPrototype.cpp:
+        (JSC::moduleLoaderPrototypeModuleDeclarationInstantiation):
+
 2017-10-04  Saam Barati  <sbarati@apple.com>
 
         Make pertinent AccessCases watch the poly proto watchpoint
index 00399c8..6c38b7a 100644 (file)
@@ -194,6 +194,7 @@ namespace JSC {
     macro(CompileError) \
     macro(LinkError) \
     macro(RuntimeError) \
+    macro(meta) \
 
 namespace Symbols {
 #define DECLARE_BUILTIN_STATIC_SYMBOLS(name) extern SymbolImpl::StaticSymbolImpl name##Symbol;
index 29556ea..535a240 100644 (file)
@@ -366,7 +366,7 @@ function link(entry, fetcher)
             this.link(pair.value.registryEntry, fetcher);
         }
 
-        this.moduleDeclarationInstantiation(entry.module, fetcher);
+        this.moduleDeclarationInstantiation(entry.module, entry.key, fetcher);
     } catch (error) {
         entry.linkSucceeded = false;
         entry.linkError = error;
index 2ef3456..2e8e91a 100644 (file)
@@ -889,6 +889,8 @@ BytecodeGenerator::BytecodeGenerator(VM& vm, ModuleProgramNode* moduleProgramNod
 
     // Now declare all variables.
 
+    createVariable(m_vm->propertyNames->builtinNames().metaPrivateName(), VarKind::Scope, moduleEnvironmentSymbolTable, VerifyExisting);
+
     for (auto& entry : moduleProgramNode->varDeclarations()) {
         ASSERT(!entry.value.isLet() && !entry.value.isConst());
         if (!entry.value.isVar()) // This is either a parameter or callee.
index 8b934c9..606a797 100644 (file)
@@ -1660,6 +1660,7 @@ protected:
     static JSInternalPromise* moduleLoaderImportModule(JSGlobalObject*, ExecState*, JSModuleLoader*, JSString*, const SourceOrigin&);
     static JSInternalPromise* moduleLoaderResolve(JSGlobalObject*, ExecState*, JSModuleLoader*, JSValue, JSValue, JSValue);
     static JSInternalPromise* moduleLoaderFetch(JSGlobalObject*, ExecState*, JSModuleLoader*, JSValue, JSValue);
+    static JSObject* moduleLoaderCreateImportMetaProperties(JSGlobalObject*, ExecState*, JSModuleLoader*, JSValue, JSModuleRecord*, JSValue);
 };
 
 const ClassInfo GlobalObject::s_info = { "global", &JSGlobalObject::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(GlobalObject) };
@@ -1673,6 +1674,7 @@ const GlobalObjectMethodTable GlobalObject::s_globalObjectMethodTable = {
     &moduleLoaderResolve,
     &moduleLoaderFetch,
     nullptr, // moduleLoaderInstantiate
+    &moduleLoaderCreateImportMetaProperties,
     nullptr, // moduleLoaderEvaluate
     nullptr, // promiseRejectionTracker
     nullptr, // defaultLanguage
@@ -2006,6 +2008,19 @@ JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalObject,
     return result;
 }
 
+JSObject* GlobalObject::moduleLoaderCreateImportMetaProperties(JSGlobalObject* globalObject, ExecState* exec, JSModuleLoader*, JSValue key, JSModuleRecord*, JSValue)
+{
+    VM& vm = exec->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
+    JSObject* metaProperties = constructEmptyObject(exec, globalObject->nullPrototypeObjectStructure());
+    RETURN_IF_EXCEPTION(scope, nullptr);
+
+    metaProperties->putDirect(vm, Identifier::fromString(&vm, "filename"), key);
+    RETURN_IF_EXCEPTION(scope, nullptr);
+
+    return metaProperties;
+}
 
 static EncodedJSValue printInternal(ExecState* exec, FILE* out)
 {
index 8bc20d2..7cd8dac 100644 (file)
@@ -419,7 +419,7 @@ template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseModuleSo
         case IMPORT: {
             SavePoint savePoint = createSavePoint();
             next();
-            bool isImportDeclaration = !match(OPENPAREN);
+            bool isImportDeclaration = !match(OPENPAREN) && !match(DOT);
             restoreSavePoint(savePoint);
             if (isImportDeclaration) {
                 statement = parseImportDeclaration(context);
@@ -428,7 +428,7 @@ template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseModuleSo
                 break;
             }
 
-            // This is `import("...")` call case.
+            // This is `import("...")` call or `import.meta` meta property case.
             FALLTHROUGH;
         }
 
@@ -4687,11 +4687,25 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parseMemberExpres
     } else if (baseIsImport) {
         next();
         JSTextPosition expressionEnd = lastTokenEndPosition();
-        consumeOrFail(OPENPAREN, "import call expects exactly one argument");
-        TreeExpression expr = parseAssignmentExpression(context);
-        failIfFalse(expr, "Cannot parse expression");
-        consumeOrFail(CLOSEPAREN, "import call expects exactly one argument");
-        base = context.createImportExpr(location, expr, expressionStart, expressionEnd, lastTokenEndPosition());
+        if (consume(DOT)) {
+            if (!match(IDENT))
+                failDueToUnexpectedToken();
+            const Identifier* ident = m_token.m_data.ident;
+            if (m_vm->propertyNames->builtinNames().metaPublicName() != *ident)
+                failWithMessage("\"import.\" can only followed with meta");
+
+            semanticFailIfFalse(m_scriptMode == JSParserScriptMode::Module, "import.meta is only valid inside modules");
+
+            JSTokenLocation location(tokenLocation());
+            base = createResolveAndUseVariable(context, &m_vm->propertyNames->builtinNames().metaPrivateName(), false, expressionStart, location);
+            next();
+        } else {
+            consumeOrFail(OPENPAREN, "import call expects exactly one argument");
+            TreeExpression expr = parseAssignmentExpression(context);
+            failIfFalse(expr, "Cannot parse expression");
+            consumeOrFail(CLOSEPAREN, "import call expects exactly one argument");
+            base = context.createImportExpr(location, expr, expressionStart, expressionEnd, lastTokenEndPosition());
+        }
     } else if (!baseIsNewTarget) {
         const bool isAsync = match(ASYNC);
 
index 0b32d74..40e4f41 100644 (file)
@@ -255,6 +255,7 @@ const GlobalObjectMethodTable JSGlobalObject::s_globalObjectMethodTable = {
     nullptr, // moduleLoaderResolve
     nullptr, // moduleLoaderFetch
     nullptr, // moduleLoaderInstantiate
+    nullptr, // moduleLoaderCreateImportMetaProperties
     nullptr, // moduleLoaderEvaluate
     nullptr, // promiseRejectionTracker
     nullptr, // defaultLanguage
index d58dd8b..86a0164 100644 (file)
@@ -82,6 +82,7 @@ class JSArrayBufferPrototype;
 class JSGlobalObjectDebuggable;
 class JSInternalPromise;
 class JSModuleLoader;
+class JSModuleRecord;
 class JSPromise;
 class JSPromiseConstructor;
 class JSPromisePrototype;
@@ -197,6 +198,9 @@ struct GlobalObjectMethodTable {
     typedef JSInternalPromise* (*ModuleLoaderInstantiatePtr)(JSGlobalObject*, ExecState*, JSModuleLoader*, JSValue, JSValue, JSValue);
     ModuleLoaderInstantiatePtr moduleLoaderInstantiate;
 
+    typedef JSObject* (*ModuleLoaderCreateImportMetaPropertiesPtr)(JSGlobalObject*, ExecState*, JSModuleLoader*, JSValue, JSModuleRecord*, JSValue);
+    ModuleLoaderCreateImportMetaPropertiesPtr moduleLoaderCreateImportMetaProperties;
+
     typedef JSValue (*ModuleLoaderEvaluatePtr)(JSGlobalObject*, ExecState*, JSModuleLoader*, JSValue, JSValue, JSValue);
     ModuleLoaderEvaluatePtr moduleLoaderEvaluate;
 
index 56a4c2f..3d752a6 100644 (file)
@@ -43,6 +43,7 @@
 #include "ModuleAnalyzer.h"
 #include "ModuleLoaderPrototype.h"
 #include "Nodes.h"
+#include "ObjectConstructor.h"
 #include "Parser.h"
 #include "ParserError.h"
 
@@ -249,6 +250,14 @@ JSInternalPromise* JSModuleLoader::instantiate(ExecState* exec, JSValue key, JSV
     return deferred->promise();
 }
 
+JSObject* JSModuleLoader::createImportMetaProperties(ExecState* exec, JSValue key, JSModuleRecord* moduleRecord, JSValue scriptFetcher)
+{
+    JSGlobalObject* globalObject = exec->lexicalGlobalObject();
+    if (globalObject->globalObjectMethodTable()->moduleLoaderCreateImportMetaProperties)
+        return globalObject->globalObjectMethodTable()->moduleLoaderCreateImportMetaProperties(globalObject, exec, this, key, moduleRecord, scriptFetcher);
+    return constructEmptyObject(exec, exec->lexicalGlobalObject()->nullPrototypeObjectStructure());
+}
+
 JSValue JSModuleLoader::evaluate(ExecState* exec, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher)
 {
     if (Options::dumpModuleLoadingState())
index c3e023e..ff616f9 100644 (file)
@@ -74,6 +74,7 @@ public:
     JSInternalPromise* resolve(ExecState*, JSValue name, JSValue referrer, JSValue scriptFetcher);
     JSInternalPromise* fetch(ExecState*, JSValue key, JSValue scriptFetcher);
     JSInternalPromise* instantiate(ExecState*, JSValue key, JSValue source, JSValue scriptFetcher);
+    JSObject* createImportMetaProperties(ExecState*, JSValue key, JSModuleRecord*, JSValue scriptFetcher);
 
     // Additional platform dependent hooked APIs.
     JSValue evaluate(ExecState*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher);
index e13f7a8..c1c0386 100644 (file)
@@ -76,7 +76,7 @@ void JSModuleRecord::visitChildren(JSCell* cell, SlotVisitor& visitor)
     visitor.append(thisObject->m_moduleProgramExecutable);
 }
 
-void JSModuleRecord::link(ExecState* exec)
+void JSModuleRecord::link(ExecState* exec, JSValue key, JSValue scriptFetcher)
 {
     VM& vm = exec->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
@@ -87,12 +87,12 @@ void JSModuleRecord::link(ExecState* exec)
         throwSyntaxError(exec, scope);
         return;
     }
-    instantiateDeclarations(exec, executable);
+    instantiateDeclarations(exec, executable, key, scriptFetcher);
     RETURN_IF_EXCEPTION(scope, void());
     m_moduleProgramExecutable.set(vm, this, executable);
 }
 
-void JSModuleRecord::instantiateDeclarations(ExecState* exec, ModuleProgramExecutable* moduleProgramExecutable)
+void JSModuleRecord::instantiateDeclarations(ExecState* exec, ModuleProgramExecutable* moduleProgramExecutable, JSValue key, JSValue scriptFetcher)
 {
     VM& vm = exec->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
@@ -205,6 +205,14 @@ void JSModuleRecord::instantiateDeclarations(ExecState* exec, ModuleProgramExecu
         }
     }
 
+    {
+        JSObject* metaProperties = exec->lexicalGlobalObject()->moduleLoader()->createImportMetaProperties(exec, key, this, scriptFetcher);
+        RETURN_IF_EXCEPTION(scope, void());
+        bool putResult = false;
+        symbolTablePutTouchWatchpointSet(moduleEnvironment, exec, vm.propertyNames->builtinNames().metaPrivateName(), metaProperties, /* shouldThrowReadOnlyError */ false, /* ignoreReadOnlyErrors */ true, putResult);
+        RETURN_IF_EXCEPTION(scope, void());
+    }
+
     m_moduleEnvironment.set(vm, this, moduleEnvironment);
 }
 
index 0f5c2b8..1fca683 100644 (file)
@@ -45,7 +45,7 @@ public:
     static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
     static JSModuleRecord* create(ExecState*, VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&);
 
-    void link(ExecState*);
+    void link(ExecState*, JSValue key, JSValue scriptFetcher);
     JS_EXPORT_PRIVATE JSValue evaluate(ExecState*);
 
     const SourceCode& sourceCode() const { return m_sourceCode; }
@@ -60,7 +60,7 @@ private:
     static void visitChildren(JSCell*, SlotVisitor&);
     static void destroy(JSCell*);
 
-    void instantiateDeclarations(ExecState*, ModuleProgramExecutable*);
+    void instantiateDeclarations(ExecState*, ModuleProgramExecutable*, JSValue key, JSValue scriptFetcher);
 
     SourceCode m_sourceCode;
     VariableEnvironment m_declaredVariables;
index 67186e5..7ff1ccf 100644 (file)
@@ -80,7 +80,7 @@ const ClassInfo ModuleLoaderPrototype::s_info = { "ModuleLoader", &Base::s_info,
     requestLink                    JSBuiltin                                           DontEnum|Function 2
     requestReady                   JSBuiltin                                           DontEnum|Function 2
     link                           JSBuiltin                                           DontEnum|Function 2
-    moduleDeclarationInstantiation moduleLoaderPrototypeModuleDeclarationInstantiation DontEnum|Function 2
+    moduleDeclarationInstantiation moduleLoaderPrototypeModuleDeclarationInstantiation DontEnum|Function 3
     moduleEvaluation               JSBuiltin                                           DontEnum|Function 2
     evaluate                       moduleLoaderPrototypeEvaluate                       DontEnum|Function 3
     provide                        JSBuiltin                                           DontEnum|Function 3
@@ -168,7 +168,7 @@ EncodedJSValue JSC_HOST_CALL moduleLoaderPrototypeModuleDeclarationInstantiation
     if (Options::dumpModuleLoadingState())
         dataLog("Loader [link] ", moduleRecord->moduleKey(), "\n");
 
-    moduleRecord->link(exec);
+    moduleRecord->link(exec, exec->argument(1), exec->argument(2));
     RETURN_IF_EXCEPTION(scope, encodedJSValue());
 
     return JSValue::encode(jsUndefined());
index 00dfa16..8b80219 100644 (file)
@@ -1,3 +1,13 @@
+2017-09-30  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Introduce import.meta
+        https://bugs.webkit.org/show_bug.cgi?id=177703
+
+        Reviewed by Filip Pizlo.
+
+        * bindings/js/JSDOMWindowBase.cpp:
+        * bindings/js/JSWorkerGlobalScopeBase.cpp:
+
 2017-10-04  Tim Horton  <timothy_horton@apple.com>
 
         Link WebCore against CFNetwork in the CMake build
index 7f500b2..f7d3412 100644 (file)
@@ -73,6 +73,7 @@ const GlobalObjectMethodTable JSDOMWindowBase::s_globalObjectMethodTable = {
     &moduleLoaderResolve,
     &moduleLoaderFetch,
     nullptr, // moduleLoaderInstantiate
+    nullptr, // moduleLoaderCreateImportMetaProperties
     &moduleLoaderEvaluate,
     &promiseRejectionTracker,
     &defaultLanguage
index 34a51a5..e18b031 100644 (file)
@@ -60,6 +60,7 @@ const GlobalObjectMethodTable JSWorkerGlobalScopeBase::s_globalObjectMethodTable
     nullptr, // moduleLoaderResolve
     nullptr, // moduleLoaderFetch
     nullptr, // moduleLoaderInstantiate
+    nullptr, // moduleLoaderCreateImportMetaProperties
     nullptr, // moduleLoaderEvaluate
     nullptr, // promiseRejectionTracker
     &defaultLanguage