-
Notifications
You must be signed in to change notification settings - Fork 161
Expand file tree
/
Copy pathV8ScriptEngine.NetStandard.cs
More file actions
99 lines (79 loc) · 3.15 KB
/
V8ScriptEngine.NetStandard.cs
File metadata and controls
99 lines (79 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.ClearScript.JavaScript;
using Microsoft.ClearScript.Util;
namespace Microsoft.ClearScript.V8
{
public sealed partial class V8ScriptEngine
{
#region internal members
private void CompletePromise<T>(ValueTask<T> valueTask, object resolve, object reject)
{
Func<T> getResult = () => valueTask.Result;
var engineInternal = (ScriptObject)script.GetProperty("EngineInternal");
engineInternal.InvokeMethod("completePromiseWithResult", getResult, resolve, reject);
}
private void CompletePromise(ValueTask valueTask, object resolve, object reject)
{
Action wait = () => WaitForValueTask(valueTask);
var engineInternal = (ScriptObject)script.GetProperty("EngineInternal");
engineInternal.InvokeMethod("completePromise", wait, resolve, reject);
}
private static void WaitForValueTask(ValueTask valueTask)
{
if (valueTask.IsCompletedSuccessfully)
{
return;
}
if (valueTask.IsCanceled)
{
throw new TaskCanceledException();
}
valueTask.AsTask().Wait();
}
partial void TryConvertValueTaskToPromise(object obj, Action<object> setResult)
{
if (obj.GetType().IsAssignableToGenericType(typeof(ValueTask<>), out var typeArgs))
{
setResult(typeof(ValueTaskConverter<>).MakeSpecificType(typeArgs).InvokeMember("ToPromise", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new[] { obj, this }));
}
else if (obj is ValueTask valueTask)
{
setResult(valueTask.ToPromise(this));
}
}
#endregion
#region IJavaScriptEngine implementation
object IJavaScriptEngine.CreatePromiseForValueTask<T>(ValueTask<T> valueTask)
{
if (valueTask.IsCompleted)
{
return CreatePromise((resolve, reject) => CompletePromise(valueTask, resolve, reject));
}
return ((IJavaScriptEngine)this).CreatePromiseForTask(valueTask.AsTask());
}
object IJavaScriptEngine.CreatePromiseForValueTask(ValueTask valueTask)
{
if (valueTask.IsCompleted)
{
return CreatePromise((resolve, reject) => CompletePromise(valueTask, resolve, reject));
}
return ((IJavaScriptEngine)this).CreatePromiseForTask(valueTask.AsTask());
}
#endregion
#region Nested type: ValueTaskConverter
private static class ValueTaskConverter<T>
{
// ReSharper disable UnusedMember.Local
public static object ToPromise(ValueTask<T> valueTask, V8ScriptEngine engine)
{
return valueTask.ToPromise(engine);
}
// ReSharper restore UnusedMember.Local
}
#endregion
}
}