diff --git a/bin/NativeTests/JsRTApiTest.cpp b/bin/NativeTests/JsRTApiTest.cpp index 65ce8286610..51388ba7e73 100644 --- a/bin/NativeTests/JsRTApiTest.cpp +++ b/bin/NativeTests/JsRTApiTest.cpp @@ -2063,6 +2063,7 @@ namespace JsRTApiTest JsRTApiTest::WithSetup(JsRuntimeAttributeEnableExperimentalFeatures, ReentrantParseModuleTest); } + ModuleResponseData reentrantNoErrorParseData; static JsErrorCode CALLBACK reentrantNoErrorParse_FIMC(_In_ JsModuleRecord referencingModule, _In_ JsValueRef specifier, _Outptr_result_maybenull_ JsModuleRecord* dependentModuleRecord) { @@ -2131,6 +2132,49 @@ namespace JsRTApiTest JsRTApiTest::WithSetup(JsRuntimeAttributeEnableExperimentalFeatures, ReentrantNoErrorParseModuleTest); } + static JsErrorCode CALLBACK FIMC1(_In_ JsModuleRecord referencingModule, _In_ JsValueRef specifier, _Outptr_result_maybenull_ JsModuleRecord* dependentModuleRecord) + { + JsModuleRecord moduleRecord = JS_INVALID_REFERENCE; + LPCWSTR specifierStr; + size_t length; + JsErrorCode errorCode = JsStringToPointer(specifier, &specifierStr, &length); + REQUIRE(errorCode == JsNoError); + + if (wcscmp(specifierStr, _u("foo.js")) == 0) + { + errorCode = JsInitializeModuleRecord(referencingModule, specifier, &moduleRecord); + REQUIRE(errorCode == JsNoError); + *dependentModuleRecord = moduleRecord; + } + return JsNoError; + } + + static JsErrorCode CALLBACK NMRC1(_In_opt_ JsModuleRecord referencingModule, _In_opt_ JsValueRef exceptionVar) + { + // NotifyModuleReadyCallback handling. + + return JsNoError; + } + + void SomebugTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) + { + JsModuleRecord rec; + JsInitializeModuleRecord(nullptr, nullptr, &rec); + JsSetModuleHostInfo(rec, JsModuleHostInfo_FetchImportedModuleCallback, FIMC1); + JsSetModuleHostInfo(rec, JsModuleHostInfo_FetchImportedModuleFromScriptCallback, FIMC1); + JsSetModuleHostInfo(rec, JsModuleHostInfo_NotifyModuleReadyCallback, NMRC1); + + JsValueRef F = JS_INVALID_REFERENCE; + JsErrorCode err = JsRunScript(_u("var j = import('foo.js').then(mod => { mod.bar(); })"), 0, _u(""), &F); + + CHECK(err == JsNoError); + } + + TEST_CASE("ApiTest_SomebugTest", "[ApiTest]") + { + JsRTApiTest::WithSetup(JsRuntimeAttributeEnableExperimentalFeatures, SomebugTest); + + } void ObjectHasOwnPropertyMethodTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime) { JsValueRef proto = JS_INVALID_REFERENCE; diff --git a/lib/Common/ConfigFlagsList.h b/lib/Common/ConfigFlagsList.h index 3ff37e53e6d..ab568400590 100644 --- a/lib/Common/ConfigFlagsList.h +++ b/lib/Common/ConfigFlagsList.h @@ -604,6 +604,7 @@ PHASE(All) #define DEFAULT_CONFIG_ES7TrailingComma (true) #define DEFAULT_CONFIG_ES7ValuesEntries (true) #define DEFAULT_CONFIG_ESObjectGetOwnPropertyDescriptors (true) +#define DEFAULT_CONFIG_ESDynamicImport (false) #define DEFAULT_CONFIG_ESSharedArrayBuffer (true) @@ -1037,6 +1038,11 @@ FLAGPR (Boolean, ES6, ES7TrailingComma , "Enable ES7 trailing co FLAGPR (Boolean, ES6, ES6IsConcatSpreadable , "Enable ES6 isConcatSpreadable Symbol" , DEFAULT_CONFIG_ES6IsConcatSpreadable) FLAGPR (Boolean, ES6, ES6Math , "Enable ES6 Math extensions" , DEFAULT_CONFIG_ES6Math) +#ifndef COMPILE_DISABLE_ESDynamicImport + #define COMPILE_DISABLE_ESDynamicImport 0 +#endif +FLAGPR_REGOVR_EXP(Boolean, ES6, ESDynamicImport , "Enable dynamic import" , DEFAULT_CONFIG_ESDynamicImport) + FLAGPR (Boolean, ES6, ES6Module , "Enable ES6 Modules" , DEFAULT_CONFIG_ES6Module) FLAGPR (Boolean, ES6, ES6Object , "Enable ES6 Object extensions" , DEFAULT_CONFIG_ES6Object) FLAGPR (Boolean, ES6, ES6Number , "Enable ES6 Number extensions" , DEFAULT_CONFIG_ES6Number) diff --git a/lib/Parser/Parse.cpp b/lib/Parser/Parse.cpp index bc7e8d68d84..7713e57658d 100644 --- a/lib/Parser/Parse.cpp +++ b/lib/Parser/Parse.cpp @@ -2646,6 +2646,11 @@ ParseNodePtr Parser::ParseImport() // import() if (m_token.tk == tkLParen) { + if (!m_scriptContext->GetConfig()->IsESDynamicImportEnabled()) + { + Error(ERRsyntax); + } + ParseNodePtr pnode = ParseImportCall(); BOOL fCanAssign; IdentToken token; @@ -3522,7 +3527,7 @@ LFunction : break; case tkIMPORT: - if (m_scriptContext->GetConfig()->IsES6ModuleEnabled()) + if (m_scriptContext->GetConfig()->IsES6ModuleEnabled() && m_scriptContext->GetConfig()->IsESDynamicImportEnabled()) { m_pscan->Scan(); ChkCurTokNoScan(tkLParen, ERRnoLparen); diff --git a/lib/Runtime/Base/ThreadConfigFlagsList.h b/lib/Runtime/Base/ThreadConfigFlagsList.h index b1a0e8f11be..8a23849f862 100644 --- a/lib/Runtime/Base/ThreadConfigFlagsList.h +++ b/lib/Runtime/Base/ThreadConfigFlagsList.h @@ -46,6 +46,7 @@ FLAG_RELEASE(SkipSplitOnNoResult, SkipSplitOnNoResult) FLAG_RELEASE(IsES7AsyncAndAwaitEnabled, ES7AsyncAwait) FLAG_RELEASE(IsESObjectGetOwnPropertyDescriptorsEnabled, ESObjectGetOwnPropertyDescriptors) FLAG_RELEASE(IsESSharedArrayBufferEnabled, ESSharedArrayBuffer) +FLAG_RELEASE(IsESDynamicImportEnabled, ESDynamicImport) #ifdef ENABLE_PROJECTION FLAG(AreWinRTDelegatesInterfaces, WinRTDelegateInterfaces) FLAG_RELEASE(IsWinRTAdaptiveAppsEnabled, WinRTAdaptiveApps) diff --git a/test/es6/rlexe.xml b/test/es6/rlexe.xml index 98dd00ec596..9cd6383f547 100644 --- a/test/es6/rlexe.xml +++ b/test/es6/rlexe.xml @@ -1366,14 +1366,14 @@ dynamic-module-functionality.js - -ES6Module -args summary -endargs + -ES6Module -ESDynamicImport -args summary -endargs exclude_sanitize_address dynamic-module-import-specifier.js - -MuteHostErrorMsg -ES6Module -args summary -endargs + -MuteHostErrorMsg -ESDynamicImport -ES6Module -args summary -endargs exclude_sanitize_address @@ -1410,7 +1410,7 @@ bug_OS12095746.js - -MuteHostErrorMsg -IgnoreScriptErrorCode -TraceHostCallback -ES6Module + -MuteHostErrorMsg -IgnoreScriptErrorCode -TraceHostCallback -ES6Module -ESDynamicImport exclude_dynapogo,exclude_sanitize_address,bugfix,exclude_drt bug_OS12095746.baseline @@ -1459,7 +1459,7 @@ bug_issue_3076.js - -force:deferparse + -force:deferparse -ESDynamicImport BugFix,exclude_sanitize_address