[2019-12] [threads] Add back mono_threads_attach_tools_thread as a public API (#18074)
[mono-project.git] / mono / tests / tailcall-interface-conservestack.il
blobd709d47d4a68e919b446c4c6262169a0ffb0afa0
1 /*
2 Author:
3     Jay Krell (jaykrell@microsoft.com)
5 Copyright 2018 Microsoft
6 Licensed under the MIT license. See LICENSE file in the project root for full license information.
8 Derived from tailcall-interface.cs.
9 */
11 .assembly extern mscorlib {  }
13 .assembly 'tailcall-interface-conservestack' { }
15 .class public sequential sealed Point
16 extends [mscorlib]System.ValueType
18 .field public int32 x
19 .field public int32 y
22 .class interface private abstract I1
25 .method public newslot abstract virtual instance void perturb_interface_offset1() { }
27 .method public newslot abstract virtual instance void F1(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
31 .method public newslot abstract virtual instance void GF1<TF>(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
37 .class interface private abstract GI1`1<TC>
40 .method public newslot abstract virtual instance void perturb_interface_offset1()
44 .method public newslot abstract virtual instance void perturb_interface_offset2()
48 .method public newslot abstract virtual instance void F1(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
52 .method public newslot abstract virtual instance void GF1<TF>(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
56 .method public newslot abstract virtual instance void HF1<TF>(class GI2`1<!!TF> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
61 .class interface private abstract I2
63 .method public newslot abstract virtual instance void perturb_interface_offset1() { }
65 .method public newslot abstract virtual instance void perturb_interface_offset2() { }
67 .method public newslot abstract virtual instance void perturb_interface_offset3() { }
69 .method public newslot abstract virtual instance void F2(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
73 .method public newslot abstract virtual instance void GF2<TF>(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
79 .class interface private abstract GI2`1<TC>
82 .method public newslot abstract virtual instance void perturb_interface_offset1()
86 .method public newslot abstract virtual instance void perturb_interface_offset2()
90 .method public newslot abstract virtual instance void perturb_interface_offset3()
94 .method public newslot abstract virtual instance void perturb_interface_offset4()
98 .method public newslot abstract virtual instance void F2(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
101 .method public newslot abstract virtual instance void GF2<TF>(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
104 .method public newslot abstract virtual instance void HF2<TF>(class GI1`1<!!TF> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
109 .class public C1 implements I1
111 .field static int64 i
112 .field public static int64 errors
114 .method private newslot virtual final instance void I1.perturb_interface_offset1()
116 .override I1::perturb_interface_offset1
120 .method public static void check(int64 stack1, int64 stack2)
122 ldsfld int64 C1::i
123 ldc.i8 1
125 stsfld int64 C1::i
127 ldarg 0
128 ldarg 1
129 bne.un IL_0013
131 //ldstr "{0}"
132 //ldsfld int64 C1::i
133 //box [mscorlib]System.Int64
134 //call void [mscorlib]System.Console::WriteLine(string, object)
137 IL_0013:
138 ldsfld int64 C1::errors
139 ldc.i8 1
141 stsfld int64 C1::errors
143 ldstr "{0} tailcall failure stack1:{1:X} stack2:{2:X} delta:{3}"
145 ldc.i4 4
146 newarr [mscorlib]System.Object
149 ldc.i4 0
150 ldsfld int64 C1::i
151 box [mscorlib]System.Int64
152 stelem.ref
155 ldc.i4 1
156 ldarg 0
157 box [mscorlib]System.Int64
158 stelem.ref
161 ldc.i4 2
162 ldarg 1
163 box [mscorlib]System.Int64
164 stelem.ref
167 ldc.i4 3
168 ldarg 0
169 ldarg 1
171 box [mscorlib]System.Int64
172 stelem.ref
174 call void class [mscorlib]System.Console::WriteLine(string, object[])
177 .method private newslot virtual final instance void I1.F1(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
179 .override I1::F1
181 ldarg 2
182 ldc.i8 0
183 ble IL_0014
185 ldarg 1
186 ldarg 0
187 ldarg 2
188 ldc.i8 1
190 ldarg 3
191 ldarga counter
192 conv.u
193 conv.u8
194 tail.
195 callvirt instance void I2::F2(class I1, int64, int64, int64)
198 IL_0014:
199 ldarga counter
200 conv.u
201 conv.u8
202 ldarg current_stack
203 call void C1::check(int64, int64)
207 .method private newslot virtual final instance void I1.GF1<TF>(class I2 i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
209 .override I1::GF1
211 ldarg 2
212 ldc.i8 0
213 ble IL_0014
215 ldarg 1
216 ldarg 0
217 ldarg 2
218 ldc.i8 1
220 ldarg 3
221 ldarga counter
222 conv.u
223 conv.u8
224 tail.
225 callvirt instance void I2::GF2<!!0>(class I1, int64, int64, int64)
228 IL_0014:
229 ldarga counter
230 conv.u
231 conv.u8
232 ldarg current_stack
233 call void C1::check(int64, int64)
236 .method public instance void .ctor()
238 ldarg 0
239 call instance void [mscorlib]System.Object::.ctor()
243 .class public GC1`1<TC>
244 implements class GI1`1<!TC>
246 .method private newslot virtual final instance void 'GI1<TC>.perturb_interface_offset1'()
248 .override method instance void class GI1`1<!TC>::perturb_interface_offset1()
251 .method private newslot virtual final instance void 'GI1<TC>.perturb_interface_offset2'()
253 .override method instance void class GI1`1<!TC>::perturb_interface_offset2()
256 .method public static void check(int64 stack1, int64 stack2)
258 ldarg 0
259 ldarg 1
260 call void C1::check(int64, int64)
263 .method private newslot virtual final instance void 'GI1<TC>.F1'(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
265 .override method instance void class GI1`1<!TC>::F1(class GI2`1<!0>, int64, int64, int64)
267 ldarg 2
268 ldc.i8 0
269 ble IL_0014
271 ldarg 1
272 ldarg 0
273 ldarg 2
274 ldc.i8 1
276 ldarg 3
277 ldarga counter
278 conv.u
279 conv.u8
280 tail.
281 callvirt instance void class GI2`1<!TC>::F2(class GI1`1<!0>, int64, int64, int64)
284 IL_0014:
285 ldarga counter
286 conv.u
287 conv.u8
288 ldarg current_stack
289 call void class GC1`1<!TC>::check(int64, int64)
292 .method private newslot virtual final instance void 'GI1<TC>.GF1'<TF>(class GI2`1<!TC> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
294 .override method instance void class GI1`1<!TC>::GF1<[1]>(class GI2`1<!0>, int64, int64, int64)
296 ldarg 2
297 ldc.i8 0
298 ble IL_0014
299 ldarg 1
300 ldarg 0
301 ldarg 2
302 ldc.i8 1
304 ldarg 3
305 ldarga counter
306 conv.u
307 conv.u8
308 tail.
309 callvirt instance void class GI2`1<!TC>::GF2<!!0>(class GI1`1<!0>, int64, int64, int64)
312 IL_0014:
313 ldarga counter
314 conv.u
315 conv.u8
316 ldarg current_stack
317 call void class GC1`1<!TC>::check(int64, int64)
321 .method private newslot virtual final instance void 'GI1<TC>.HF1'<TF>(class GI2`1<!!TF> i2, int64 counter, int64 initial_stack, int64 current_stack) noinlining
323 .override method instance void class GI1`1<!TC>::HF1<[1]>(class GI2`1<!!TF>, int64, int64, int64)
325 ldarg 2
326 ldc.i8 0
327 ble IL_0014
329 ldarg 1
330 ldarg 0
331 ldarg 2
332 ldc.i8 1
334 ldarg 3
335 ldarga counter
336 conv.u
337 conv.u8
338 tail.
339 callvirt instance void class GI2`1<!!0>::HF2<!0>(class GI1`1<!!0>, int64, int64, int64)
342 IL_0014:
343 ldarga counter
344 conv.u
345 conv.u8
346 ldarg current_stack
347 call void class GC1`1<!TC>::check(int64, int64)
351 .method public instance void .ctor()
353 ldarg 0
354 call instance void [mscorlib]System.Object::.ctor()
358 .class public C2
359 implements I2
361 .method private newslot virtual final instance void I2.perturb_interface_offset1()
363 .override I2::perturb_interface_offset1
366 .method private newslot virtual final instance void I2.perturb_interface_offset2()
368 .override I2::perturb_interface_offset2
371 .method private newslot virtual final instance void I2.perturb_interface_offset3()
373 .override I2::perturb_interface_offset3
377 .method private static void check(int64 stack1, int64 stack2)
379 ldarg 0
380 ldarg 1
381 call void C1::check(int64, int64)
385 .method private newslot virtual final instance void I2.F2(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
387 .override I2::F2
389 ldarg 2
390 ldc.i8 0
391 ble IL_0014
393 ldarg 1
394 ldarg 0
395 ldarg 2
396 ldc.i8 1
398 ldarg 3
399 ldarga counter
400 conv.u
401 conv.u8
402 tail.
403 callvirt instance void I1::F1(class I2, int64, int64, int64)
406 IL_0014:
407 ldarga counter
408 conv.u
409 conv.u8
410 ldarg current_stack
411 call void C2::check(int64, int64)
414 .method private newslot virtual final instance void I2.GF2<TF>(class I1 i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
416 .override I2::GF2
418 ldarg 2
419 ldc.i8 0
420 ble IL_0014
421 ldarg 1
422 ldarg 0
423 ldarg 2
424 ldc.i8 1
426 ldarg 3
427 ldarga counter
428 conv.u
429 conv.u8
430 tail.
431 callvirt instance void I1::GF1<!!0>(class I2, int64, int64, int64)
433 IL_0014:
434 ldarga counter
435 conv.u
436 conv.u8
437 ldarg current_stack
438 call void C2::check(int64, int64)
441 .method public instance void .ctor()
443 ldarg 0
444 call instance void [mscorlib]System.Object::.ctor()
448 .class public GC2`1<TC>
449 implements class GI2`1<!TC>
451 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset1'()
453 .override method instance void class GI2`1<!TC>::perturb_interface_offset1()
456 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset2'()
458 .override method instance void class GI2`1<!TC>::perturb_interface_offset2()
461 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset3'()
463 .override method instance void class GI2`1<!TC>::perturb_interface_offset3()
466 .method private newslot virtual final instance void 'GI2<TC>.perturb_interface_offset4'()
468 .override method instance void class GI2`1<!TC>::perturb_interface_offset4()
471 .method public static void check(int64 stack1, int64 stack2)
473 ldarg 0
474 ldarg 1
475 call void C1::check(int64, int64)
478 .method private newslot virtual final instance void 'GI2<TC>.F2'(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
480 .override method instance void class GI2`1<!TC>::F2(class GI1`1<!0>, int64, int64, int64)
482 ldarg 2
483 ldc.i8 0
484 ble IL_0014
486 ldarg 1
487 ldarg 0
488 ldarg 2
489 ldc.i8 1
491 ldarg 3
492 ldarga counter
493 conv.u
494 conv.u8
495 tail.
496 callvirt instance void class GI1`1<!TC>::F1(class GI2`1<!0>, int64, int64, int64)
499 IL_0014:
500 ldarga counter
501 conv.u
502 conv.u8
503 ldarg current_stack
504 call void class GC2`1<!TC>::check(int64, int64)
507 .method private newslot virtual final instance void 'GI2<TC>.GF2'<TF>(class GI1`1<!TC> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
509 .override method instance void class GI2`1<!TC>::GF2<[1]>(class GI1`1<!0>, int64, int64, int64)
511 ldarg 2
512 ldc.i8 0
513 ble IL_0014
515 ldarg 1
516 ldarg 0
517 ldarg 2
518 ldc.i8 1
520 ldarg 3
521 ldarga counter
522 conv.u
523 conv.u8
524 tail.
525 callvirt instance void class GI1`1<!TC>::GF1<!!0>(class GI2`1<!0>, int64, int64, int64)
528 IL_0014:
529 ldarga counter
530 conv.u
531 conv.u8
532 ldarg current_stack
533 call void class GC2`1<!TC>::check(int64, int64)
536 .method private newslot virtual final instance void 'GI2<TC>.HF2'<TF>(class GI1`1<!!TF> i1, int64 counter, int64 initial_stack, int64 current_stack) noinlining
538 .override method instance void class GI2`1<!TC>::HF2<[1]>(class GI1`1<!!TF>, int64, int64, int64)
540 ldarg 2
541 ldc.i8 0
542 ble IL_0014
543 ldarg 1
544 ldarg 0
545 ldarg 2
546 ldc.i8 1
548 ldarg 3
549 ldarga counter
550 conv.u
551 conv.u8
552 tail.
553 callvirt instance void class GI1`1<!!0>::HF1<!0>(class GI2`1<!!0>, int64, int64, int64)
556 IL_0014:
557 ldarga counter
558 conv.u
559 conv.u8
560 ldarg current_stack
561 call void class GC2`1<!TC>::check(int64, int64)
564 .method public instance void .ctor()
566 ldarg 0
567 call instance void [mscorlib]System.Object::.ctor()
571 .class public A
573 .method public instance void .ctor()
575 ldarg 0
576 call instance void [mscorlib]System.Object::.ctor()
580 .class public B
582 .method public instance void .ctor()
584 ldarg 0
585 call instance void [mscorlib]System.Object::.ctor()
589 .class interface private abstract IC
591 .method public newslot abstract virtual instance !!T cast1<T>(object o, int64 counter, int64 stack) noinlining
594 .method public newslot abstract virtual instance class B cast2(object o, int64 counter, int64 stack) noinlining
597 .method public newslot abstract virtual instance !!T cast3<T>(object o, int64 counter, int64 stack) noinlining
600 .method public newslot abstract virtual instance class B[] cast4(object o, int64 counter, int64 stack) noinlining
603 .method public newslot abstract virtual instance !!T[] cast5<T>(object o, int64 counter, int64 stack) noinlining
607 .class public C
609 .method public static void check(int64 stack1, int64 stack2) noinlining
611 ldarg 0
612 ldarg 1
613 call void C1::check(int64, int64)
617 .method public instance !!T cast1<T>(object o, int64 counter, int64 stack) noinlining
619 ldarg 2
620 ldc.i8 0
621 ble IL_0013
623 ldarg 0
624 ldarg 1
625 ldarg 2
626 ldc.i8 1
628 ldarga counter
629 conv.u
630 conv.u8
631 tail.
632 call instance !!0 C::cast1<!!0>(object, int64, int64)
635 IL_0013:
636 ldarga counter
637 conv.u
638 conv.u8
639 ldarg 3
640 call void C::check(int64, int64)
641 ldarg 1
642 unbox.any !!T
645 .method public instance class B cast2(object o, int64 counter, int64 stack) noinlining
647 ldarg 2
648 ldc.i8 0
649 ble IL_0013
651 ldarg 0
652 ldarg 1
653 ldarg 2
654 ldc.i8 1
656 ldarga counter
657 conv.u
658 conv.u8
659 tail.
660 call instance class B C::cast2(object, int64, int64)
663 IL_0013:
664 ldarga counter
665 conv.u
666 conv.u8
667 ldarg 3
668 call void C::check(int64, int64)
669 ldarg 0
670 ldarg 1
671 ldc.i8 99
672 ldc.i8 0
673 tail.
674 call instance !!0 C::cast1<class B>(object, int64, int64)
677 .method public instance !!T cast3<T>(object o, int64 counter, int64 stack) noinlining
679 ldarg 2
680 ldc.i8 0
681 ble IL_0013
683 ldarg 0
684 ldarg 1
685 ldarg 2
686 ldc.i8 1
688 ldarga counter
689 conv.u
690 conv.u8
691 tail.
692 call instance !!0 C::cast3<!!0>(object, int64, int64)
695 IL_0013:
696 ldarga counter
697 conv.u
698 conv.u8
699 ldarg 3
700 call void C::check(int64, int64)
701 ldarg 0
702 ldarg 1
703 ldc.i8 99
704 ldc.i8 0
705 tail.
706 call instance !!0 C::cast1<!!0>(object, int64, int64)
709 .method public instance class B[] cast4(object o, int64 counter, int64 stack) noinlining
711 ldarg 2
712 ldc.i8 0
713 ble IL_0013
715 ldarg 0
716 ldarg 1
717 ldarg 2
718 ldc.i8 1
720 ldarga counter
721 conv.u
722 conv.u8
723 tail.
724 call instance class B[] C::cast4(object, int64, int64)
727 IL_0013:
728 ldarga counter
729 conv.u
730 conv.u8
731 ldarg 3
732 call void C::check(int64, int64)
733 ldarg 0
734 ldarg 1
735 ldc.i8 99
736 ldc.i8 0
737 tail.
738 call instance !!0 C::cast1<class B[]>(object, int64, int64)
741 .method public instance !!T[] cast5<T>(object o, int64 counter, int64 stack) noinlining
743 ldarg 2
744 ldc.i8 0
745 ble IL_0013
747 ldarg 0
748 ldarg 1
749 ldarg 2
750 ldc.i8 1
752 ldarga counter
753 conv.u
754 conv.u8
755 tail.
756 call instance !!0[] C::cast5<!!0>(object, int64, int64)
759 IL_0013:
760 ldarga counter
761 conv.u
762 conv.u8
763 ldarg 3
764 call void C::check(int64, int64)
765 ldarg 0
766 ldarg 1
767 ldc.i8 99
768 ldc.i8 0
769 tail.
770 call instance !!0 C::cast1<!!0[]>(object, int64, int64)
773 .method public instance void .ctor()
775 ldarg 0
776 call instance void [mscorlib]System.Object::.ctor()
780 .class public D`1<T1>
782 .method public static void check(int64 stack1, int64 stack2) noinlining
784 ldarg 0
785 ldarg 1
786 call void C::check(int64, int64)
789 .method public static !!T cast1<T>(object o, int64 counter, int64 stack) noinlining
791 ldarg 1
792 ldc.i8 0
793 ble IL_0012
795 ldarg 0
796 ldarg 1
797 ldc.i8 1
799 ldarga counter
800 conv.u
801 conv.u8
802 tail.
803 call !!0 class D`1<!T1>::cast1<!!0>(object, int64, int64)
806 IL_0012:
807 ldarga counter
808 conv.u
809 conv.u8
810 ldarg 2
811 call void class D`1<!T1>::check(int64, int64)
812 ldarg 0
813 unbox.any !!T
816 .method public instance class B cast2(object o, int64 counter, int64 stack) noinlining
818 ldarg 2
819 ldc.i8 0
820 ble IL_0013
822 ldarg 0
823 ldarg 1
824 ldarg 2
825 ldc.i8 1
827 ldarga counter
828 conv.u
829 conv.u8
830 tail.
831 call instance class B class D`1<!T1>::cast2(object, int64, int64)
834 IL_0013:
835 ldarga counter
836 conv.u
837 conv.u8
838 ldarg 3
839 call void class D`1<!T1>::check(int64, int64)
840 ldarg 1
841 ldc.i8 99
842 ldc.i8 0
843 tail.
844 call !!0 class D`1<!T1>::cast1<class B>(object, int64, int64)
847 .method public instance !!T cast3<T>(object o, int64 counter, int64 stack) noinlining
849 ldarg 2
850 ldc.i8 0
851 ble IL_0013
853 ldarg 0
854 ldarg 1
855 ldarg 2
856 ldc.i8 1
858 ldarga counter
859 conv.u
860 conv.u8
861 tail.
862 call instance !!0 class D`1<!T1>::cast3<!!0>(object, int64, int64)
865 IL_0013:
866 ldarga counter
867 conv.u
868 conv.u8
869 ldarg 3
870 call void class D`1<!T1>::check(int64, int64)
871 ldarg 1
872 ldc.i8 99
873 ldc.i8 0
874 tail.
875 call !!0 class D`1<!T1>::cast1<!!0>(object, int64, int64)
878 .method public instance class B[] cast4(object o, int64 counter, int64 stack) noinlining
880 ldarg 2
881 ldc.i8 0
882 ble IL_0013
884 ldarg 0
885 ldarg 1
886 ldarg 2
887 ldc.i8 1
889 ldarga counter
890 conv.u
891 conv.u8
892 tail.
893 call instance class B[] class D`1<!T1>::cast4(object, int64, int64)
896 IL_0013:
897 ldarga counter
898 conv.u
899 conv.u8
900 ldarg 3
901 call void class D`1<!T1>::check(int64, int64)
902 ldarg 1
903 ldc.i8 99
904 ldc.i8 0
905 tail.
906 call !!0 class D`1<!T1>::cast1<class B[]>(object, int64, int64)
909 .method public instance !!T[] cast5<T>(object o, int64 counter, int64 stack) noinlining
911 ldarg 2
912 ldc.i8 0
913 ble IL_0013
915 ldarg 0
916 ldarg 1
917 ldarg 2
918 ldc.i8 1
920 ldarga counter
921 conv.u
922 conv.u8
923 tail.
924 call instance !!0[] class D`1<!T1>::cast5<!!0>(object, int64, int64)
927 IL_0013:
928 ldarga counter
929 conv.u
930 conv.u8
931 ldarg 3
932 call void class D`1<!T1>::check(int64, int64)
933 ldarg 1
934 ldc.i8 99
935 ldc.i8 0
936 tail.
937 call !!0 class D`1<!T1>::cast1<!!0[]>(object, int64, int64)
940 .method public instance !T1 cast6(object o, int64 counter, int64 stack) noinlining
942 ldarg 2
943 ldc.i8 0
944 ble IL_0013
946 ldarg 0
947 ldarg 1
948 ldarg 2
949 ldc.i8 1
951 ldarga counter
952 conv.u
953 conv.u8
954 tail.
955 call instance !0 class D`1<!T1>::cast6(object, int64, int64)
958 IL_0013:
959 ldarga counter
960 conv.u
961 conv.u8
962 ldarg 3
963 call void class D`1<!T1>::check(int64, int64)
964 ldarg 1
965 ldc.i8 99
966 ldc.i8 0
967 tail.
968 call !!0 class D`1<!T1>::cast1<!0>(object, int64, int64)
971 .method public instance !T1 cast7<T>(object o, int64 counter, int64 stack) noinlining
973 ldarg 2
974 ldc.i8 0
975 ble IL_0013
977 ldarg 0
978 ldarg 1
979 ldarg 2
980 ldc.i8 1
982 ldarga counter
983 conv.u
984 conv.u8
985 tail.
986 call instance !0 class D`1<!T1>::cast7<!!0>(object, int64, int64)
989 IL_0013:
990 ldarga counter
991 conv.u
992 conv.u8
993 ldarg 3
994 call void class D`1<!T1>::check(int64, int64)
995 ldarg 1
996 ldc.i8 99
997 ldc.i8 0
998 tail.
999 call !!0 class D`1<!T1>::cast1<!0>(object, int64, int64)
1002 .method public instance !T1[] cast8(object o, int64 counter, int64 stack) noinlining
1004 ldarg 2
1005 ldc.i8 0
1006 ble IL_0013
1008 ldarg 0
1009 ldarg 1
1010 ldarg 2
1011 ldc.i8 1
1013 ldarga counter
1014 conv.u
1015 conv.u8
1016 tail.
1017 call instance !0[] class D`1<!T1>::cast8(object, int64, int64)
1020 IL_0013:
1021 ldarga counter
1022 conv.u
1023 conv.u8
1024 ldarg 3
1025 call void class D`1<!T1>::check(int64, int64)
1026 ldarg 0
1027 ldarg 1
1028 ldc.i8 99
1029 ldc.i8 0
1030 tail.
1031 call instance !!0 class D`1<!T1>::cast3<!0[]>(object, int64, int64)
1034 .method public instance !T1[] cast9<T>(object o, int64 counter, int64 stack) noinlining
1036 ldarg 2
1037 ldc.i8 0
1038 ble IL_0013
1040 ldarg 0
1041 ldarg 1
1042 ldarg 2
1043 ldc.i8 1
1045 ldarga counter
1046 conv.u
1047 conv.u8
1048 tail.
1049 call instance !0[] class D`1<!T1>::cast9<!!0>(object, int64, int64)
1052 IL_0013:
1053 ldarga counter
1054 conv.u
1055 conv.u8
1056 ldarg 3
1057 call void class D`1<!T1>::check(int64, int64)
1058 ldarg 0
1059 ldarg 1
1060 ldc.i8 99
1061 ldc.i8 0
1062 tail.
1063 call instance !!0 class D`1<!T1>::cast3<!0[]>(object, int64, int64)
1066 .method public instance void .ctor()
1068 ldarg 0
1069 call instance void [mscorlib]System.Object::.ctor()
1073 .class private C3
1075 .method static void print() noinlining
1080 .method static void print(object o) noinlining
1082 call void C3::print()
1086 .method public static void Main(string[] args) noinlining
1088 .entrypoint
1089 .locals init (
1090         class D`1<class A> V_0,
1091         class D`1<class B> V_1,
1092         class D`1<class B[]> V_2,
1093         class C V_3,
1094         class B V_4,
1095         class B[] V_5,
1096         int64 V_6,
1097         class I1 V_7,
1098         class I2 V_8,
1099         int64 V_9,
1100         class GI1`1<object> V_10,
1101         class GI1`1<object[]> V_11,
1102         class GI1`1<int64> V_12,
1103         class GI1`1<int64[]> V_13,
1104         class GI1`1<valuetype Point> V_14,
1105         class GI1`1<valuetype Point[]> V_15,
1106         class GI2`1<object> V_16,
1107         class GI2`1<object[]> V_17,
1108         class GI2`1<int64> V_18,
1109         class GI2`1<int64[]> V_19,
1110         class GI2`1<valuetype Point> V_20,
1111         class GI2`1<valuetype Point[]> V_21,
1112         int64 depth
1113         )
1115 ldc.i8 9999999
1116 stloc depth
1117 newobj instance void class D`1<class A>::.ctor()
1118 stloc 0
1119 newobj instance void class D`1<class B>::.ctor()
1120 stloc 1
1121 newobj instance void class D`1<class B[]>::.ctor()
1122 stloc 2
1123 newobj instance void C::.ctor()
1124 stloc 3
1125 newobj instance void B::.ctor()
1126 stloc V_4
1127 ldc.i8 1
1128 newarr B
1129 stloc V_5
1131 newobj instance void C1::.ctor()
1132 stloc V_7
1133 newobj instance void C2::.ctor()
1134 stloc V_8
1136 newobj instance void class GC1`1<object>::.ctor()
1137 stloc V_10
1138 newobj instance void class GC1`1<object[]>::.ctor()
1139 stloc V_11
1140 newobj instance void class GC1`1<int64>::.ctor()
1141 stloc V_12
1142 newobj instance void class GC1`1<int64[]>::.ctor()
1143 stloc V_13
1144 newobj instance void class GC1`1<valuetype Point>::.ctor()
1145 stloc V_14
1146 newobj instance void class GC1`1<valuetype Point[]>::.ctor()
1147 stloc V_15
1148 newobj instance void class GC2`1<object>::.ctor()
1149 stloc V_16
1150 newobj instance void class GC2`1<object[]>::.ctor()
1151 stloc V_17
1152 newobj instance void class GC2`1<int64>::.ctor()
1153 stloc V_18
1154 newobj instance void class GC2`1<int64[]>::.ctor()
1155 stloc V_19
1156 newobj instance void class GC2`1<valuetype Point>::.ctor()
1157 stloc V_20
1158 newobj instance void class GC2`1<valuetype Point[]>::.ctor()
1159 stloc V_21
1161 // test-split-prefix do not remove or edit this line
1163 ldloc 0
1164 ldloc V_4
1165 ldloc depth
1166 ldc.i8 0
1167 callvirt instance class B class D`1<class A>::cast2(object, int64, int64)
1168 call void C3::print(object)
1170 ldloc 0
1171 ldloc V_4
1172 ldloc depth
1173 ldc.i8 0
1174 callvirt instance !!0 class D`1<class A>::cast3<class B>(object, int64, int64)
1175 call void C3::print(object)
1177 ldloc 0
1178 ldloc V_5
1179 ldloc depth
1180 ldc.i8 0
1181 conv.i8
1182 callvirt instance !!0 class D`1<class A>::cast3<class B[]>(object, int64, int64)
1183 call void C3::print(object)
1185 ldloc 0
1186 ldloc V_5
1187 ldloc depth
1188 ldc.i8 0
1189 callvirt instance class B[] class D`1<class A>::cast4(object, int64, int64)
1190 call void C3::print(object)
1192 ldloc 0
1193 ldloc V_5
1194 ldloc depth
1195 ldc.i8 0
1196 callvirt instance !!0[] class D`1<class A>::cast5<class B>(object, int64, int64)
1197 call void C3::print(object)
1199 ldloc 1
1200 ldloc V_4
1201 ldloc depth
1202 ldc.i8 0
1203 callvirt instance !0 class D`1<class B>::cast6(object, int64, int64)
1204 call void C3::print(object)
1206 ldloc 1
1207 ldloc V_4
1208 ldloc depth
1209 ldc.i8 0
1210 callvirt instance !0 class D`1<class B>::cast7<class A>(object, int64, int64)
1211 call void C3::print(object)
1213 ldloc 2
1214 ldloc V_5
1215 ldloc depth
1216 ldc.i8 0
1217 callvirt instance !0 class D`1<class B[]>::cast7<class A[]>(object, int64, int64)
1218 call void C3::print(object)
1220 ldloc 1
1221 ldloc V_5
1222 ldloc depth
1223 ldc.i8 0
1224 callvirt instance !0[] class D`1<class B>::cast8(object, int64, int64)
1225 call void C3::print(object)
1227 ldloc 1
1228 ldloc V_5
1229 ldloc depth
1230 ldc.i8 0
1231 callvirt instance !0[] class D`1<class B>::cast9<class A>(object, int64, int64)
1232 call void C3::print(object)
1234 ldloc 3
1235 ldloc V_4
1236 ldloc depth
1237 ldc.i8 0
1238 callvirt instance class B C::cast2(object, int64, int64)
1239 call void C3::print(object)
1241 ldloc 3
1242 ldloc V_4
1243 ldloc depth
1244 ldc.i8 0
1245 callvirt instance !!0 C::cast3<class B>(object, int64, int64)
1246 call void C3::print(object)
1248 ldloc 3
1249 ldloc V_5
1250 ldloc depth
1251 ldc.i8 0
1252 callvirt instance !!0 C::cast3<class B[]>(object, int64, int64)
1253 call void C3::print(object)
1255 ldloc 3
1256 ldloc V_5
1257 ldloc depth
1258 ldc.i8 0
1259 callvirt instance class B[] C::cast4(object, int64, int64)
1260 call void C3::print(object)
1262 ldloc 3
1263 ldloc V_5
1264 ldloc depth
1265 ldc.i8 0
1266 callvirt instance !!0[] C::cast5<class B>(object, int64, int64)
1267 call void C3::print(object)
1269 ldloc V_7
1270 ldloc V_8
1271 ldloc depth
1272 ldloca V_6
1273 conv.u
1274 conv.u8
1275 ldc.i8 0
1276 callvirt instance void I1::F1(class I2, int64, int64, int64)
1278 ldloc V_7
1279 ldloc V_8
1280 ldloc depth
1281 ldloca V_6
1282 conv.u
1283 conv.u8
1284 ldc.i8 0
1285 callvirt instance void I1::GF1<object>(class I2, int64, int64, int64)
1287 ldloc V_7
1288 ldloc V_8
1289 ldloc depth
1290 ldloca V_6
1291 conv.u
1292 conv.u8
1293 ldc.i8 0
1294 callvirt instance void I1::GF1<class A>(class I2, int64, int64, int64)
1296 ldloc V_7
1297 ldloc V_8
1298 ldloc depth
1299 ldloca V_6
1300 conv.u
1301 conv.u8
1302 ldc.i8 0
1303 callvirt instance void I1::GF1<class A[]>(class I2, int64, int64, int64)
1305 ldloc V_7
1306 ldloc V_8
1307 ldloc depth
1308 ldloca V_6
1309 conv.u
1310 conv.u8
1311 ldc.i8 0
1312 callvirt instance void I1::GF1<int64>(class I2, int64, int64, int64)
1314 ldloc V_7
1315 ldloc V_8
1316 ldloc depth
1317 ldloca V_6
1318 conv.u
1319 conv.u8
1320 ldc.i8 0
1321 callvirt instance void I1::GF1<int64[]>(class I2, int64, int64, int64)
1323 // This is the only failure on desktop.
1324 ldloc V_10
1325 ldloc V_16
1326 ldloc depth
1327 ldloca V_6
1328 conv.u
1329 conv.u8
1330 ldc.i8 0
1331 callvirt instance void class GI1`1<object>::F1(class GI2`1<!0>, int64, int64, int64)
1333 ldloc V_10
1334 ldloc V_16
1335 ldloc depth
1336 ldloca V_6
1337 conv.u
1338 conv.u8
1339 ldc.i8 0
1340 callvirt instance void class GI1`1<object>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1342 ldloc V_10
1343 ldloc V_16
1344 ldloc depth
1345 ldloca V_6
1346 conv.u
1347 conv.u8
1348 ldc.i8 0
1349 callvirt instance void class GI1`1<object>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1351 ldloc V_10
1352 ldloc V_16
1353 ldloc depth
1354 ldloca V_6
1355 conv.u
1356 conv.u8
1357 ldc.i8 0
1358 callvirt instance void class GI1`1<object>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1360 ldloc V_10
1361 ldloc V_16
1362 ldloc depth
1363 ldloca V_6
1364 conv.u
1365 conv.u8
1366 ldc.i8 0
1367 callvirt instance void class GI1`1<object>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1369 ldloc V_10
1370 ldloc V_16
1371 ldloc depth
1372 ldloca V_6
1373 conv.u
1374 conv.u8
1375 ldc.i8 0
1376 callvirt instance void class GI1`1<object>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1378 ldloc V_11
1379 ldloc V_17
1380 ldloc depth
1381 ldloca V_6
1382 conv.u
1383 conv.u8
1384 ldc.i8 0
1385 callvirt instance void class GI1`1<object[]>::GF1<object[]>(class GI2`1<!0>, int64, int64, int64)
1387 ldloc V_11
1388 ldloc V_17
1389 ldloc depth
1390 ldloca V_6
1391 conv.u
1392 conv.u8
1393 ldc.i8 0
1394 callvirt instance void class GI1`1<object[]>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1396 ldloc V_11
1397 ldloc V_17
1398 ldloc depth
1399 ldloca V_6
1400 conv.u
1401 conv.u8
1402 ldc.i8 0
1403 callvirt instance void class GI1`1<object[]>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1405 ldloc V_11
1406 ldloc V_17
1407 ldloc depth
1408 ldloca V_6
1409 conv.u
1410 conv.u8
1411 ldc.i8 0
1412 callvirt instance void class GI1`1<object[]>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1414 ldloc V_11
1415 ldloc V_17
1416 ldloc depth
1417 ldloca V_6
1418 conv.u
1419 conv.u8
1420 ldc.i8 0
1421 callvirt instance void class GI1`1<object[]>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1423 ldloc V_12
1424 ldloc V_18
1425 ldloc depth
1426 ldloca V_6
1427 conv.u
1428 conv.u8
1429 ldc.i8 0
1430 callvirt instance void class GI1`1<int64>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1432 ldloc V_12
1433 ldloc V_18
1434 ldloc depth
1435 ldloca V_6
1436 conv.u
1437 conv.u8
1438 ldc.i8 0
1439 callvirt instance void class GI1`1<int64>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1441 ldloc V_12
1442 ldloc V_18
1443 ldloc depth
1444 ldloca V_6
1445 conv.u
1446 conv.u8
1447 ldc.i8 0
1448 callvirt instance void class GI1`1<int64>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1450 ldloc V_12
1451 ldloc V_18
1452 ldloc depth
1453 ldloca V_6
1454 conv.u
1455 conv.u8
1456 ldc.i8 0
1457 callvirt instance void class GI1`1<int64>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1459 ldloc V_12
1460 ldloc V_18
1461 ldloc depth
1462 ldloca V_6
1463 conv.u
1464 conv.u8
1465 ldc.i8 0
1466 callvirt instance void class GI1`1<int64>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1468 ldloc V_13
1469 ldloc V_19
1470 ldloc depth
1471 ldloca V_6
1472 conv.u
1473 conv.u8
1474 ldc.i8 0
1475 callvirt instance void class GI1`1<int64[]>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1477 ldloc V_13
1478 ldloc V_19
1479 ldloc depth
1480 ldloca V_6
1481 conv.u
1482 conv.u8
1483 ldc.i8 0
1484 callvirt instance void class GI1`1<int64[]>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1486 ldloc V_13
1487 ldloc V_19
1488 ldloc depth
1489 ldloca V_6
1490 conv.u
1491 conv.u8
1492 ldc.i8 0
1493 callvirt instance void class GI1`1<int64[]>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1495 ldloc V_13
1496 ldloc V_19
1497 ldloc depth
1498 ldloca V_6
1499 conv.u
1500 conv.u8
1501 ldc.i8 0
1502 callvirt instance void class GI1`1<int64[]>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1504 ldloc V_13
1505 ldloc V_19
1506 ldloc depth
1507 ldloca V_6
1508 conv.u
1509 conv.u8
1510 ldc.i8 0
1511 callvirt instance void class GI1`1<int64[]>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1513 ldloc V_14
1514 ldloc V_20
1515 ldloc depth
1516 ldloca V_6
1517 conv.u
1518 conv.u8
1519 ldc.i8 0
1520 callvirt instance void class GI1`1<valuetype Point>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1522 ldloc V_14
1523 ldloc V_20
1524 ldloc depth
1525 ldloca V_6
1526 conv.u
1527 conv.u8
1528 ldc.i8 0
1529 callvirt instance void class GI1`1<valuetype Point>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1531 ldloc V_14
1532 ldloc V_20
1533 ldloc depth
1534 ldloca V_6
1535 conv.u
1536 conv.u8
1537 ldc.i8 0
1538 callvirt instance void class GI1`1<valuetype Point>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1540 ldloc V_14
1541 ldloc V_20
1542 ldloc depth
1543 ldloca V_6
1544 conv.u
1545 conv.u8
1546 ldc.i8 0
1547 callvirt instance void class GI1`1<valuetype Point>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1549 ldloc V_14
1550 ldloc V_20
1551 ldloc depth
1552 ldloca V_6
1553 conv.u
1554 conv.u8
1555 ldc.i8 0
1556 callvirt instance void class GI1`1<valuetype Point>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1558 ldloc V_15
1559 ldloc V_21
1560 ldloc depth
1561 ldloca V_6
1562 conv.u
1563 conv.u8
1564 ldc.i8 0
1565 callvirt instance void class GI1`1<valuetype Point[]>::GF1<object>(class GI2`1<!0>, int64, int64, int64)
1567 ldloc V_15
1568 ldloc V_21
1569 ldloc depth
1570 ldloca V_6
1571 conv.u
1572 conv.u8
1573 ldc.i8 0
1574 callvirt instance void class GI1`1<valuetype Point[]>::GF1<class A>(class GI2`1<!0>, int64, int64, int64)
1576 ldloc V_15
1577 ldloc V_21
1578 ldloc depth
1579 ldloca V_6
1580 conv.u
1581 conv.u8
1582 ldc.i8 0
1583 callvirt instance void class GI1`1<valuetype Point[]>::GF1<class A[]>(class GI2`1<!0>, int64, int64, int64)
1585 ldloc V_15
1586 ldloc V_21
1587 ldloc depth
1588 ldloca V_6
1589 conv.u
1590 conv.u8
1591 ldc.i8 0
1592 callvirt instance void class GI1`1<valuetype Point[]>::GF1<int64>(class GI2`1<!0>, int64, int64, int64)
1594 ldloc V_15
1595 ldloc V_21
1596 ldloc depth
1597 ldloca V_6
1598 conv.u
1599 conv.u8
1600 ldc.i8 0
1601 callvirt instance void class GI1`1<valuetype Point[]>::GF1<int64[]>(class GI2`1<!0>, int64, int64, int64)
1603 // test-split-suffix do not remove or edit this line
1605 ldsfld int64 C1::errors
1607 stloc V_9
1608 brfalse IL_0591
1610 ldstr "failure {0}"
1611 br IL_0596
1613 IL_0591:
1614 ldstr "success"
1616 IL_0596:
1617 ldloc V_9
1618 box [mscorlib]System.Int64
1619 call void [mscorlib]System.Console::WriteLine(string, object)
1620 ldloc V_9
1621 conv.i4
1622 call void [mscorlib]System.Environment::Exit(int32)