Skip to content
This repository was archived by the owner on Dec 12, 2024. It is now read-only.

Commit b89a972

Browse files
Merge pull request #432 from xamarin/refactor-the-first
moving common code for ISwiftObject
2 parents 0559244 + 073c65e commit b89a972

File tree

8 files changed

+100
-134
lines changed

8 files changed

+100
-134
lines changed

SwiftRuntimeLibrary.Mac/SwiftRuntimeLibrary.Mac.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,12 @@
277277
<Compile Include="..\SwiftRuntimeLibrary\BaseAssociatedTypeProxy.cs">
278278
<Link>BaseAssociatedTypeProxy.cs</Link>
279279
</Compile>
280+
<Compile Include="..\SwiftRuntimeLibrary\SwiftNativeInstance.cs">
281+
<Link>SwiftNativeInstance.cs</Link>
282+
</Compile>
283+
<Compile Include="..\SwiftRuntimeLibrary\SwiftNativeObject.cs">
284+
<Link>SwiftNativeObject.cs</Link>
285+
</Compile>
280286
</ItemGroup>
281287
<ItemGroup>
282288
<Folder Include="SwiftMarshal\" />

SwiftRuntimeLibrary.iOS/SwiftRuntimeLibrary.iOS.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,12 @@
282282
<Compile Include="..\SwiftRuntimeLibrary\BaseAssociatedTypeProxy.cs">
283283
<Link>BaseAssociatedTypeProxy.cs</Link>
284284
</Compile>
285+
<Compile Include="..\SwiftRuntimeLibrary\SwiftNativeObject.cs">
286+
<Link>SwiftNativeObject.cs</Link>
287+
</Compile>
288+
<Compile Include="..\SwiftRuntimeLibrary\SwiftNativeInstance.cs">
289+
<Link>SwiftNativeInstance.cs</Link>
290+
</Compile>
285291
</ItemGroup>
286292
<Target Name="GeneratedCSCode" BeforeTargets="CoreCompile" Inputs="$(MSBuildProjectFullPath)" Outputs="GeneratedCode\BindingMetadata.iOS.cs">
287293
<Exec Command="make --directory=../SwiftRuntimeLibrary create-pinvokes-ios configuration=$(Configuration)" />

SwiftRuntimeLibrary/BaseAssociatedTypeProxy.cs

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,16 @@
66

77
namespace SwiftRuntimeLibrary {
88
[SwiftNativeObject ()]
9-
public class BaseAssociatedTypeProxy : ISwiftObject {
10-
IntPtr handle;
11-
SwiftMetatype class_handle;
12-
SwiftObjectFlags object_flags = SwiftObjectFlags.IsSwift;
13-
9+
public class BaseAssociatedTypeProxy : SwiftNativeObject {
1410
protected BaseAssociatedTypeProxy (IntPtr handle, SwiftMetatype classHandle, SwiftObjectRegistry registry)
11+
: base (handle, classHandle, registry)
1512
{
16-
if (SwiftNativeObjectAttribute.IsSwiftNativeObject (this)) {
17-
object_flags |= SwiftObjectFlags.IsDirectBinding;
18-
}
19-
class_handle = classHandle;
20-
SwiftObject = handle;
2113
if (IsCSObjectProxy)
2214
registry.Add (this);
2315
}
2416

2517
protected BaseAssociatedTypeProxy (byte [] swiftTypeData, SwiftMetatype mt)
18+
: base (IntPtr.Zero, mt, SwiftObjectRegistry.Registry)
2619
{
2720
if (swiftTypeData == null)
2821
throw new ArgumentNullException (nameof (swiftTypeData));
@@ -33,33 +26,11 @@ protected BaseAssociatedTypeProxy (byte [] swiftTypeData, SwiftMetatype mt)
3326
ProxiedMetatype = mt;
3427
}
3528

36-
public void Dispose ()
37-
{
38-
Dispose (true);
39-
GC.SuppressFinalize (this);
40-
}
41-
42-
protected virtual void Dispose (bool disposing)
29+
protected override void DisposeUnmanagedResources ()
4330
{
44-
if ((object_flags & SwiftObjectFlags.Disposed) != SwiftObjectFlags.Disposed) {
45-
if (disposing) {
46-
DisposeManagedResources ();
47-
}
48-
if (IsCSObjectProxy)
49-
SwiftObjectRegistry.Registry.RemoveAndWeakRelease (this);
50-
DisposeUnmanagedResources ();
51-
object_flags |= SwiftObjectFlags.Disposed;
52-
}
53-
}
5431

55-
protected virtual void DisposeManagedResources ()
56-
{
57-
}
58-
59-
protected virtual void DisposeUnmanagedResources ()
60-
{
6132
if (IsCSObjectProxy) {
62-
SwiftCore.Release (SwiftObject);
33+
base.DisposeUnmanagedResources ();
6334
} else {
6435
StructMarshal.Marshaler.NominalDestroy (ProxiedMetatype, SwiftData);
6536
}
@@ -70,16 +41,7 @@ protected virtual void DisposeUnmanagedResources ()
7041
Dispose (false);
7142
}
7243

73-
protected bool IsCSObjectProxy => handle != IntPtr.Zero;
74-
75-
public IntPtr SwiftObject {
76-
get {
77-
return handle;
78-
}
79-
private set {
80-
handle = value;
81-
}
82-
}
44+
protected bool IsCSObjectProxy => SwiftObject != IntPtr.Zero;
8345

8446
protected byte [] SwiftData { get; set; }
8547

SwiftRuntimeLibrary/EveryProtocol.cs

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace SwiftRuntimeLibrary {
99
[SwiftNativeObject]
10-
public class EveryProtocol : ISwiftObject {
10+
public class EveryProtocol : SwiftNativeObject {
1111
protected IntPtr handle;
1212

1313
protected SwiftMetatype class_handle;
@@ -28,21 +28,11 @@ static IntPtr _XamEveryProtocolCtorImpl ()
2828
}
2929

3030
public EveryProtocol ()
31-
: this (_XamEveryProtocolCtorImpl (), GetSwiftMetatype (), SwiftObjectRegistry.Registry)
31+
: base (_XamEveryProtocolCtorImpl (), GetSwiftMetatype (), SwiftObjectRegistry.Registry)
3232
{
3333
}
3434

35-
protected EveryProtocol (IntPtr handle, SwiftMetatype classHandle, SwiftObjectRegistry registry)
36-
{
37-
if (SwiftNativeObjectAttribute.IsSwiftNativeObject (this)) {
38-
object_flags |= SwiftObjectFlags.IsDirectBinding;
39-
}
40-
class_handle = classHandle;
41-
SwiftObject = handle;
42-
registry.Add (this);
43-
}
44-
45-
EveryProtocol (IntPtr handle, SwiftObjectRegistry registry) : this (handle, GetSwiftMetatype (), registry)
35+
EveryProtocol (IntPtr handle, SwiftObjectRegistry registry) : base (handle, GetSwiftMetatype (), registry)
4636
{
4737
}
4838

@@ -51,47 +41,10 @@ public static EveryProtocol XamarinFactory (IntPtr p)
5141
return new EveryProtocol (p, SwiftObjectRegistry.Registry);
5242
}
5343

54-
public void Dispose ()
55-
{
56-
Dispose (true);
57-
GC.SuppressFinalize (this);
58-
}
59-
60-
protected virtual void Dispose (bool disposing)
61-
{
62-
if ((object_flags & SwiftObjectFlags.Disposed) !=
63-
SwiftObjectFlags.Disposed) {
64-
if (disposing) {
65-
DisposeManagedResources ();
66-
}
67-
SwiftObjectRegistry.Registry.RemoveAndWeakRelease (this);
68-
DisposeUnmanagedResources ();
69-
object_flags |= SwiftObjectFlags.Disposed;
70-
}
71-
}
72-
73-
protected virtual void DisposeManagedResources ()
74-
{
75-
}
76-
77-
protected virtual void DisposeUnmanagedResources ()
78-
{
79-
SwiftCore.Release (SwiftObject);
80-
}
81-
8244
~EveryProtocol ()
8345
{
8446
Dispose (false);
8547
}
86-
87-
public IntPtr SwiftObject {
88-
get {
89-
return handle;
90-
}
91-
private set {
92-
handle = value;
93-
}
94-
}
9548
}
9649

9750
internal class NativeMethodsForEveryProtocol {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
6+
namespace SwiftRuntimeLibrary {
7+
public abstract class SwiftNativeInstance : IDisposable {
8+
~SwiftNativeInstance ()
9+
{
10+
Dispose (false);
11+
}
12+
public void Dispose ()
13+
{
14+
Dispose (true);
15+
GC.SuppressFinalize (this);
16+
}
17+
protected abstract void Dispose (bool disposing);
18+
}
19+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using SwiftRuntimeLibrary.SwiftMarshal;
6+
7+
namespace SwiftRuntimeLibrary {
8+
public abstract class SwiftNativeObject : SwiftNativeInstance, ISwiftObject {
9+
IntPtr handle;
10+
SwiftMetatype class_handle;
11+
SwiftObjectFlags object_flags = SwiftObjectFlags.IsSwift;
12+
13+
protected SwiftNativeObject (IntPtr handle, SwiftMetatype classHandle, SwiftObjectRegistry registry)
14+
{
15+
if (SwiftNativeObjectAttribute.IsSwiftNativeObject (this)) {
16+
object_flags |= SwiftObjectFlags.IsDirectBinding;
17+
}
18+
class_handle = classHandle;
19+
SwiftObject = handle;
20+
registry.Add (this);
21+
}
22+
23+
protected override void Dispose (bool disposing)
24+
{
25+
if ((object_flags & SwiftObjectFlags.Disposed) != SwiftObjectFlags.Disposed) {
26+
if (disposing) {
27+
DisposeManagedResources ();
28+
}
29+
DisposeUnmanagedResources ();
30+
SwiftObjectRegistry.Registry.RemoveAndWeakRelease (this);
31+
object_flags |= SwiftObjectFlags.Disposed;
32+
}
33+
}
34+
35+
protected virtual void DisposeManagedResources ()
36+
{
37+
}
38+
39+
protected virtual void DisposeUnmanagedResources ()
40+
{
41+
SwiftCore.Release (SwiftObject);
42+
}
43+
44+
public IntPtr SwiftObject {
45+
get {
46+
return handle;
47+
}
48+
private set {
49+
handle = value;
50+
}
51+
}
52+
}
53+
}

SwiftRuntimeLibrary/SwiftRuntimeLibrary.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@
116116
<Compile Include="SwiftMarshal\SwiftProtocolWitnessTable.cs" />
117117
<Compile Include="SwiftMarshal\SwiftAssociatedTypeDescriptor.cs" />
118118
<Compile Include="BaseAssociatedTypeProxy.cs" />
119+
<Compile Include="SwiftNativeObject.cs" />
120+
<Compile Include="SwiftNativeInstance.cs" />
119121
</ItemGroup>
120122
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
121123
<ItemGroup>

SwiftRuntimeLibrary/XamTrivialSwiftObject.cs

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,57 +5,22 @@
55
using System.Runtime.InteropServices;
66

77
namespace SwiftRuntimeLibrary {
8-
public class XamTrivialSwiftObject : ISwiftObject {
9-
bool disposed;
10-
8+
public class XamTrivialSwiftObject : SwiftNativeObject {
119
public XamTrivialSwiftObject ()
10+
: base (NativeMethodsForXamTrivialSwiftObject.PIctor (NativeMethodsForXamTrivialSwiftObject.PImeta ()),
11+
NativeMethodsForXamTrivialSwiftObject.PImeta (), SwiftObjectRegistry.Registry)
1212
{
13-
SwiftObject = NativeMethodsForXamTrivialSwiftObject.PIctor (NativeMethodsForXamTrivialSwiftObject.PImeta ());
14-
SwiftCore.Retain (SwiftObject);
15-
SwiftObjectRegistry.Registry.Add (this);
1613
}
14+
1715
XamTrivialSwiftObject (IntPtr p, SwiftObjectRegistry registry)
16+
: base (p, NativeMethodsForXamTrivialSwiftObject.PImeta (), registry)
1817
{
19-
SwiftObject = p;
20-
SwiftCore.Retain (p);
21-
registry.Add (this);
2218
}
2319

2420
public static object XamarinFactory (IntPtr p)
2521
{
2622
return new XamTrivialSwiftObject (p, SwiftObjectRegistry.Registry);
2723
}
28-
29-
public IntPtr SwiftObject { get; set; }
30-
31-
~XamTrivialSwiftObject ()
32-
{
33-
Dispose (false);
34-
}
35-
public void Dispose ()
36-
{
37-
Dispose (true);
38-
}
39-
40-
protected virtual void Dispose (bool disposing)
41-
{
42-
if (!disposed) {
43-
if (disposing) {
44-
DisposeManagedResources ();
45-
}
46-
DisposeUnmanagedResources ();
47-
disposed = true;
48-
}
49-
}
50-
51-
protected virtual void DisposeManagedResources ()
52-
{
53-
}
54-
55-
protected virtual void DisposeUnmanagedResources ()
56-
{
57-
SwiftCore.Release (SwiftObject);
58-
}
5924
}
6025

6126
internal class NativeMethodsForXamTrivialSwiftObject {

0 commit comments

Comments
 (0)