Sfoglia il codice sorgente

Fix TimeoutInterval crashing ImportModule (#1165)

Christian Rondeau 3 anni fa
parent
commit
8c89089d9f
2 ha cambiato i file con 14 aggiunte e 2 eliminazioni
  1. 10 0
      Jint.Tests/Runtime/ModuleTests.cs
  2. 4 2
      Jint/Engine.Modules.cs

+ 10 - 0
Jint.Tests/Runtime/ModuleTests.cs

@@ -3,6 +3,7 @@ using System;
 using System.IO;
 using System.Reflection;
 #endif
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using Jint.Native;
@@ -302,6 +303,15 @@ export const count = globals.counter;
         Assert.Equal("a", nsA.Get("a").AsString());
         Assert.Equal("b", nsB.Get("b").AsString());
     }
+    
+    [Fact]
+    public void ShouldSupportConstraints()
+    {
+        var engine = new Engine(opts => opts.TimeoutInterval(TimeSpan.FromTicks(1)));
+        
+        engine.AddModule("my-module", @"for(var i = 0; i < 100000; i++) { } export const result = 'ok';");
+        Assert.Throws<TimeoutException>(() => engine.ImportModule("my-module"));
+    }
 
 #if(NET6_0_OR_GREATER)
 

+ 4 - 2
Jint/Engine.Modules.cs

@@ -119,7 +119,7 @@ namespace Jint
 
                 if (cyclicModule.Status == ModuleStatus.Linked)
                 {
-                    EvaluateModule(specifier, cyclicModule);
+                    ExecuteWithConstraints(true, () => EvaluateModule(specifier, cyclicModule));
                 }
 
                 if (cyclicModule.Status != ModuleStatus.Evaluated)
@@ -133,7 +133,7 @@ namespace Jint
             return ModuleRecord.GetModuleNamespace(module);
         }
 
-        private void EvaluateModule(string specifier, ModuleRecord cyclicModule)
+        private JsValue EvaluateModule(string specifier, ModuleRecord cyclicModule)
         {
             var ownsContext = _activeEvaluationContext is null;
             _activeEvaluationContext ??= new EvaluationContext(this);
@@ -163,6 +163,8 @@ namespace Jint
             {
                 ExceptionHelper.ThrowInvalidOperationException($"Error while evaluating module: Module evaluation did not return a fulfilled promise: {promise.State}");
             }
+
+            return evaluationResult;
         }
     }
 }