@@ -91,8 +91,30 @@ protected PointerIntCast(
91
91
/// Casts from an integer to a raw pointer value.
92
92
/// </summary>
93
93
[ ValueKind ( ValueKind . IntAsPointerCast ) ]
94
- public sealed class IntAsPointerCast : PointerIntCast
94
+ public sealed class IntAsPointerCast : PointerIntCast , IValueReader
95
95
{
96
+ #region Static
97
+
98
+ /// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
99
+ public static Value ? Read ( ValueHeader header , IIRReader reader )
100
+ {
101
+ var methodBuilder = header . Method ? . MethodBuilder ;
102
+ if ( methodBuilder is not null &&
103
+ header . Block is not null &&
104
+ header . Block . GetOrCreateBuilder ( methodBuilder ,
105
+ out BasicBlock . Builder ? blockBuilder ) )
106
+ {
107
+ return blockBuilder . CreateIntAsPointerCast (
108
+ Location . Unknown , header . Nodes [ 0 ] ) ;
109
+ }
110
+ else
111
+ {
112
+ return null ;
113
+ }
114
+ }
115
+
116
+ #endregion
117
+
96
118
#region Instance
97
119
98
120
/// <summary>
@@ -157,8 +179,32 @@ protected internal override void Write<T>(T writer) { }
157
179
/// Casts from a pointer value to an integer.
158
180
/// </summary>
159
181
[ ValueKind ( ValueKind . PointerAsIntCast ) ]
160
- public sealed class PointerAsIntCast : PointerIntCast
182
+ public sealed class PointerAsIntCast : PointerIntCast , IValueReader
161
183
{
184
+ #region Static
185
+
186
+ /// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
187
+ public static Value ? Read ( ValueHeader header , IIRReader reader )
188
+ {
189
+ var methodBuilder = header . Method ? . MethodBuilder ;
190
+ if ( methodBuilder is not null &&
191
+ header . Block is not null &&
192
+ header . Block . GetOrCreateBuilder ( methodBuilder ,
193
+ out BasicBlock . Builder ? blockBuilder ) &&
194
+ reader . Read ( out BasicValueType targetBasicValueType ) )
195
+ {
196
+ return blockBuilder . CreatePointerAsIntCast (
197
+ Location . Unknown , header . Nodes [ 0 ] ,
198
+ targetBasicValueType ) ;
199
+ }
200
+ else
201
+ {
202
+ return null ;
203
+ }
204
+ }
205
+
206
+ #endregion
207
+
162
208
#region Instance
163
209
164
210
/// <summary>
@@ -215,7 +261,8 @@ protected internal override Value Rebuild(
215
261
TargetBasicValueType ) ;
216
262
217
263
/// <summary cref="Value.Write{T}(T)"/>
218
- protected internal override void Write < T > ( T writer ) { }
264
+ protected internal override void Write < T > ( T writer ) =>
265
+ writer . Write ( nameof ( TargetBasicValueType ) , TargetBasicValueType ) ;
219
266
220
267
/// <summary cref="Value.Accept"/>
221
268
public override void Accept < T > ( T visitor ) => visitor . Visit ( this ) ;
@@ -270,8 +317,32 @@ internal BaseAddressSpaceCast(
270
317
/// Casts the type of a pointer to a different type.
271
318
/// </summary>
272
319
[ ValueKind ( ValueKind . PointerCast ) ]
273
- public sealed class PointerCast : BaseAddressSpaceCast
320
+ public sealed class PointerCast : BaseAddressSpaceCast , IValueReader
274
321
{
322
+ #region Static
323
+
324
+ /// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
325
+ public static Value ? Read ( ValueHeader header , IIRReader reader )
326
+ {
327
+ var methodBuilder = header . Method ? . MethodBuilder ;
328
+ if ( methodBuilder is not null &&
329
+ header . Block is not null &&
330
+ header . Block . GetOrCreateBuilder ( methodBuilder ,
331
+ out BasicBlock . Builder ? blockBuilder ) &&
332
+ reader . Read ( out long targetTypeId ) )
333
+ {
334
+ return blockBuilder . CreatePointerCast (
335
+ Location . Unknown , header . Nodes [ 0 ] ,
336
+ reader . Context . Types [ targetTypeId ] ) ;
337
+ }
338
+ else
339
+ {
340
+ return null ;
341
+ }
342
+ }
343
+
344
+ #endregion
345
+
275
346
#region Instance
276
347
277
348
/// <summary>
@@ -479,8 +550,33 @@ protected internal override void Write<T>(T writer) =>
479
550
/// Casts a view from one element type to another.
480
551
/// </summary>
481
552
[ ValueKind ( ValueKind . ViewCast ) ]
482
- public sealed class ViewCast : BaseAddressSpaceCast
553
+ public sealed class ViewCast : BaseAddressSpaceCast , IValueReader
483
554
{
555
+ #region Static
556
+
557
+ /// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
558
+ public static Value ? Read ( ValueHeader header , IIRReader reader )
559
+ {
560
+ var methodBuilder = header . Method ? . MethodBuilder ;
561
+ if ( methodBuilder is not null &&
562
+ header . Block is not null &&
563
+ header . Block . GetOrCreateBuilder ( methodBuilder ,
564
+ out BasicBlock . Builder ? blockBuilder ) &&
565
+ reader . Read ( out long targetElementTypeId ) )
566
+ {
567
+ return blockBuilder . CreateViewCast (
568
+ Location . Unknown , header . Nodes [ 0 ] ,
569
+ reader . Context . Types [ targetElementTypeId ]
570
+ ) ;
571
+ }
572
+ else
573
+ {
574
+ return null ;
575
+ }
576
+ }
577
+
578
+ #endregion
579
+
484
580
#region Instance
485
581
486
582
/// <summary>
@@ -562,8 +658,30 @@ protected internal override void Write<T>(T writer) =>
562
658
/// Casts an array to a linear array view.
563
659
/// </summary>
564
660
[ ValueKind ( ValueKind . ArrayToViewCast ) ]
565
- public sealed class ArrayToViewCast : CastValue
661
+ public sealed class ArrayToViewCast : CastValue , IValueReader
566
662
{
663
+ #region Static
664
+
665
+ /// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
666
+ public static Value ? Read ( ValueHeader header , IIRReader reader )
667
+ {
668
+ var methodBuilder = header . Method ? . MethodBuilder ;
669
+ if ( methodBuilder is not null &&
670
+ header . Block is not null &&
671
+ header . Block . GetOrCreateBuilder ( methodBuilder ,
672
+ out BasicBlock . Builder ? blockBuilder ) )
673
+ {
674
+ return blockBuilder . CreateArrayToViewCast (
675
+ Location . Unknown , header . Nodes [ 0 ] ) ;
676
+ }
677
+ else
678
+ {
679
+ return null ;
680
+ }
681
+ }
682
+
683
+ #endregion
684
+
567
685
#region Instance
568
686
569
687
/// <summary>
@@ -698,8 +816,30 @@ protected sealed override TypeNode ComputeType(
698
816
/// Casts from a float to an int while preserving bits.
699
817
/// </summary>
700
818
[ ValueKind ( ValueKind . FloatAsIntCast ) ]
701
- public sealed class FloatAsIntCast : BitCast
819
+ public sealed class FloatAsIntCast : BitCast , IValueReader
702
820
{
821
+ #region Static
822
+
823
+ /// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
824
+ public static Value ? Read ( ValueHeader header , IIRReader reader )
825
+ {
826
+ var methodBuilder = header . Method ? . MethodBuilder ;
827
+ if ( methodBuilder is not null &&
828
+ header . Block is not null &&
829
+ header . Block . GetOrCreateBuilder ( methodBuilder ,
830
+ out BasicBlock . Builder ? blockBuilder ) )
831
+ {
832
+ return blockBuilder . CreateFloatAsIntCast (
833
+ Location . Unknown , header . Nodes [ 0 ] ) ;
834
+ }
835
+ else
836
+ {
837
+ return null ;
838
+ }
839
+ }
840
+
841
+ #endregion
842
+
703
843
#region Instance
704
844
705
845
/// <summary>
@@ -767,8 +907,30 @@ protected internal override void Write<T>(T writer) { }
767
907
/// Casts from an int to a float while preserving bits.
768
908
/// </summary>
769
909
[ ValueKind ( ValueKind . IntAsFloatCast ) ]
770
- public sealed class IntAsFloatCast : BitCast
910
+ public sealed class IntAsFloatCast : BitCast , IValueReader
771
911
{
912
+ #region Static
913
+
914
+ /// <summary cref="IValueReader.Read(ValueHeader, IIRReader)"/>
915
+ public static Value ? Read ( ValueHeader header , IIRReader reader )
916
+ {
917
+ var methodBuilder = header . Method ? . MethodBuilder ;
918
+ if ( methodBuilder is not null &&
919
+ header . Block is not null &&
920
+ header . Block . GetOrCreateBuilder ( methodBuilder ,
921
+ out BasicBlock . Builder ? blockBuilder ) )
922
+ {
923
+ return blockBuilder . CreateIntAsFloatCast (
924
+ Location . Unknown , header . Nodes [ 0 ] ) ;
925
+ }
926
+ else
927
+ {
928
+ return null ;
929
+ }
930
+ }
931
+
932
+ #endregion
933
+
772
934
#region Instance
773
935
774
936
/// <summary>
0 commit comments