2
0
Эх сурвалжийг харах

Make task to promise wrapping an opt-in experimental feature (#1830)

Marko Lahma 1 жил өмнө
parent
commit
00d6a6e8b6

+ 7 - 7
Jint.Tests/Runtime/AsyncTests.cs

@@ -33,7 +33,7 @@ public class AsyncTests
     [Fact]
     [Fact]
     public void ShouldReturnedTaskConvertedToPromiseInJS()
     public void ShouldReturnedTaskConvertedToPromiseInJS()
     {
     {
-        Engine engine = new();
+        Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
         engine.SetValue("asyncTestClass", new AsyncTestClass());
         engine.SetValue("asyncTestClass", new AsyncTestClass());
         var result = engine.Evaluate("asyncTestClass.ReturnDelayedTaskAsync().then(x=>x)");
         var result = engine.Evaluate("asyncTestClass.ReturnDelayedTaskAsync().then(x=>x)");
         result = result.UnwrapIfPromise();
         result = result.UnwrapIfPromise();
@@ -43,7 +43,7 @@ public class AsyncTests
     [Fact]
     [Fact]
     public void ShouldReturnedCompletedTaskConvertedToPromiseInJS()
     public void ShouldReturnedCompletedTaskConvertedToPromiseInJS()
     {
     {
-        Engine engine = new();
+        Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
         engine.SetValue("asyncTestClass", new AsyncTestClass());
         engine.SetValue("asyncTestClass", new AsyncTestClass());
         var result = engine.Evaluate("asyncTestClass.ReturnCompletedTask().then(x=>x)");
         var result = engine.Evaluate("asyncTestClass.ReturnCompletedTask().then(x=>x)");
         result = result.UnwrapIfPromise();
         result = result.UnwrapIfPromise();
@@ -53,7 +53,7 @@ public class AsyncTests
     [Fact]
     [Fact]
     public void ShouldTaskCatchWhenCancelled()
     public void ShouldTaskCatchWhenCancelled()
     {
     {
-        Engine engine = new();
+        Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
         CancellationTokenSource cancel = new();
         CancellationTokenSource cancel = new();
         cancel.Cancel();
         cancel.Cancel();
         engine.SetValue("token", cancel.Token);
         engine.SetValue("token", cancel.Token);
@@ -70,7 +70,7 @@ public class AsyncTests
     [Fact]
     [Fact]
     public void ShouldReturnedTaskCatchWhenCancelled()
     public void ShouldReturnedTaskCatchWhenCancelled()
     {
     {
-        Engine engine = new();
+        Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
         CancellationTokenSource cancel = new();
         CancellationTokenSource cancel = new();
         cancel.Cancel();
         cancel.Cancel();
         engine.SetValue("token", cancel.Token);
         engine.SetValue("token", cancel.Token);
@@ -83,7 +83,7 @@ public class AsyncTests
     [Fact]
     [Fact]
     public void ShouldTaskCatchWhenThrowError()
     public void ShouldTaskCatchWhenThrowError()
     {
     {
-        Engine engine = new();
+        Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
         engine.SetValue("callable", Callable);
         engine.SetValue("callable", Callable);
         engine.SetValue("assert", new Action<bool>(Assert.True));
         engine.SetValue("assert", new Action<bool>(Assert.True));
         var result = engine.Evaluate("callable().then(_ => assert(false)).catch(_ => assert(true))");
         var result = engine.Evaluate("callable().then(_ => assert(false)).catch(_ => assert(true))");
@@ -98,7 +98,7 @@ public class AsyncTests
     [Fact]
     [Fact]
     public void ShouldReturnedTaskCatchWhenThrowError()
     public void ShouldReturnedTaskCatchWhenThrowError()
     {
     {
-        Engine engine = new();
+        Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
         engine.SetValue("asyncTestClass", new AsyncTestClass());
         engine.SetValue("asyncTestClass", new AsyncTestClass());
         engine.SetValue("assert", new Action<bool>(Assert.True));
         engine.SetValue("assert", new Action<bool>(Assert.True));
         var result = engine.Evaluate("asyncTestClass.ThrowAfterDelayAsync().then(_ => assert(false)).catch(_ => assert(true))");
         var result = engine.Evaluate("asyncTestClass.ThrowAfterDelayAsync().then(_ => assert(false)).catch(_ => assert(true))");
@@ -109,7 +109,7 @@ public class AsyncTests
     public void ShouldTaskAwaitCurrentStack()
     public void ShouldTaskAwaitCurrentStack()
     {
     {
         //https://github.com/sebastienros/jint/issues/514#issuecomment-1507127509
         //https://github.com/sebastienros/jint/issues/514#issuecomment-1507127509
-        Engine engine = new();
+        Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
         AsyncTestClass asyncTestClass = new();
         AsyncTestClass asyncTestClass = new();
 
 
         engine.SetValue("myAsyncMethod", new Func<Task>(async () =>
         engine.SetValue("myAsyncMethod", new Func<Task>(async () =>

+ 6 - 1
Jint/Options.cs

@@ -481,8 +481,13 @@ public enum ExperimentalFeature
     /// </summary>
     /// </summary>
     Generators = 1,
     Generators = 1,
 
 
+    /// <summary>
+    /// Wrapping tasks to promises
+    /// </summary>
+    TaskInterop = 2,
+
     /// <summary>
     /// <summary>
     /// All coercion rules enabled.
     /// All coercion rules enabled.
     /// </summary>
     /// </summary>
-    All = Generators
+    All = Generators | TaskInterop
 }
 }

+ 12 - 9
Jint/Runtime/Interop/DefaultObjectConverter.cs

@@ -72,19 +72,22 @@ namespace Jint
                     return result is not null;
                     return result is not null;
                 }
                 }
 
 
-                if (value is Task task)
+                if ((engine.Options.ExperimentalFeatures & ExperimentalFeature.TaskInterop) != ExperimentalFeature.None)
                 {
                 {
-                    result = JsValue.ConvertAwaitableToPromise(engine, task);
-                    return result is not null;
-                }
+                    if (value is Task task)
+                    {
+                        result = JsValue.ConvertAwaitableToPromise(engine, task);
+                        return result is not null;
+                    }
 
 
 #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP
 #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP
-                if (value is ValueTask valueTask)
-                {
-                    result = JsValue.ConvertAwaitableToPromise(engine, valueTask);
-                    return result is not null;
-                }
+                    if (value is ValueTask valueTask)
+                    {
+                        result = JsValue.ConvertAwaitableToPromise(engine, valueTask);
+                        return result is not null;
+                    }
 #endif
 #endif
+                }
 
 
 #if NET8_0_OR_GREATER
 #if NET8_0_OR_GREATER
                 if (value is System.Text.Json.Nodes.JsonValue jsonValue)
                 if (value is System.Text.Json.Nodes.JsonValue jsonValue)