Skip to content

Commit 5c79729

Browse files
Introduce TorchSharp.ScalarLeakDetector.
In the following case, at least 266 exceptions are observed. * allowImplicitConversionOperator = false * dotnet test /p:SkipCuda=true /p:SkipNetFxBuild=true --blame test\TorchSharpTest\TorchSharpTest.csproj -c Release * Update src/TorchSharp/Scalar.cs. + Introduce ScalarLeakDetector. + Update Scalar. - Use ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed.
1 parent 069bb0d commit 5c79729

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/TorchSharp/Scalar.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,28 @@
55
#nullable enable
66
namespace TorchSharp
77
{
8+
/// <summary>
9+
/// Represents a leak detector for Scalar.
10+
/// </summary>
11+
public static partial class ScalarLeakDetector
12+
{
13+
/// <summary>
14+
/// Allows implicit conversion from a .NET scalar value to Scalar.<br/>
15+
/// FIXME: Declared true for default to be compatible to 0.105.1 or earlier.
16+
/// </summary>
17+
public static bool allowImplicitConversionOperator { get; set; } = true;
18+
/// <summary>
19+
/// Throws an exception if implicit conversion is not allowed.
20+
/// </summary>
21+
/// <exception cref="InvalidCastException"></exception>
22+
public static void ThrowIfImplicitConversionNotAllowed()
23+
{
24+
if (!allowImplicitConversionOperator)
25+
{
26+
throw new InvalidCastException("Unexpected implicit conversion to Scalar.");
27+
}
28+
}
29+
}
830
/// <summary>
931
/// Represents a dynamically typed scalar value to the LibTorch runtime.
1032
/// </summary>
@@ -31,6 +53,7 @@ internal Scalar(IntPtr handle)
3153
/// <param name="value">The scalar value.</param>
3254
public static implicit operator Scalar(byte value)
3355
{
56+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
3457
return value.ToScalar();
3558
}
3659

@@ -40,6 +63,7 @@ public static implicit operator Scalar(byte value)
4063
/// <param name="value">The scalar value.</param>
4164
public static implicit operator Scalar(sbyte value)
4265
{
66+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
4367
return value.ToScalar();
4468
}
4569

@@ -49,6 +73,7 @@ public static implicit operator Scalar(sbyte value)
4973
/// <param name="value">The scalar value.</param>
5074
public static implicit operator Scalar(short value)
5175
{
76+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
5277
return value.ToScalar();
5378
}
5479

@@ -58,6 +83,7 @@ public static implicit operator Scalar(short value)
5883
/// <param name="value">The scalar value.</param>
5984
public static implicit operator Scalar(int value)
6085
{
86+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
6187
return value.ToScalar();
6288
}
6389

@@ -67,6 +93,7 @@ public static implicit operator Scalar(int value)
6793
/// <param name="value">The scalar value.</param>
6894
public static implicit operator Scalar(long value)
6995
{
96+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
7097
return value.ToScalar();
7198
}
7299

@@ -77,6 +104,7 @@ public static implicit operator Scalar(long value)
77104
/// <param name="value">The scalar value.</param>
78105
public static implicit operator Scalar(Half value)
79106
{
107+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
80108
return value.ToScalar();
81109
}
82110
#endif
@@ -87,6 +115,7 @@ public static implicit operator Scalar(Half value)
87115
/// <param name="value">The scalar value.</param>
88116
public static implicit operator Scalar(float value)
89117
{
118+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
90119
return value.ToScalar();
91120
}
92121

@@ -96,6 +125,7 @@ public static implicit operator Scalar(float value)
96125
/// <param name="value">The scalar value.</param>
97126
public static implicit operator Scalar(double value)
98127
{
128+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
99129
return value.ToScalar();
100130
}
101131

@@ -105,6 +135,7 @@ public static implicit operator Scalar(double value)
105135
/// <param name="value">The scalar value.</param>
106136
public static implicit operator Scalar(bool value)
107137
{
138+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
108139
return value.ToScalar();
109140
}
110141

@@ -114,6 +145,7 @@ public static implicit operator Scalar(bool value)
114145
/// <param name="value">The scalar value.</param>
115146
public static implicit operator Scalar((float, float) value)
116147
{
148+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
117149
return value.ToScalar();
118150
}
119151

@@ -123,6 +155,7 @@ public static implicit operator Scalar((float, float) value)
123155
/// <param name="value">The scalar value.</param>
124156
public static implicit operator Scalar(System.Numerics.Complex value)
125157
{
158+
ScalarLeakDetector.ThrowIfImplicitConversionNotAllowed();
126159
return value.ToScalar();
127160
}
128161

0 commit comments

Comments
 (0)