Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
145 commits
Select commit Hold shift + click to select a range
d17e863
Add Browser specific files to the project
kjpou1 Apr 28, 2020
aafa4b0
Browser specific file modification to not include Quic support
kjpou1 Apr 28, 2020
7d52436
Add Browser specific support files for Http Handler code
kjpou1 Apr 28, 2020
242ade6
Add Interop code for JavaScript support
kjpou1 Apr 28, 2020
2ca93d8
Remove unused reference
kjpou1 Apr 28, 2020
ab0e0de
Add Http handler bindings implementation
kjpou1 Apr 28, 2020
bc39563
Nullable support
kjpou1 Apr 28, 2020
b60ee5b
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Apr 28, 2020
92f74c4
Add browser files back after upstream merge conflict
kjpou1 Apr 28, 2020
a9248de
Use attribute Link syntax for Common files to bring in sync with exis…
kjpou1 Apr 28, 2020
dc82e45
Address Missing license header
kjpou1 Apr 29, 2020
cc70c9f
Code formatting and removal of comment code.
kjpou1 Apr 29, 2020
c96a6f1
Address PR comments.
kjpou1 Apr 29, 2020
bb9ff24
Address commit comments
kjpou1 Apr 29, 2020
2f7ace0
Add blank line between License and first line of code. Address comments
kjpou1 Apr 29, 2020
ced6437
Replace SocketsHttpHandler build for Browser.
kjpou1 Apr 29, 2020
5c89333
Cleanup SendAsync code when doing the call out to JavaScript Fetch.
kjpou1 Apr 29, 2020
4eb5dd1
Refactor BrowserHttpHandler code.
kjpou1 Apr 29, 2020
d5360b6
Cleanup
kjpou1 Apr 29, 2020
d1b537d
Remove null check as it should be checked in outer classes
kjpou1 Apr 29, 2020
39947b1
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Apr 29, 2020
2d8e124
Cleanup var usage to use explicit type. Address commit comments
kjpou1 Apr 30, 2020
d443cfd
Move `.ConfigureAwait(true)` to `.ConfigureAwait(false)`
kjpou1 Apr 30, 2020
0d63762
Change accessor of Runtime javascript interop methods.
kjpou1 Apr 30, 2020
a91637c
Change accessor of Runtime javascript interop methods.
kjpou1 Apr 30, 2020
cdbbf0f
Address review comments for unused code
kjpou1 Apr 30, 2020
5814d1d
Cleanup leftover debug WriteLines
kjpou1 Apr 30, 2020
146b6d7
Remove the AllowNull attributes as per review comments.
kjpou1 Apr 30, 2020
1f510f4
Update src/libraries/Common/src/Interop/Browser/Interop.Runtime.cs
kjpou1 Apr 30, 2020
90b83f6
throw different exception type as per review comment
kjpou1 Apr 30, 2020
da394d6
use char[] array instead and return new string(array).
kjpou1 Apr 30, 2020
95af576
Initial addition of Browser Interop library
kjpou1 Apr 30, 2020
ada3198
use char[] array instead and return new string(array).
kjpou1 Apr 30, 2020
daa02cc
Add project references so the Interop.JavaScript project builds
kjpou1 May 4, 2020
8395f8f
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 4, 2020
d45f9a9
Coding Style update
kjpou1 May 4, 2020
c1190d2
Split the runtime methods into two modules.
kjpou1 May 4, 2020
93100b5
Move System.Runtime.Interop.JavaScript to \src\libraries
kjpou1 May 4, 2020
5845ee3
Change preprocessor to upper case TARGETS_BROWSER
kjpou1 May 4, 2020
3c75797
Update src/libraries/Common/src/Interop/Browser/Interop.Runtime.Api.cs
kjpou1 May 4, 2020
c7c80bc
Update src/libraries/Common/src/Interop/Browser/Interop.Runtime.Api.cs
kjpou1 May 4, 2020
568211e
Update src/libraries/Common/src/Interop/Browser/Interop.Runtime.Api.cs
kjpou1 May 4, 2020
282efa0
Rename from .Api to .Bridge to address review comments
kjpou1 May 5, 2020
b09e224
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 5, 2020
fa165aa
Modify .csproj files to reflect .Bridge.cs change.
kjpou1 May 5, 2020
b57fef9
Remove unnecessary constant
kjpou1 May 5, 2020
a4753c0
Add docs
kjpou1 May 6, 2020
ee9c8d9
Update Bridge link
kjpou1 May 6, 2020
1eb5d23
Collapse code as per review comment.
kjpou1 May 6, 2020
49193b8
Address review comments on `Task.ConfigureAwait(continueOnCapturedCon…
kjpou1 May 6, 2020
6ce0e8d
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 6, 2020
1a655e5
Address review comment about using PropertyInfo reflection.
kjpou1 May 6, 2020
4636867
Coding Style - Address review comments
kjpou1 May 7, 2020
35380b5
Part of code style and object documentation to partially address revi…
kjpou1 May 7, 2020
233c3b3
Update src/libraries/Common/src/Interop/Browser/Interop.JavaScript.JS…
kjpou1 May 8, 2020
5e0ebf2
Update src/libraries/Common/src/Interop/Browser/Interop.Runtime.Bridg…
kjpou1 May 8, 2020
117c9ef
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
8604280
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
65c1f22
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
3d6ce31
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
de114a5
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
9244cb4
Add class docs and code style updates
kjpou1 May 8, 2020
fb95c39
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
22f5ea2
Fix badly formed XML
kjpou1 May 8, 2020
37a2b42
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
b20d6b5
Remove unnecessary Property implementations.
kjpou1 May 8, 2020
fc302f3
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 8, 2020
3a93043
Update code style involving the use of `var`
kjpou1 May 8, 2020
4818f60
Modify the underlying sockets field name.
kjpou1 May 8, 2020
521e772
Style and address review comments
kjpou1 May 8, 2020
688f5a7
Remove reliance on ConnectHelper.cs code as it is not supported on Br…
kjpou1 May 8, 2020
ea27792
Update src/libraries/Common/src/Interop/Browser/Interop.Runtime.Bridg…
kjpou1 May 8, 2020
04c53ae
Remove null check for httpresponse.Content as it is always assigned to.
kjpou1 May 8, 2020
ca9e2db
Address review comments
kjpou1 May 8, 2020
6e1542f
Remove methods that will not be implemented right now,
kjpou1 May 8, 2020
ea7f1c3
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 11, 2020
7e39ffb
Add properties back to fix build error
kjpou1 May 11, 2020
703e504
Remove tcs TaskCompletionSource to address review comments
kjpou1 May 11, 2020
6414529
code style change
kjpou1 May 11, 2020
a74d985
Remove disposing of _abortCts here as it causes runtime errors as bei…
kjpou1 May 11, 2020
4baf426
Address review comment for GetType()
kjpou1 May 11, 2020
ea61992
Rename library as per discussions
kjpou1 May 12, 2020
004ab2d
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 12, 2020
0ae1bf7
Add lock around the _boundObjects and _rawToJS access.
kjpou1 May 12, 2020
63b4e1e
Address review comments for disposing of CancellationTokenSource
kjpou1 May 15, 2020
e8ea3a9
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 18, 2020
648e61c
Address new HttpContent overloads in .NET 5 that take CancellationToken
kjpou1 May 18, 2020
dd05832
Add project and test structure for JavaScript InteropServices
kjpou1 May 19, 2020
796692b
Remove previous modification as it is no longer needed.
kjpou1 May 20, 2020
626d6c9
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 20, 2020
df1be16
Update src/libraries/System.Net.Http/src/System/Net/Http/BrowserHttpH…
kjpou1 May 20, 2020
e206e4b
Remove custom message passed to the PNSE .ctor
kjpou1 May 20, 2020
704bf8a
Update `mono` to dotnet or .NET
kjpou1 May 20, 2020
33222ea
Address review comment for internal sealed class
kjpou1 May 20, 2020
79e3287
Address extra message text
kjpou1 May 20, 2020
fbb6e6f
Move these source modules to System.Runtime.InteropServices.JavaScript
kjpou1 May 20, 2020
6614009
Add interop source modules to System.Runtime.InteropServices.JavaScri…
kjpou1 May 20, 2020
bdc38c4
Remove placeholder source
kjpou1 May 20, 2020
fcb9802
Reference System.Runtime.InteropServices.JavaScript project
kjpou1 May 20, 2020
b8abce1
Address review comments Unsafe.SizeOf
kjpou1 May 20, 2020
a712114
Finish move of sources to InteropServices.JavaScript
kjpou1 May 25, 2020
0185c17
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 25, 2020
e46ab9f
Remove ActiveIssue to address review comments
kjpou1 May 25, 2020
80b2132
Add core implementations
kjpou1 May 25, 2020
af5d902
Add core object implementation for Map
kjpou1 May 25, 2020
f2fb363
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 25, 2020
e5de014
Remove unused targetframework
kjpou1 May 26, 2020
530afe4
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 26, 2020
c72e64c
Fix PNSE in HttpClientHandler .ctor
kjpou1 May 26, 2020
5f17ee1
Remove extra parameters to `PlatformNotSupportedException`
kjpou1 May 26, 2020
d9c6dc4
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 27, 2020
0bd5966
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 27, 2020
25db30b
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 28, 2020
1468104
Fix tests due to underlying field name changing and reflection being …
kjpou1 May 28, 2020
da63da8
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 May 29, 2020
a276806
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 1, 2020
5d6f024
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 1, 2020
9bcdbcb
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 2, 2020
4706c69
Initial commit of reference counting code.
kjpou1 Jun 2, 2020
77e7e68
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 2, 2020
a7af316
Update code formatting
kjpou1 Jun 2, 2020
9e5ce12
Update solution formatting
kjpou1 Jun 2, 2020
ff19d0c
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 2, 2020
7c5cc2c
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 3, 2020
2d20cc1
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 4, 2020
9f74e50
[browser][wasm] Add support for marshaling the AnyRef SafeHandle
kjpou1 Jun 4, 2020
3702917
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 8, 2020
38cefb6
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 9, 2020
aaf4bd6
Code cleanup and formatting.
kjpou1 Jun 9, 2020
639e7a3
Merge branch 'master' of https://github.com/dotnet/runtime into wasm-…
kjpou1 Jun 10, 2020
5377cd9
Clean up
kjpou1 Jun 10, 2020
67330f1
Fix delegate code and address review comments
kjpou1 Jun 10, 2020
acdf5e6
Code clean up and change accessor on AnyRefHandle
kjpou1 Jun 10, 2020
ed308a3
Move outside block
kjpou1 Jun 10, 2020
05b0371
Remove unused method
kjpou1 Jun 10, 2020
2749f18
Remove nullable type from dictionary
kjpou1 Jun 10, 2020
403bedd
Remove comments
kjpou1 Jun 10, 2020
51e66a3
Marking methods with Linker-friendly reflection by using DynamicDepen…
kjpou1 Jun 10, 2020
4cc6fb4
address redundant using
kjpou1 Jun 10, 2020
31c640f
Address lock review comment
kjpou1 Jun 10, 2020
2743369
Address review comments
kjpou1 Jun 11, 2020
08a05cd
remove nullable code
kjpou1 Jun 11, 2020
9cee16a
Address review comments
kjpou1 Jun 11, 2020
d504b30
Add Debug.Assert to address review comment
kjpou1 Jun 11, 2020
9e74013
Address assert comments and code formatting
kjpou1 Jun 11, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Initial commit of reference counting code.
  • Loading branch information
kjpou1 committed Jun 2, 2020
commit 4706c69fdb2f71d3779c0cfc9a15779e22dc866b
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,55 @@
// See the LICENSE file in the project root for more information.

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.Win32.SafeHandles;

namespace System.Runtime.InteropServices.JavaScript
{
public class AnyRef
public abstract class AnyRef : SafeHandleMinusOneIsInvalid
{
public int JSHandle { get; internal set; }
internal GCHandle Handle;
public int JSHandle
{
get => (int)handle;
}

private AnyRef() : base(true) { }

internal GCHandle AnyRefHandle;

internal AnyRef(int jsHandle)
internal AnyRef(int js_handle, bool ownsHandle) : base(ownsHandle)
{
JSHandle = jsHandle;
Handle = GCHandle.Alloc(this);
SetHandle((IntPtr)js_handle);
this.AnyRefHandle = GCHandle.Alloc(this, ownsHandle ? GCHandleType.Weak : GCHandleType.Normal);
}

internal AnyRef(IntPtr jsHandle)
internal AnyRef(IntPtr js_handle, bool ownsHandle) : base(ownsHandle)
{
JSHandle = (int)jsHandle;
Handle = GCHandle.Alloc(this);
SetHandle(js_handle);
this.AnyRefHandle = GCHandle.Alloc(this, ownsHandle ? GCHandleType.Weak : GCHandleType.Normal);
}

// We should not provide a finalizer - SafeHandle's critical finalizer will call ReleaseHandle inside a CER for us.
protected override bool ReleaseHandle() => throw new NotImplementedException();

#if DEBUG_HANDLE
private int _refCount = 0;

public void AddRef()
{
Interlocked.Increment(ref _refCount);
}

public void Release()
{
Interlocked.MemoryBarrier();
Debug.Assert(_refCount > 0, "AnyRefSafeHandle: Release() called more times than AddRef");
Interlocked.Decrement(ref _refCount);
}

public int RefCount => _refCount;
#endif
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public Array(params object[] _params) : base(Interop.Runtime.New<Array>(_params)
/// Initializes a new instance of the Array/> class.
/// </summary>
/// <param name="jsHandle">Js handle.</param>
internal Array(IntPtr jsHandle) : base(jsHandle)
/// <param name="ownsHandle">Whether or not the handle is owned by the clr or not.</param>
internal Array(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public ArrayBuffer(int length) : base(Interop.Runtime.New<ArrayBuffer>(length))
/// Initializes a new instance of the JavaScript Core ArrayBuffer class.
/// </summary>
/// <param name="jsHandle">Js handle.</param>
internal ArrayBuffer(IntPtr jsHandle) : base(jsHandle)
/// <param name="ownsHandle">Whether or not the handle is owned by the clr or not.</param>
internal ArrayBuffer(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ namespace System.Runtime.InteropServices.JavaScript
/// </remarks>
public abstract class CoreObject : JSObject
{
protected CoreObject(int jsHandle) : base(jsHandle)
protected CoreObject(int jsHandle) : base(jsHandle, true)
{
object result = Interop.Runtime.BindCoreObject(jsHandle, (int)(IntPtr)Handle, out int exception);
object result = Interop.Runtime.BindCoreObject(jsHandle, (int)(IntPtr)AnyRefHandle, out int exception);
if (exception != 0)
throw new JSException($"CoreObject Error binding: {result}");
}

internal CoreObject(IntPtr js_handle) : base(js_handle)
internal CoreObject(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,9 @@ public DataView(SharedArrayBuffer buffer, int byteOffset, int byteLength) : base
/// <summary>
/// Initializes a new instance of the DataView class.
/// </summary>
/// <param name="js_handle">Js handle.</param>
internal DataView(IntPtr js_handle) : base(js_handle)
/// <param name="jsHandle">Js handle.</param>
/// <param name="ownsHandle">Managed owned</param>
internal DataView(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }
/// <summary>
/// Gets the length (in bytes) of this view from the start of its ArrayBuffer. Fixed at construction time and thus read only.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public Float32Array(SharedArrayBuffer buffer, int byteOffset) : base(buffer, byt

public Float32Array(SharedArrayBuffer buffer, int byteOffset, int length) : base(buffer, byteOffset, length) { }

internal Float32Array(IntPtr js_handle) : base(js_handle) { }
internal Float32Array(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
/// Defines an implicit conversion of Float32Array class to a float
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public Float64Array(SharedArrayBuffer buffer, int byteOffset) : base(buffer, byt

public Float64Array(SharedArrayBuffer buffer, int byteOffset, int length) : base(buffer, byteOffset, length) { }

internal Float64Array(IntPtr js_handle) : base(js_handle) { }
internal Float64Array(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
/// Defines an implicit conversion of Float64Array class to a double
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class Function : CoreObject
public Function(params object[] args) : base(Interop.Runtime.New<Function>(args))
{ }

internal Function(IntPtr jHandle) : base(jHandle)
internal Function(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ public HostObject(string hostName, params object[] _params) : base(Interop.Runti

public abstract class HostObjectBase : JSObject, IHostObject
{
protected HostObjectBase(int jHandle) : base(jHandle)
protected HostObjectBase(int jHandle) : base(jHandle, true)
{
object result = Interop.Runtime.BindHostObject(jHandle, (int)(IntPtr)Handle, out int exception);
object result = Interop.Runtime.BindHostObject(jHandle, (int)(IntPtr)AnyRefHandle, out int exception);
if (exception != 0)
throw new JSException($"HostObject Error binding: {result}");
}

internal HostObjectBase(IntPtr js_handle) : base(js_handle)
internal HostObjectBase(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public Int16Array(SharedArrayBuffer buffer, int byteOffset) : base(buffer, byteO

public Int16Array(SharedArrayBuffer buffer, int byteOffset, int length) : base(buffer, byteOffset, length) { }

internal Int16Array(IntPtr js_handle) : base(js_handle)
internal Int16Array(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public Int32Array(SharedArrayBuffer buffer, int byteOffset) : base(buffer, byteO

public Int32Array(SharedArrayBuffer buffer, int byteOffset, int length) : base(buffer, byteOffset, length) { }

internal Int32Array(IntPtr js_handle) : base(js_handle) { }
internal Int32Array(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
/// Defines an implicit conversion of Int32Array class to a int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public Int8Array(SharedArrayBuffer buffer, int byteOffset) : base(buffer, byteOf
public Int8Array(SharedArrayBuffer buffer, int byteOffset, int length) : base(buffer, byteOffset, length)
{ }

internal Int8Array(IntPtr js_handle) : base(js_handle)
internal Int8Array(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public interface IJSObject
int JSHandle { get; }
int Length { get; }
}

/// <summary>
/// JSObjects are wrappers for a native JavaScript object, and
/// they retain a reference to the JavaScript object for the lifetime of this C# object.
Expand All @@ -19,28 +20,50 @@ public class JSObject : AnyRef, IJSObject, IDisposable
{
internal object? RawObject;

// Right now this is used for Delegates
internal WeakReference? WeakRawObject;

// to detect redundant calls
public bool IsDisposed { get; internal set; }

public JSObject() : this(Interop.Runtime.New<object>())
public JSObject() : this(Interop.Runtime.New<object>(), true)
{
object result = Interop.Runtime.BindCoreObject(JSHandle, (int)(IntPtr)Handle, out int exception);
object result = Interop.Runtime.BindCoreObject(JSHandle, (int)(IntPtr)AnyRefHandle, out int exception);
if (exception != 0)
throw new JSException($"JSObject Error binding: {result}");

}

internal JSObject(IntPtr js_handle) : base(js_handle)
internal JSObject(IntPtr jsHandle, bool ownsHandle) : base(jsHandle, ownsHandle)
{ }

internal JSObject(int js_handle) : base((IntPtr)js_handle)
internal JSObject(int jsHandle, bool ownsHandle) : base((IntPtr)jsHandle, ownsHandle)
{ }

internal JSObject(int js_handle, object raw_obj) : base(js_handle)
internal JSObject(int jsHandle, object rawObj) : base(jsHandle, false)
{
RawObject = raw_obj;
RawObject = rawObj;
}

/// <summary>
/// Invoke a named method of the object, or throws a JSException on error.
/// </summary>
/// <param name="method">The name of the method to invoke.</param>
/// <param name="args">The argument list to pass to the invoke command.</param>
/// <returns>
/// <para>
/// The return value can either be a primitive (string, int, double), a JSObject for JavaScript objects, a
/// System.Threading.Tasks.Task(object) for JavaScript promises, an array of
/// a byte, int or double (for Javascript objects typed as ArrayBuffer) or a
/// System.Func to represent JavaScript functions. The specific version of
/// the Func that will be returned depends on the parameters of the Javascript function
/// and return value.
/// </para>
/// <para>
/// The value of a returned promise (The Task(object) return) can in turn be any of the above
/// valuews.
/// </para>
/// </returns>
public object Invoke(string method, params object?[] args)
{
object res = Interop.Runtime.InvokeJSWithArgs(JSHandle, method, args, out int exception);
Expand All @@ -49,25 +72,52 @@ public object Invoke(string method, params object?[] args)
return res;
}

/// <summary>
/// Returns the named property from the object, or throws a JSException on error.
/// </summary>
/// <param name="name">The name of the property to lookup</param>
/// <remarks>
/// This method can raise a JSException if fetching the property in Javascript raises an exception.
/// </remarks>
/// <returns>
/// <para>
/// The return value can either be a primitive (string, int, double), a
/// JSObject for JavaScript objects, a
/// System.Threading.Tasks.Task (object) for JavaScript promises, an array of
/// a byte, int or double (for Javascript objects typed as ArrayBuffer) or a
/// System.Func to represent JavaScript functions. The specific version of
/// the Func that will be returned depends on the parameters of the Javascript function
/// and return value.
/// </para>
/// <para>
/// The value of a returned promise (The Task(object) return) can in turn be any of the above
/// valuews.
/// </para>
/// </returns>
public object GetObjectProperty(string name)
{

object propertyValue = Interop.Runtime.GetObjectProperty(JSHandle, name, out int exception);

if (exception != 0)
throw new JSException((string)propertyValue);

return propertyValue;

}

/// <summary>
/// Sets the named property to the provided value.
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="name">The name of the property to lookup</param>
/// <param name="value">The value can be a primitive type (int, double, string, bool), an
/// array that will be surfaced as a typed ArrayBuffer (byte[], sbyte[], short[], ushort[],
/// float[], double[]) </param>
/// <param name="createIfNotExists">Defaults to <see langword="true"/> and creates the property on the javascript object if not found, if set to <see langword="false"/> it will not create the property if it does not exist. If the property exists, the value is updated with the provided value.</param>
/// <param name="hasOwnProperty"></param>
public void SetObjectProperty(string name, object value, bool createIfNotExists = true, bool hasOwnProperty = false)
{

object setPropResult = Interop.Runtime.SetObjectProperty(JSHandle, name, value, createIfNotExists, hasOwnProperty, out int exception);
if (exception != 0)
throw new JSException($"Error setting {name} on (js-obj js '{JSHandle}' .NET '{(IntPtr)Handle} raw '{RawObject != null})");

throw new JSException($"Error setting {name} on (js-obj js '{JSHandle}' .NET '{(IntPtr)AnyRefHandle} raw '{RawObject != null})");
}

/// <summary>
Expand Down Expand Up @@ -96,9 +146,7 @@ public int Length

protected void FreeHandle()
{
Interop.Runtime.ReleaseHandle(JSHandle, out int exception);
if (exception != 0)
throw new JSException($"Error releasing handle on (js-obj js '{JSHandle}' .NET '{(IntPtr)Handle} raw '{RawObject != null})");
Runtime.ReleaseJSObject(this);
}

public override bool Equals(object? obj) => obj is JSObject other && JSHandle == other.JSHandle;
Expand All @@ -108,44 +156,35 @@ public override int GetHashCode()
return JSHandle;
}

~JSObject()
// We should not provide a finalizer - SafeHandle's critical finalizer will call ReleaseHandle inside a CER for us.
protected override bool ReleaseHandle()
{
Dispose(false);
}

public void Dispose()
{
// Dispose of unmanaged resources.
Dispose(true);
// Suppress finalization.
GC.SuppressFinalize(this);
}

// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{

if (!IsDisposed)
{
if (disposing)
{

// Free any other managed objects here.
//
RawObject = null;
}

IsDisposed = true;

// Free any unmanaged objects here.
FreeHandle();

}
bool ret = false;

#if DEBUG_HANDLE
Console.WriteLine ($"Release Handle handle:{handle}");
try {
#endif
FreeHandle();

#if DEBUG_HANDLE
} catch (Exception exception) {
Console.WriteLine ($"ReleaseHandle: {exception.Message}");
ret = true; // Avoid a second assert.
throw;
} finally {
if (!ret) {
Console.WriteLine ($"ReleaseHandle failed. handle:{handle}");
}
}
//Runtime.DumpExistingObjects();
#endif
return ret;
}

public override string ToString()
{
return $"(js-obj js '{JSHandle}' .NET '{(IntPtr)Handle} raw '{RawObject != null})";
return $"(js-obj js '{(IntPtr)AnyRefHandle}' raw '{RawObject != null}' weak_raw '{WeakRawObject != null}')";
}

}
Expand Down
Loading