47
47
MessageQueue* WScriptJsrt::messageQueue = nullptr ;
48
48
std::map<std::string, JsModuleRecord> WScriptJsrt::moduleRecordMap;
49
49
std::map<JsModuleRecord, std::string> WScriptJsrt::moduleDirMap;
50
+ std::map<JsModuleRecord, ModuleState> WScriptJsrt::moduleErrMap;
50
51
std::map<DWORD_PTR, std::string> WScriptJsrt::scriptDirMap;
51
52
DWORD_PTR WScriptJsrt::sourceContext = 0 ;
52
53
@@ -481,6 +482,7 @@ JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileConten
481
482
}
482
483
483
484
moduleRecordMap[std::string (moduleRecordKey)] = requestModule;
485
+ moduleErrMap[requestModule] = RootModule;
484
486
}
485
487
}
486
488
else
@@ -503,9 +505,10 @@ JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileConten
503
505
504
506
errorCode = ChakraRTInterface::JsParseModuleSource (requestModule, dwSourceCookie, (LPBYTE)fileContent,
505
507
fileContentLength, JsParseModuleSourceFlags_DataIsUTF8, &errorObject);
506
- if ((errorCode != JsNoError) && errorObject != JS_INVALID_REFERENCE && fileContent != nullptr && !HostConfigFlags::flags.IgnoreScriptErrorCode )
508
+ if ((errorCode != JsNoError) && errorObject != JS_INVALID_REFERENCE && fileContent != nullptr && !HostConfigFlags::flags.IgnoreScriptErrorCode && moduleErrMap[requestModule] == RootModule )
507
509
{
508
510
ChakraRTInterface::JsSetException (errorObject);
511
+ moduleErrMap[requestModule] = ErroredModule;
509
512
return errorCode;
510
513
}
511
514
return JsNoError;
@@ -1144,6 +1147,7 @@ bool WScriptJsrt::Uninitialize()
1144
1147
// to avoid worrying about global destructor order.
1145
1148
moduleRecordMap.clear ();
1146
1149
moduleDirMap.clear ();
1150
+ moduleErrMap.clear ();
1147
1151
scriptDirMap.clear ();
1148
1152
1149
1153
auto & threadData = GetRuntimeThreadLocalData ().threadData ;
@@ -1867,15 +1871,32 @@ WScriptJsrt::ModuleMessage::~ModuleMessage()
1867
1871
1868
1872
HRESULT WScriptJsrt::ModuleMessage::Call (LPCSTR fileName)
1869
1873
{
1870
- JsErrorCode errorCode;
1874
+ JsErrorCode errorCode = JsNoError ;
1871
1875
JsValueRef result = JS_INVALID_REFERENCE;
1872
1876
HRESULT hr;
1873
1877
if (specifier == nullptr )
1874
1878
{
1875
- errorCode = ChakraRTInterface::JsModuleEvaluation (moduleRecord, &result);
1876
- if (errorCode != JsNoError)
1879
+ if (moduleErrMap[moduleRecord] != ErroredModule)
1877
1880
{
1878
- PrintException (fileName, errorCode);
1881
+ errorCode = ChakraRTInterface::JsModuleEvaluation (moduleRecord, &result);
1882
+ if (errorCode != JsNoError)
1883
+ {
1884
+ if (moduleErrMap[moduleRecord] == RootModule)
1885
+ {
1886
+ PrintException (fileName, errorCode);
1887
+ }
1888
+ else
1889
+ {
1890
+ bool hasException = false ;
1891
+ ChakraRTInterface::JsHasException (&hasException);
1892
+ if (hasException)
1893
+ {
1894
+ JsValueRef exception;
1895
+ ChakraRTInterface::JsGetAndClearException (&exception);
1896
+ exception; // unusued
1897
+ }
1898
+ }
1899
+ }
1879
1900
}
1880
1901
}
1881
1902
else
@@ -1885,13 +1906,17 @@ HRESULT WScriptJsrt::ModuleMessage::Call(LPCSTR fileName)
1885
1906
errorCode = specifierStr.GetError ();
1886
1907
if (errorCode == JsNoError)
1887
1908
{
1888
- hr = Helpers::LoadScriptFromFile (*specifierStr, fileContent, nullptr , fullPath);
1909
+ hr = Helpers::LoadScriptFromFile (*specifierStr, fileContent, nullptr , fullPath, true );
1889
1910
1890
1911
if (FAILED (hr))
1891
1912
{
1892
1913
if (!HostConfigFlags::flags.MuteHostErrorMsgIsEnabled )
1893
1914
{
1894
- fprintf (stderr, " Couldn't load file '%s'\n " , specifierStr.GetString ());
1915
+ auto actualModuleRecord = moduleRecordMap.find (*fullPath);
1916
+ if (actualModuleRecord == moduleRecordMap.end () || moduleErrMap[actualModuleRecord->second ] == RootModule)
1917
+ {
1918
+ fprintf (stderr, " Couldn't load file '%s'\n " , specifierStr.GetString ());
1919
+ }
1895
1920
}
1896
1921
LoadScript (nullptr , fullPath == nullptr ? *specifierStr : fullPath->c_str (), nullptr , " module" , true , WScriptJsrt::FinalizeFree, false );
1897
1922
goto Error;
@@ -1937,6 +1962,7 @@ JsErrorCode WScriptJsrt::FetchImportedModuleHelper(JsModuleRecord referencingMod
1937
1962
InitializeModuleInfo (specifier, moduleRecord);
1938
1963
std::string pathKey = std::string (fullPath);
1939
1964
moduleRecordMap[pathKey] = moduleRecord;
1965
+ moduleErrMap[moduleRecord] = ImportedModule;
1940
1966
ModuleMessage* moduleMessage = WScriptJsrt::ModuleMessage::Create (referencingModule, specifier, &pathKey);
1941
1967
if (moduleMessage == nullptr )
1942
1968
{
@@ -1999,7 +2025,8 @@ JsErrorCode WScriptJsrt::NotifyModuleReadyCallback(_In_opt_ JsModuleRecord refer
1999
2025
ChakraRTInterface::JsGetAndClearException (&exception);
2000
2026
exception; // unused
2001
2027
}
2002
- else
2028
+
2029
+ if (exceptionVar != nullptr || moduleErrMap[referencingModule] != ErroredModule)
2003
2030
{
2004
2031
WScriptJsrt::ModuleMessage* moduleMessage =
2005
2032
WScriptJsrt::ModuleMessage::Create (referencingModule, nullptr );
0 commit comments