Prechádzať zdrojové kódy

Module : SetModuleHostInfo's error propagation properly and useless assert removal.

Akrosh Gandhi 8 rokov pred
rodič
commit
462dccc5b4

+ 41 - 0
bin/NativeTests/JsRTApiTest.cpp

@@ -1981,6 +1981,47 @@ namespace JsRTApiTest
 
     }
 
+    void SetModuleHostInfoTest(JsRuntimeAttributes attributes, JsRuntimeHandle runtime)
+    {
+        JsModuleRecord requestModule = JS_INVALID_REFERENCE;
+        JsValueRef specifier = nullptr;
+
+        REQUIRE(JsPointerToString(_u("mod1.js"), wcslen(_u("mod1.js")), &specifier) == JsNoError);
+        REQUIRE(JsInitializeModuleRecord(nullptr, specifier, &requestModule) == JsNoError);
+        JsValueRef error = nullptr, errorMsg = nullptr;
+        REQUIRE(JsPointerToString(_u("test error"), wcslen(_u("test error")), &errorMsg) == JsNoError);
+        REQUIRE(JsCreateError(errorMsg, &error) == JsNoError);
+
+        REQUIRE(JsSetModuleHostInfo(requestModule, JsModuleHostInfo_Exception, error) == JsNoError);
+
+        JsValueRef errorOut = nullptr;
+        JsGetModuleHostInfo(requestModule, JsModuleHostInfo_Exception, &errorOut);
+        REQUIRE(errorOut == error);
+
+        //REQUIRE(JsSetModuleHostInfo(requestModule, JsModuleHostInfo_Exception, nullptr) == JsNoError);
+
+        REQUIRE(JsPointerToString(_u("mod2.js"), wcslen(_u("mod2.js")), &specifier) == JsNoError);
+        REQUIRE(JsInitializeModuleRecord(nullptr, specifier, &requestModule) == JsNoError);
+
+        successTest.mainModule = requestModule;
+        REQUIRE(JsSetModuleHostInfo(requestModule, JsModuleHostInfo_NotifyModuleReadyCallback, Succes_NMRC) == JsNoError);
+
+        // Parsing
+        JsValueRef errorObject1 = JS_INVALID_REFERENCE;
+        const char* fileContent = "var x = 10";
+        REQUIRE(JsParseModuleSource(requestModule, 0, (LPBYTE)fileContent,
+            (unsigned int)strlen(fileContent), JsParseModuleSourceFlags_DataIsUTF8, &errorObject1) == JsNoError);
+
+        // This should not pass
+        REQUIRE(JsSetModuleHostInfo(requestModule, JsModuleHostInfo_Exception, error) != JsNoError);
+    }
+
+    TEST_CASE("ApiTest_SetModuleHostInfoTest", "[ApiTest]")
+    {
+        JsRTApiTest::WithSetup(JsRuntimeAttributeEnableExperimentalFeatures, SetModuleHostInfoTest);
+
+    }
+
     ModuleResponseData reentrantParseData;
     static JsErrorCode CALLBACK ReentrantParse_FIMC(_In_ JsModuleRecord referencingModule, _In_ JsValueRef specifier, _Outptr_result_maybenull_ JsModuleRecord* dependentModuleRecord)
     {

+ 4 - 2
lib/Jsrt/Core/JsrtCore.cpp

@@ -158,8 +158,10 @@ JsSetModuleHostInfo(
         switch (moduleHostInfo)
         {
         case JsModuleHostInfo_Exception:
-            moduleRecord->OnHostException(hostInfo);
-            break;
+            {
+            HRESULT hr = moduleRecord->OnHostException(hostInfo);
+            return (hr == NOERROR) ? JsNoError : JsErrorInvalidArgument;
+            }
         case JsModuleHostInfo_HostDefined:
             moduleRecord->SetHostDefined(hostInfo);
             break;

+ 0 - 1
lib/Runtime/Language/SourceTextModuleRecord.cpp

@@ -960,7 +960,6 @@ namespace Js
         {
             return E_INVALIDARG;
         }
-        AssertMsg(!WasParsed(), "shouldn't be called after a module is parsed");
         if (WasParsed())
         {
             return E_INVALIDARG;