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
@@ -223,7 +224,6 @@ JsValueRef WScriptJsrt::LoadScriptFileHelper(JsValueRef callee, JsValueRef *argu
223
224
hr = Helpers::LoadScriptFromFile (*fileName, fileContent);
224
225
if (FAILED (hr))
225
226
{
226
- // check if have it registered
227
227
fprintf (stderr, " Couldn't load file '%s'\n " , fileName.GetString ());
228
228
IfJsrtErrorSetGo (ChakraRTInterface::JsGetUndefinedValue (&returnValue));
229
229
return returnValue;
@@ -482,6 +482,7 @@ JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileConten
482
482
}
483
483
484
484
moduleRecordMap[std::string (moduleRecordKey)] = requestModule;
485
+ moduleErrMap[requestModule] = RootModule;
485
486
}
486
487
}
487
488
else
@@ -504,9 +505,10 @@ JsErrorCode WScriptJsrt::LoadModuleFromString(LPCSTR fileName, LPCSTR fileConten
504
505
505
506
errorCode = ChakraRTInterface::JsParseModuleSource (requestModule, dwSourceCookie, (LPBYTE)fileContent,
506
507
fileContentLength, JsParseModuleSourceFlags_DataIsUTF8, &errorObject);
507
- 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 )
508
509
{
509
510
ChakraRTInterface::JsSetException (errorObject);
511
+ moduleErrMap[requestModule] = ErroredModule;
510
512
return errorCode;
511
513
}
512
514
return JsNoError;
@@ -1145,6 +1147,7 @@ bool WScriptJsrt::Uninitialize()
1145
1147
// to avoid worrying about global destructor order.
1146
1148
moduleRecordMap.clear ();
1147
1149
moduleDirMap.clear ();
1150
+ moduleErrMap.clear ();
1148
1151
scriptDirMap.clear ();
1149
1152
1150
1153
auto & threadData = GetRuntimeThreadLocalData ().threadData ;
@@ -1232,7 +1235,6 @@ JsValueRef __stdcall WScriptJsrt::LoadTextFileCallback(JsValueRef callee, bool i
1232
1235
1233
1236
if (FAILED (hr))
1234
1237
{
1235
- // check if have it registered
1236
1238
fprintf (stderr, " Couldn't load file '%s'\n " , fileName.GetString ());
1237
1239
IfJsrtErrorSetGo (ChakraRTInterface::JsGetUndefinedValue (&returnValue));
1238
1240
return returnValue;
@@ -1396,7 +1398,6 @@ JsValueRef __stdcall WScriptJsrt::LoadBinaryFileCallback(JsValueRef callee,
1396
1398
1397
1399
if (FAILED (hr))
1398
1400
{
1399
- // check if have it registered
1400
1401
fprintf (stderr, " Couldn't load file '%s'\n " , fileName.GetString ());
1401
1402
IfJsrtErrorSetGoLabel (ChakraRTInterface::JsGetUndefinedValue (&returnValue), Error);
1402
1403
return returnValue;
@@ -1845,12 +1846,14 @@ HRESULT WScriptJsrt::CallbackMessage::CallFunction(LPCSTR fileName)
1845
1846
return hr;
1846
1847
}
1847
1848
1848
- WScriptJsrt::ModuleMessage::ModuleMessage (JsModuleRecord module , JsValueRef specifier)
1849
+ WScriptJsrt::ModuleMessage::ModuleMessage (JsModuleRecord module , JsValueRef specifier, std::string* fullPathPtr )
1849
1850
: MessageBase(0 ), moduleRecord(module ), specifier(specifier)
1850
1851
{
1852
+ fullPath = nullptr ;
1851
1853
ChakraRTInterface::JsAddRef (module , nullptr );
1852
1854
if (specifier != nullptr )
1853
1855
{
1856
+ fullPath = new std::string (*fullPathPtr);
1854
1857
// nullptr specifier means a Promise to execute; non-nullptr means a "fetch" operation.
1855
1858
ChakraRTInterface::JsAddRef (specifier, nullptr );
1856
1859
}
@@ -1861,21 +1864,39 @@ WScriptJsrt::ModuleMessage::~ModuleMessage()
1861
1864
ChakraRTInterface::JsRelease (moduleRecord, nullptr );
1862
1865
if (specifier != nullptr )
1863
1866
{
1867
+ delete fullPath;
1864
1868
ChakraRTInterface::JsRelease (specifier, nullptr );
1865
1869
}
1866
1870
}
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,19 +1906,22 @@ HRESULT WScriptJsrt::ModuleMessage::Call(LPCSTR fileName)
1885
1906
errorCode = specifierStr.GetError ();
1886
1907
if (errorCode == JsNoError)
1887
1908
{
1888
- hr = Helpers::LoadScriptFromFile (*specifierStr, fileContent);
1909
+ hr = Helpers::LoadScriptFromFile (*specifierStr, fileContent, nullptr , fullPath, true );
1889
1910
1890
1911
if (FAILED (hr))
1891
1912
{
1892
- // check if have it registered
1893
1913
if (!HostConfigFlags::flags.MuteHostErrorMsgIsEnabled )
1894
1914
{
1895
- 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
+ }
1896
1920
}
1897
- LoadScript (nullptr , *specifierStr, nullptr , " module" , true , WScriptJsrt::FinalizeFree, false );
1921
+ LoadScript (nullptr , fullPath == nullptr ? *specifierStr : fullPath-> c_str () , nullptr , " module" , true , WScriptJsrt::FinalizeFree, false );
1898
1922
goto Error;
1899
1923
}
1900
- LoadScript (nullptr , *specifierStr, fileContent, " module" , true , WScriptJsrt::FinalizeFree, true );
1924
+ LoadScript (nullptr , fullPath == nullptr ? *specifierStr : fullPath-> c_str () , fileContent, " module" , true , WScriptJsrt::FinalizeFree, true );
1901
1925
}
1902
1926
}
1903
1927
Error:
@@ -1936,9 +1960,10 @@ JsErrorCode WScriptJsrt::FetchImportedModuleHelper(JsModuleRecord referencingMod
1936
1960
{
1937
1961
GetDir (fullPath, &moduleDirMap[moduleRecord]);
1938
1962
InitializeModuleInfo (specifier, moduleRecord);
1939
- moduleRecordMap[std::string (fullPath)] = moduleRecord;
1940
- ModuleMessage* moduleMessage =
1941
- WScriptJsrt::ModuleMessage::Create (referencingModule, specifier);
1963
+ std::string pathKey = std::string (fullPath);
1964
+ moduleRecordMap[pathKey] = moduleRecord;
1965
+ moduleErrMap[moduleRecord] = ImportedModule;
1966
+ ModuleMessage* moduleMessage = WScriptJsrt::ModuleMessage::Create (referencingModule, specifier, &pathKey);
1942
1967
if (moduleMessage == nullptr )
1943
1968
{
1944
1969
return JsErrorOutOfMemory;
@@ -1973,14 +1998,6 @@ JsErrorCode WScriptJsrt::FetchImportedModule(_In_ JsModuleRecord referencingModu
1973
1998
JsErrorCode WScriptJsrt::FetchImportedModuleFromScript (_In_ JsSourceContext dwReferencingSourceContext,
1974
1999
_In_ JsValueRef specifier, _Outptr_result_maybenull_ JsModuleRecord* dependentModuleRecord)
1975
2000
{
1976
- // ch.exe assumes all imported source files are located at .
1977
- auto scriptDirEntry = scriptDirMap.find (dwReferencingSourceContext);
1978
- if (scriptDirEntry != scriptDirMap.end ())
1979
- {
1980
- std::string dir = scriptDirEntry->second ;
1981
- return FetchImportedModuleHelper (nullptr , specifier, dependentModuleRecord, dir.c_str ());
1982
- }
1983
-
1984
2001
return FetchImportedModuleHelper (nullptr , specifier, dependentModuleRecord);
1985
2002
}
1986
2003
@@ -2008,7 +2025,8 @@ JsErrorCode WScriptJsrt::NotifyModuleReadyCallback(_In_opt_ JsModuleRecord refer
2008
2025
ChakraRTInterface::JsGetAndClearException (&exception);
2009
2026
exception; // unused
2010
2027
}
2011
- else
2028
+
2029
+ if (exceptionVar != nullptr || moduleErrMap[referencingModule] != ErroredModule)
2012
2030
{
2013
2031
WScriptJsrt::ModuleMessage* moduleMessage =
2014
2032
WScriptJsrt::ModuleMessage::Create (referencingModule, nullptr );
0 commit comments