Skip to content

Commit a55eda9

Browse files
committed
rebase
1 parent 7e118e7 commit a55eda9

35 files changed

+613
-599
lines changed

src/libraries/Common/src/Interop/Browser/Interop.Runtime.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal static unsafe partial class Runtime
2222
[MethodImpl(MethodImplOptions.InternalCall)]
2323
public static extern unsafe void BindCSFunction(in string fully_qualified_name, int signature_hash, void* signature, out int is_exception, out object result);
2424
[MethodImpl(MethodImplOptions.InternalCall)]
25-
public static extern void MarshalPromise(void* data);
25+
public static extern void ResolveOrRejectPromise(void* data);
2626
[MethodImpl(MethodImplOptions.InternalCall)]
2727
public static extern IntPtr RegisterGCRoot(IntPtr start, int bytesSize, IntPtr name);
2828
[MethodImpl(MethodImplOptions.InternalCall)]

src/libraries/System.Runtime.InteropServices.JavaScript/System.Runtime.InteropServices.JavaScript.sln

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{F2C2C78A-CED
4343
EndProject
4444
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{7973EAA3-43B6-4D78-B24C-38BA6BC0D1E3}"
4545
EndProject
46-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{569E6837-0771-4C08-BB09-460281030538}"
46+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{569E6837-0771-4C08-BB09-460281030538}"
4747
EndProject
48-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{67F3A00A-AE6C-434C-927D-E5D38DE2DA2C}"
48+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{67F3A00A-AE6C-434C-927D-E5D38DE2DA2C}"
4949
EndProject
50-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{1DFF019B-6B73-4E5A-A6DA-5EBEF4AA7EBF}"
50+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{1DFF019B-6B73-4E5A-A6DA-5EBEF4AA7EBF}"
5151
EndProject
5252
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{F92020A9-28BE-4398-86FF-5CFE44C94882}"
5353
EndProject
@@ -135,28 +135,32 @@ Global
135135
EndGlobalSection
136136
GlobalSection(NestedProjects) = preSolution
137137
{ED86AB26-1CFB-457D-BF87-B7A0D8FAF272} = {26A72FFB-871A-4F2F-A513-B2F6E09F358C}
138+
{8B1D80E9-AE0D-4E3C-9F91-E6862B49AEF3} = {C22C479B-769A-4859-B974-E9B9D65918DE}
139+
{CE5E53C1-F9B5-41EE-8D00-837913EC57D1} = {F2C2C78A-CEDD-4DE0-9C3A-0195F00E0B4E}
140+
{28278E01-BF5C-4AB6-AA7A-8DD4E6C04DB1} = {C22C479B-769A-4859-B974-E9B9D65918DE}
141+
{71A845ED-4344-41FC-8FCA-3AC9B6BA6C45} = {7973EAA3-43B6-4D78-B24C-38BA6BC0D1E3}
138142
{BFED925C-18F2-4C98-833E-66F205234598} = {26A72FFB-871A-4F2F-A513-B2F6E09F358C}
139143
{ABA5A92B-CAD8-47E8-A7CE-D28A67FB69C0} = {26A72FFB-871A-4F2F-A513-B2F6E09F358C}
140144
{765B4AA5-723A-44FF-BC4E-EB0F03103F6D} = {26A72FFB-871A-4F2F-A513-B2F6E09F358C}
141-
{EC3ADEFA-1FF3-482C-8CCB-FE4C77292532} = {26A72FFB-871A-4F2F-A513-B2F6E09F358C}
142-
{8B1D80E9-AE0D-4E3C-9F91-E6862B49AEF3} = {C22C479B-769A-4859-B974-E9B9D65918DE}
143-
{28278E01-BF5C-4AB6-AA7A-8DD4E6C04DB1} = {C22C479B-769A-4859-B974-E9B9D65918DE}
144-
{44BAE6F1-94C2-415B-9A16-3B8EC429B09B} = {C22C479B-769A-4859-B974-E9B9D65918DE}
145-
{CE5E53C1-F9B5-41EE-8D00-837913EC57D1} = {F2C2C78A-CEDD-4DE0-9C3A-0195F00E0B4E}
146145
{FB12C247-AFEF-4772-BB0C-983969B6CF32} = {F2C2C78A-CEDD-4DE0-9C3A-0195F00E0B4E}
147146
{09AA6758-0BD3-4312-9C07-AE9F1D50A3AD} = {F2C2C78A-CEDD-4DE0-9C3A-0195F00E0B4E}
148147
{B4E3E774-2C16-4CBF-87EF-88C547529B94} = {F2C2C78A-CEDD-4DE0-9C3A-0195F00E0B4E}
149-
{71A845ED-4344-41FC-8FCA-3AC9B6BA6C45} = {7973EAA3-43B6-4D78-B24C-38BA6BC0D1E3}
148+
{EC3ADEFA-1FF3-482C-8CCB-FE4C77292532} = {26A72FFB-871A-4F2F-A513-B2F6E09F358C}
149+
{44BAE6F1-94C2-415B-9A16-3B8EC429B09B} = {C22C479B-769A-4859-B974-E9B9D65918DE}
150150
{4D8B7538-D933-4F3A-818D-4E19ABA7E182} = {569E6837-0771-4C08-BB09-460281030538}
151151
{6C60944F-4FE1-450F-884B-D523EDFCFAB3} = {569E6837-0771-4C08-BB09-460281030538}
152-
{569E6837-0771-4C08-BB09-460281030538} = {F92020A9-28BE-4398-86FF-5CFE44C94882}
153152
{B8F2E56D-6571-466D-9EF2-9FCAD3FC6E5B} = {67F3A00A-AE6C-434C-927D-E5D38DE2DA2C}
154153
{42F9A600-BEC3-4F87-97EE-38E0DCAABC5A} = {67F3A00A-AE6C-434C-927D-E5D38DE2DA2C}
155-
{67F3A00A-AE6C-434C-927D-E5D38DE2DA2C} = {F92020A9-28BE-4398-86FF-5CFE44C94882}
156154
{008873D5-9028-4FF3-8354-71F713748625} = {1DFF019B-6B73-4E5A-A6DA-5EBEF4AA7EBF}
155+
{569E6837-0771-4C08-BB09-460281030538} = {F92020A9-28BE-4398-86FF-5CFE44C94882}
156+
{67F3A00A-AE6C-434C-927D-E5D38DE2DA2C} = {F92020A9-28BE-4398-86FF-5CFE44C94882}
157157
{1DFF019B-6B73-4E5A-A6DA-5EBEF4AA7EBF} = {F92020A9-28BE-4398-86FF-5CFE44C94882}
158158
EndGlobalSection
159159
GlobalSection(ExtensibilityGlobals) = postSolution
160160
SolutionGuid = {3FE64246-4AFA-424A-AE5D-7007E20451B5}
161161
EndGlobalSection
162+
GlobalSection(SharedMSBuildProjectFiles) = preSolution
163+
..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{42f9a600-bec3-4f87-97ee-38e0dcaabc5a}*SharedItemsImports = 5
164+
..\..\tools\illink\src\ILLink.Shared\ILLink.Shared.projitems*{6c60944f-4fe1-450f-884b-d523edfcfab3}*SharedItemsImports = 5
165+
EndGlobalSection
162166
EndGlobal

src/libraries/System.Runtime.InteropServices.JavaScript/src/Resources/Strings.resx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@
147147
<data name="NullToManagedCallback" xml:space="preserve">
148148
<value>ToManagedCallback is null.</value>
149149
</data>
150-
<data name="NullTaskCallback" xml:space="preserve">
151-
<value>TaskCallback is null.</value>
150+
<data name="NullPromiseHolder" xml:space="preserve">
151+
<value>PromiseHolder is null.</value>
152152
</data>
153153
<data name="EmptyProfileData" xml:space="preserve">
154154
<value>Empty profile data.</value>
@@ -162,8 +162,8 @@
162162
<data name="FailedToMarshalException" xml:space="preserve">
163163
<value>Failed to marshal exception.</value>
164164
</data>
165-
<data name="FailedToMarshalTaskCallback" xml:space="preserve">
166-
<value>Failed to marshal Task callback.</value>
165+
<data name="FailedToMarshalPromiseHolder" xml:space="preserve">
166+
<value>Failed to marshal Promise callback.</value>
167167
</data>
168168
<data name="InvalidInFlightCounter" xml:space="preserve">
169169
<value>Invalid InFlightCounter for JSObject {0}, expected: {1}, actual: {2}.</value>

src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/CancelablePromise.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace System.Runtime.InteropServices.JavaScript
99
public static partial class CancelablePromise
1010
{
1111
[JSImport("INTERNAL.mono_wasm_cancel_promise")]
12-
private static partial void _CancelPromise(IntPtr promiseGCHandle);
12+
private static partial void _CancelPromise(IntPtr gcvHandle);
1313

1414
public static void CancelPromise(Task promise)
1515
{
@@ -18,15 +18,15 @@ public static void CancelPromise(Task promise)
1818
{
1919
return;
2020
}
21-
JSHostImplementation.TaskCallback? holder = promise.AsyncState as JSHostImplementation.TaskCallback;
21+
JSHostImplementation.PromiseHolder? holder = promise.AsyncState as JSHostImplementation.PromiseHolder;
2222
if (holder == null) throw new InvalidOperationException("Expected Task converted from JS Promise");
2323

2424

2525
#if FEATURE_WASM_THREADS
26-
holder.SynchronizationContext!.Send(static (JSHostImplementation.TaskCallback holder) =>
26+
holder.SynchronizationContext!.Send(static (JSHostImplementation.PromiseHolder holder) =>
2727
{
2828
#endif
29-
_CancelPromise(holder.GCHandle);
29+
_CancelPromise(holder.GCVHandle);
3030
#if FEATURE_WASM_THREADS
3131
}, holder);
3232
#endif
@@ -39,15 +39,15 @@ public static void CancelPromise<T>(Task promise, Action<T> callback, T state)
3939
{
4040
return;
4141
}
42-
JSHostImplementation.TaskCallback? holder = promise.AsyncState as JSHostImplementation.TaskCallback;
42+
JSHostImplementation.PromiseHolder? holder = promise.AsyncState as JSHostImplementation.PromiseHolder;
4343
if (holder == null) throw new InvalidOperationException("Expected Task converted from JS Promise");
4444

4545

4646
#if FEATURE_WASM_THREADS
47-
holder.SynchronizationContext!.Send((JSHostImplementation.TaskCallback holder) =>
47+
holder.SynchronizationContext!.Send((JSHostImplementation.PromiseHolder holder) =>
4848
{
4949
#endif
50-
_CancelPromise(holder.GCHandle);
50+
_CancelPromise(holder.GCVHandle);
5151
callback.Invoke(state);
5252
#if FEATURE_WASM_THREADS
5353
}, holder);

src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/Interop/JavaScriptExports.cs

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Threading.Tasks;
99
using System.Diagnostics.CodeAnalysis;
1010
using System.Threading;
11+
using static System.Runtime.InteropServices.JavaScript.JSHostImplementation;
1112

1213
namespace System.Runtime.InteropServices.JavaScript
1314
{
@@ -31,7 +32,7 @@ public static void CallEntrypoint(JSMarshalerArgument* arguments_buffer)
3132
throw new MissingMethodException(SR.MissingManagedEntrypointHandle);
3233
}
3334

34-
RuntimeMethodHandle methodHandle = JSHostImplementation.GetMethodHandleFromIntPtr(entrypointPtr);
35+
RuntimeMethodHandle methodHandle = GetMethodHandleFromIntPtr(entrypointPtr);
3536
// this would not work for generic types. But Main() could not be generic, so we are fine.
3637
MethodInfo? method = MethodBase.GetMethodFromHandle(methodHandle) as MethodInfo;
3738
if (method == null)
@@ -141,32 +142,18 @@ public static void ReleaseJSOwnedObjectByGCHandle(JSMarshalerArgument* arguments
141142
ref JSMarshalerArgument arg_1 = ref arguments_buffer[2]; // initialized and set by caller
142143
try
143144
{
144-
GCHandle handle = (GCHandle)arg_1.slot.GCHandle;
145-
146-
JSHostImplementation.ThreadJsOwnedObjects.Remove(handle.Target!);
147-
handle.Free();
148-
}
149-
catch (Exception ex)
150-
{
151-
arg_exc.ToJS(ex);
152-
}
153-
}
154-
155-
// the marshaled signature is:
156-
// GCHandle CreateTaskCallback()
157-
public static void CreateTaskCallback(JSMarshalerArgument* arguments_buffer)
158-
{
159-
ref JSMarshalerArgument arg_exc = ref arguments_buffer[0]; // initialized by caller in alloc_stack_frame()
160-
ref JSMarshalerArgument arg_return = ref arguments_buffer[1]; // used as return value
161-
try
162-
{
163-
JSHostImplementation.TaskCallback holder = new JSHostImplementation.TaskCallback();
164-
#if FEATURE_WASM_THREADS
165-
holder.OwnerThreadId = Thread.CurrentThread.ManagedThreadId;
166-
holder.SynchronizationContext = SynchronizationContext.Current ?? new SynchronizationContext();
167-
#endif
168-
arg_return.slot.Type = MarshalerType.Object;
169-
arg_return.slot.GCHandle = holder.GCHandle = JSHostImplementation.GetJSOwnedObjectGCHandle(holder);
145+
var gcHandle = arg_1.slot.GCHandle;
146+
if (IsGCVHandle(gcHandle) && ThreadJsOwnedHolders.Remove(gcHandle, out PromiseHolder? holder))
147+
{
148+
holder.GCVHandle = IntPtr.Zero;
149+
holder.Callback!(null);
150+
}
151+
else
152+
{
153+
GCHandle handle = (GCHandle)gcHandle;
154+
ThreadJsOwnedObjects.Remove(handle.Target!);
155+
handle.Free();
156+
}
170157
}
171158
catch (Exception ex)
172159
{
@@ -187,7 +174,7 @@ public static void CallDelegate(JSMarshalerArgument* arguments_buffer)
187174
try
188175
{
189176
GCHandle callback_gc_handle = (GCHandle)arg_1.slot.GCHandle;
190-
if (callback_gc_handle.Target is JSHostImplementation.ToManagedCallback callback)
177+
if (callback_gc_handle.Target is ToManagedCallback callback)
191178
{
192179
// arg_2, arg_3, arg_4, arg_res are processed by the callback
193180
callback(arguments_buffer);
@@ -204,7 +191,7 @@ public static void CallDelegate(JSMarshalerArgument* arguments_buffer)
204191
}
205192

206193
// the marshaled signature is:
207-
// void CompleteTask<T>(GCHandle holder, Exception? exceptionResult, T? result)
194+
// void CompleteTask<T>(GCVHandle holder, Exception? exceptionResult, T? result)
208195
public static void CompleteTask(JSMarshalerArgument* arguments_buffer)
209196
{
210197
ref JSMarshalerArgument arg_exc = ref arguments_buffer[0]; // initialized by caller in alloc_stack_frame()
@@ -213,15 +200,17 @@ public static void CompleteTask(JSMarshalerArgument* arguments_buffer)
213200
// arg_3 set by caller when this is SetResult call
214201
try
215202
{
216-
GCHandle callback_gc_handle = (GCHandle)arg_1.slot.GCHandle;
217-
if (callback_gc_handle.Target is JSHostImplementation.TaskCallback holder && holder.Callback is not null)
203+
var callback_gcv_handle = arg_1.slot.GCHandle;
204+
if (ThreadJsOwnedHolders.Remove(callback_gcv_handle, out PromiseHolder? promiseHolder) && promiseHolder.Callback != null)
218205
{
206+
promiseHolder.GCVHandle = IntPtr.Zero;
207+
219208
// arg_2, arg_3 are processed by the callback
220-
holder.Callback(arguments_buffer);
209+
promiseHolder.Callback(arguments_buffer);
221210
}
222211
else
223212
{
224-
throw new InvalidOperationException(SR.NullTaskCallback);
213+
throw new InvalidOperationException(SR.NullPromiseHolder);
225214
}
226215
}
227216
catch (Exception ex)
@@ -264,7 +253,7 @@ public static void InstallSynchronizationContext (JSMarshalerArgument* arguments
264253
ref JSMarshalerArgument arg_exc = ref arguments_buffer[0]; // initialized by caller in alloc_stack_frame()
265254
try
266255
{
267-
JSHostImplementation.InstallWebWorkerInterop(true, true);
256+
InstallWebWorkerInterop(true, true);
268257
}
269258
catch (Exception ex)
270259
{

src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/Interop/JavaScriptImports.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ namespace System.Runtime.InteropServices.JavaScript
77
{
88
internal static unsafe partial class JavaScriptImports
99
{
10-
public static void MarshalPromise(Span<JSMarshalerArgument> arguments)
10+
public static void ResolveOrRejectPromise(Span<JSMarshalerArgument> arguments)
1111
{
1212
fixed (JSMarshalerArgument* ptr = arguments)
1313
{
14-
Interop.Runtime.MarshalPromise(ptr);
14+
Interop.Runtime.ResolveOrRejectPromise(ptr);
1515
ref JSMarshalerArgument exceptionArg = ref arguments[0];
1616
if (exceptionArg.slot.Type != MarshalerType.None)
1717
{

src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/Interop/LegacyExports.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ internal static void PreventTrimming()
3232

3333
public static void GetCSOwnedObjectByJSHandleRef(nint jsHandle, int shouldAddInflight, out JSObject? result)
3434
{
35-
if (JSHostImplementation.ThreadCsOwnedObjects.TryGetValue((int)jsHandle, out WeakReference<JSObject>? reference))
35+
if (JSHostImplementation.ThreadCsOwnedObjects.TryGetValue(jsHandle, out WeakReference<JSObject>? reference))
3636
{
3737
reference.TryGetTarget(out JSObject? jsObject);
3838
if (shouldAddInflight != 0)
@@ -74,7 +74,7 @@ public static void CreateCSOwnedProxyRef(nint jsHandle, LegacyHostImplementation
7474

7575
JSObject? res = null;
7676

77-
if (!JSHostImplementation.ThreadCsOwnedObjects.TryGetValue((int)jsHandle, out WeakReference<JSObject>? reference) ||
77+
if (!JSHostImplementation.ThreadCsOwnedObjects.TryGetValue(jsHandle, out WeakReference<JSObject>? reference) ||
7878
!reference.TryGetTarget(out res) ||
7979
res.IsDisposed)
8080
{
@@ -90,7 +90,7 @@ public static void CreateCSOwnedProxyRef(nint jsHandle, LegacyHostImplementation
9090
_ => throw new ArgumentOutOfRangeException(nameof(mappedType))
9191
};
9292
#pragma warning restore CS0612 // Type or member is obsolete
93-
JSHostImplementation.ThreadCsOwnedObjects[(int)jsHandle] = new WeakReference<JSObject>(res, trackResurrection: true);
93+
JSHostImplementation.ThreadCsOwnedObjects[jsHandle] = new WeakReference<JSObject>(res, trackResurrection: true);
9494
}
9595
if (shouldAddInflight != 0)
9696
{

src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSFunctionBinding.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,28 @@ internal struct JSBindingHeader
4242
internal struct JSBindingType
4343
{
4444
internal MarshalerType Type;
45+
internal MarshalerType __ReservedB1;
46+
internal MarshalerType __ReservedB2;
47+
internal MarshalerType __ReservedB3;
4548
internal IntPtr __Reserved;
4649
internal IntPtr JSCustomMarshallerCode;
4750
internal int JSCustomMarshallerCodeLength;
4851
internal MarshalerType ResultMarshalerType;
52+
internal MarshalerType __ReservedB4;
53+
internal MarshalerType __ReservedB5;
54+
internal MarshalerType __ReservedB6;
4955
internal MarshalerType Arg1MarshalerType;
56+
internal MarshalerType __ReservedB7;
57+
internal MarshalerType __ReservedB8;
58+
internal MarshalerType __ReservedB9;
5059
internal MarshalerType Arg2MarshalerType;
60+
internal MarshalerType __ReservedB10;
61+
internal MarshalerType __ReservedB11;
62+
internal MarshalerType __ReservedB12;
5163
internal MarshalerType Arg3MarshalerType;
64+
internal MarshalerType __ReservedB13;
65+
internal MarshalerType __ReservedB14;
66+
internal MarshalerType __ReservedB15;
5267
}
5368

5469
internal unsafe int ArgumentCount

src/libraries/System.Runtime.InteropServices.JavaScript/src/System/Runtime/InteropServices/JavaScript/JSHostImplementation.Types.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,32 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Threading;
5+
using System.Threading.Tasks;
56

67
namespace System.Runtime.InteropServices.JavaScript
78
{
89
internal static partial class JSHostImplementation
910
{
1011
internal unsafe delegate void ToManagedCallback(JSMarshalerArgument* arguments_buffer);
1112

12-
public sealed class TaskCallback
13+
public sealed class PromiseHolder
1314
{
14-
public nint GCHandle;
15+
public nint GCVHandle;
1516
public ToManagedCallback? Callback;
1617
#if FEATURE_WASM_THREADS
1718
// the JavaScript object could only exist on the single web worker and can't migrate to other workers
1819
internal int OwnerThreadId;
1920
internal SynchronizationContext? SynchronizationContext;
2021
#endif
22+
23+
public PromiseHolder(nint gcvHandle)
24+
{
25+
this.GCVHandle = gcvHandle;
26+
#if FEATURE_WASM_THREADS
27+
this.OwnerThreadId = Thread.CurrentThread.ManagedThreadId;
28+
this.SynchronizationContext = SynchronizationContext.Current ?? new SynchronizationContext();
29+
#endif
30+
}
2131
}
2232

2333
[StructLayout(LayoutKind.Explicit)]

0 commit comments

Comments
 (0)