Skip to content

Commit 00d6a6e

Browse files
authored
Make task to promise wrapping an opt-in experimental feature (#1830)
1 parent 45e0e7b commit 00d6a6e

File tree

3 files changed

+25
-17
lines changed

3 files changed

+25
-17
lines changed

Jint.Tests/Runtime/AsyncTests.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static async Task<int> Callable()
3333
[Fact]
3434
public void ShouldReturnedTaskConvertedToPromiseInJS()
3535
{
36-
Engine engine = new();
36+
Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
3737
engine.SetValue("asyncTestClass", new AsyncTestClass());
3838
var result = engine.Evaluate("asyncTestClass.ReturnDelayedTaskAsync().then(x=>x)");
3939
result = result.UnwrapIfPromise();
@@ -43,7 +43,7 @@ public void ShouldReturnedTaskConvertedToPromiseInJS()
4343
[Fact]
4444
public void ShouldReturnedCompletedTaskConvertedToPromiseInJS()
4545
{
46-
Engine engine = new();
46+
Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
4747
engine.SetValue("asyncTestClass", new AsyncTestClass());
4848
var result = engine.Evaluate("asyncTestClass.ReturnCompletedTask().then(x=>x)");
4949
result = result.UnwrapIfPromise();
@@ -53,7 +53,7 @@ public void ShouldReturnedCompletedTaskConvertedToPromiseInJS()
5353
[Fact]
5454
public void ShouldTaskCatchWhenCancelled()
5555
{
56-
Engine engine = new();
56+
Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
5757
CancellationTokenSource cancel = new();
5858
cancel.Cancel();
5959
engine.SetValue("token", cancel.Token);
@@ -70,7 +70,7 @@ static async Task Callable(CancellationToken token)
7070
[Fact]
7171
public void ShouldReturnedTaskCatchWhenCancelled()
7272
{
73-
Engine engine = new();
73+
Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
7474
CancellationTokenSource cancel = new();
7575
cancel.Cancel();
7676
engine.SetValue("token", cancel.Token);
@@ -83,7 +83,7 @@ public void ShouldReturnedTaskCatchWhenCancelled()
8383
[Fact]
8484
public void ShouldTaskCatchWhenThrowError()
8585
{
86-
Engine engine = new();
86+
Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
8787
engine.SetValue("callable", Callable);
8888
engine.SetValue("assert", new Action<bool>(Assert.True));
8989
var result = engine.Evaluate("callable().then(_ => assert(false)).catch(_ => assert(true))");
@@ -98,7 +98,7 @@ static async Task Callable()
9898
[Fact]
9999
public void ShouldReturnedTaskCatchWhenThrowError()
100100
{
101-
Engine engine = new();
101+
Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
102102
engine.SetValue("asyncTestClass", new AsyncTestClass());
103103
engine.SetValue("assert", new Action<bool>(Assert.True));
104104
var result = engine.Evaluate("asyncTestClass.ThrowAfterDelayAsync().then(_ => assert(false)).catch(_ => assert(true))");
@@ -109,7 +109,7 @@ public void ShouldReturnedTaskCatchWhenThrowError()
109109
public void ShouldTaskAwaitCurrentStack()
110110
{
111111
//https://github.com/sebastienros/jint/issues/514#issuecomment-1507127509
112-
Engine engine = new();
112+
Engine engine = new(options => options.ExperimentalFeatures = ExperimentalFeature.TaskInterop);
113113
AsyncTestClass asyncTestClass = new();
114114

115115
engine.SetValue("myAsyncMethod", new Func<Task>(async () =>

Jint/Options.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -481,8 +481,13 @@ public enum ExperimentalFeature
481481
/// </summary>
482482
Generators = 1,
483483

484+
/// <summary>
485+
/// Wrapping tasks to promises
486+
/// </summary>
487+
TaskInterop = 2,
488+
484489
/// <summary>
485490
/// All coercion rules enabled.
486491
/// </summary>
487-
All = Generators
492+
All = Generators | TaskInterop
488493
}

Jint/Runtime/Interop/DefaultObjectConverter.cs

+12-9
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,22 @@ public static bool TryConvert(Engine engine, object value, Type? type, [NotNullW
7272
return result is not null;
7373
}
7474

75-
if (value is Task task)
75+
if ((engine.Options.ExperimentalFeatures & ExperimentalFeature.TaskInterop) != ExperimentalFeature.None)
7676
{
77-
result = JsValue.ConvertAwaitableToPromise(engine, task);
78-
return result is not null;
79-
}
77+
if (value is Task task)
78+
{
79+
result = JsValue.ConvertAwaitableToPromise(engine, task);
80+
return result is not null;
81+
}
8082

8183
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP
82-
if (value is ValueTask valueTask)
83-
{
84-
result = JsValue.ConvertAwaitableToPromise(engine, valueTask);
85-
return result is not null;
86-
}
84+
if (value is ValueTask valueTask)
85+
{
86+
result = JsValue.ConvertAwaitableToPromise(engine, valueTask);
87+
return result is not null;
88+
}
8789
#endif
90+
}
8891

8992
#if NET8_0_OR_GREATER
9093
if (value is System.Text.Json.Nodes.JsonValue jsonValue)

0 commit comments

Comments
 (0)