Skip to content

Commit 09067ce

Browse files
committed
Replace Unsafe.As with Unsafe.BitCast where appropriate
1 parent ec6754a commit 09067ce

File tree

5 files changed

+246
-246
lines changed

5 files changed

+246
-246
lines changed

AssetRipper.TextureDecoder.ColorGenerator/NumericConversionGenerator.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,14 @@ private static void WritePrimaryConvertMethod(IndentedTextWriter writer)
8282
writer.WriteLine("if (typeof(TFrom) == typeof(TTo))");
8383
using (new CurlyBrackets(writer))
8484
{
85-
writer.WriteLine("return Unsafe.As<TFrom, TTo>(ref value);");
85+
writer.WriteLine("return Unsafe.BitCast<TFrom, TTo>(value);");
8686
}
8787
foreach (CSharpPrimitives.Data from in CSharpPrimitives.List)
8888
{
8989
writer.WriteLine($"else if (typeof(TFrom) == typeof({from.LangName}))");
9090
using (new CurlyBrackets(writer))
9191
{
92-
writer.WriteLine($"return {ConvertMethodName(from.Type)}<TTo>(Unsafe.As<TFrom, {from.LangName}>(ref value));");
92+
writer.WriteLine($"return {ConvertMethodName(from.Type)}<TTo>(Unsafe.BitCast<TFrom, {from.LangName}>(value));");
9393
}
9494
}
9595
writer.WriteLine("else");
@@ -133,32 +133,32 @@ private static void WriteConvertMethod(IndentedTextWriter writer, CSharpPrimitiv
133133
{
134134
if (from == to)
135135
{
136-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref value);");
136+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(value);");
137137
}
138138
else if (to.HasPointerSize(out CSharpPrimitives.Data? bit32To, out CSharpPrimitives.Data? bit64To))
139139
{
140140
using (new If(writer, "IntPtr.Size == sizeof(int)"))
141141
{
142142
writer.WriteLine($"{to.LangName} converted = ({to.LangName}){methodName}<{bit32To.LangName}>(value);");
143-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
143+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
144144
}
145145
using (new Else(writer))
146146
{
147147
writer.WriteLine($"{to.LangName} converted = ({to.LangName}){methodName}<{bit64To.LangName}>(value);");
148-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
148+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
149149
}
150150
}
151151
else if (to.IsSignedInteger(out CSharpPrimitives.Data? unsignedTo))
152152
{
153153
writer.WriteLine($"{to.LangName} converted = {ChangeSign}({methodName}<{unsignedTo.LangName}>(value));");
154-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
154+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
155155
}
156156
else if (from.IsFloatingPoint)
157157
{
158158
if (to.IsFloatingPoint)
159159
{
160160
writer.WriteLine($"{to.LangName} converted = ({to.LangName})value;");
161-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
161+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
162162
}
163163
else
164164
{
@@ -176,7 +176,7 @@ private static void WriteConvertMethod(IndentedTextWriter writer, CSharpPrimitiv
176176
string maxValue = to.MaxValue;
177177
writer.WriteLine($"{from.LangName} x = value * ({from.LangName}){maxValue};");
178178
writer.WriteLine($"{to.LangName} converted = ({from.LangName}){maxValue} < x ? {maxValue} : (x > ({from.LangName}){minValue} ? ({to.LangName})x : {minValue});");
179-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
179+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
180180
}
181181
}
182182
}
@@ -191,12 +191,12 @@ private static void WriteConvertMethod(IndentedTextWriter writer, CSharpPrimitiv
191191
writer.WriteComment($"There isn't enough precision to convert from {from.LangName} to {to.LangName}, so we convert to {conversionType.LangName} first.");
192192
writer.WriteLine($"{conversionType.LangName} x = {methodName}<{conversionType.LangName}>(value);");
193193
writer.WriteLine($"{to.LangName} converted = ({to.LangName})x;");
194-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
194+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
195195
}
196196
else
197197
{
198198
writer.WriteLine($"{to.LangName} converted = ({to.LangName})value / ({to.LangName}){from.MaxValue};");
199-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
199+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
200200
}
201201
}
202202
else
@@ -216,7 +216,7 @@ private static void WriteConvertMethod(IndentedTextWriter writer, CSharpPrimitiv
216216
writer.Write($"(({conversionType})value << {i * from.Size * 8}) | ");
217217
}
218218
writer.WriteLine("value);");
219-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
219+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
220220
}
221221
}
222222
else
@@ -227,14 +227,14 @@ private static void WriteConvertMethod(IndentedTextWriter writer, CSharpPrimitiv
227227
writer.WriteComment("This is a special case where we already know an optimal algorithm.");
228228
writer.WriteLine("uint x = (value * 255u + 32895u) >> 16;");
229229
writer.WriteLine("byte converted = unchecked((byte)x);");
230-
writer.WriteLine("return Unsafe.As<byte, TTo>(ref converted);");
230+
writer.WriteLine("return Unsafe.BitCast<byte, TTo>(converted);");
231231
}
232232
else if (from.Size < sizeof(double) && to.Size < sizeof(double))
233233
{
234234
writer.WriteLine($"double interpolated = (double)value / (double){from.MaxValue};");
235235
writer.WriteLine($"double exact = interpolated * (double){to.MaxValue};");
236236
writer.WriteLine($"{to.LangName} converted = ({to.LangName})double.Round(exact, MidpointRounding.AwayFromZero);");
237-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
237+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
238238
}
239239
else
240240
{
@@ -245,7 +245,7 @@ private static void WriteConvertMethod(IndentedTextWriter writer, CSharpPrimitiv
245245
{
246246
int offset = (from.Size / to.Size - 1) * to.Size * 8;
247247
writer.WriteLine($"{to.LangName} converted = ({to.LangName})(({conversionType})value >> {offset});");
248-
writer.WriteLine($"return Unsafe.As<{to.LangName}, TTo>(ref converted);");
248+
writer.WriteLine($"return Unsafe.BitCast<{to.LangName}, TTo>(converted);");
249249
}
250250
}
251251
}
@@ -276,7 +276,7 @@ private static void WriteGetValueMethod(IndentedTextWriter writer, string method
276276
using (new CurlyBrackets(writer))
277277
{
278278
writer.WriteLine($"{from.LangName} value = {methodName}Safe<{from.LangName}>();");
279-
writer.WriteLine($"return Unsafe.As<{from.LangName}, T>(ref value);");
279+
writer.WriteLine($"return Unsafe.BitCast<{from.LangName}, T>(value);");
280280
}
281281
}
282282
writer.WriteLine("else");

AssetRipper.TextureDecoder/Exr/BinaryWriterExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,16 @@ public static void Write<T>(this BinaryWriter writer, T value) where T : unmanag
7676
switch (Unsafe.SizeOf<T>())
7777
{
7878
case sizeof(byte):
79-
writer.Write(Unsafe.As<T, byte>(ref value));
79+
writer.Write(Unsafe.BitCast<T, byte>(value));
8080
break;
8181
case sizeof(ushort):
82-
writer.Write(Unsafe.As<T, ushort>(ref value));
82+
writer.Write(Unsafe.BitCast<T, ushort>(value));
8383
break;
8484
case sizeof(uint):
85-
writer.Write(Unsafe.As<T, uint>(ref value));
85+
writer.Write(Unsafe.BitCast<T, uint>(value));
8686
break;
8787
case sizeof(ulong):
88-
writer.Write(Unsafe.As<T, ulong>(ref value));
88+
writer.Write(Unsafe.BitCast<T, ulong>(value));
8989
break;
9090
}
9191
}

AssetRipper.TextureDecoder/Rgb/Color.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public static TTarget Convert<TThis, TThisChannelValue, TTarget, TTargetChannelV
8282
{
8383
if (typeof(TThis) == typeof(TTarget))
8484
{
85-
return Unsafe.As<TThis, TTarget>(ref color);
85+
return Unsafe.BitCast<TThis, TTarget>(color);
8686
}
8787
else
8888
{

AssetRipper.TextureDecoder/Rgb/NumericConversion.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private static TTo ToSignedNumber<TFrom, TTo>(TFrom value)
4242

4343
TFrom SignBit = TFrom.One << (Unsafe.SizeOf<TFrom>() * 8 - 1);
4444
TFrom converted = (SignBit ^ value);
45-
return Unsafe.As<TFrom, TTo>(ref converted);
45+
return Unsafe.BitCast<TFrom, TTo>(converted);
4646
}
4747

4848
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
@@ -56,6 +56,6 @@ private static TTo ToUnsignedNumber<TFrom, TTo>(TFrom value)
5656
}
5757

5858
TTo SignBit = TTo.One << (Unsafe.SizeOf<TTo>() * 8 - 1);
59-
return SignBit ^ Unsafe.As<TFrom, TTo>(ref value);
59+
return SignBit ^ Unsafe.BitCast<TFrom, TTo>(value);
6060
}
6161
}

0 commit comments

Comments
 (0)