Merge pull request #2869 from BrzVlad/feature-mod-union-opt
[mono.git] / mono / tests / verifier / make_delegate_compat_test.sh
1 #! /bin/sh
2
3 SED="sed"
4 if [ `which gsed 2> /dev/null` ] ; then 
5         SED="gsed"
6 fi
7
8 TEST_NAME=$1
9 TEST_VALIDITY=$2
10 TEST_RET_TYPE1=$3
11 TEST_RET_TYPE2=$4
12 TEST_PARAM_TYPE1=$5
13 TEST_PARAM_TYPE2=$6
14 TEST_CCONV1=$7
15 TEST_CCONV2=$8
16 TEST_USE_NATIVE=$9
17
18 TCONV_1="default"
19 TCONV_2=""
20
21 if [ "$TEST_CCONV1" != "" ]; then
22         TCONV_1=$TEST_CCONV1
23         TCONV_2=$TEST_CCONV2
24 fi
25
26 RET_2_LOCAL="$TEST_RET_TYPE2"
27 RET_2_OP="ldloc 0"
28
29 if [ "$TEST_RET_TYPE2" = "void" ]; then
30         RET_2_LOCAL="int32"
31         RET_2_OP="nop"
32 fi
33
34 LDFTN="ldftn $TCONV_2 ${TEST_RET_TYPE2} Driver::Method(${TEST_PARAM_TYPE2})"
35 CALLVIRT="callvirt instance $TCONV_1 ${TEST_RET_TYPE1} TargetDelegate::Invoke (${TEST_PARAM_TYPE1})"
36 LOCAL_PARAM_1="${TEST_PARAM_TYPE1}"
37
38
39 MANAGED_METHOD="
40         .method public static $TCONV_2 RET_2 Method(PARAM_2 V_0) cil managed
41         {
42                 .maxstack 2
43                 .locals init ($RET_2_LOCAL ARG)
44
45                 $RET_2_OP
46                 ret
47         }
48 "
49
50 if [ "$TEST_USE_NATIVE" = "pinvoke" ]; then
51         LDFTN="ldftn $TCONV_2 ${TEST_RET_TYPE2} Driver::NativeMethod(${TEST_PARAM_TYPE2})"
52         CALLVIRT="nop"
53         MANAGED_METHOD=""
54         LOCAL_PARAM_1="native int"
55 fi
56
57
58
59 TEST_NAME=${TEST_VALIDITY}_${TEST_NAME}
60 TEST_FILE=${TEST_NAME}_generated.il
61 echo $TEST_FILE
62
63
64 $SED -e "s/VALIDITY/${TEST_VALIDITY}/g" -e "s/RET_1/${TEST_RET_TYPE1}/g" -e "s/RET_2/${TEST_RET_TYPE2}/g" -e "s/PARAM_1/${TEST_PARAM_TYPE1}/g" -e "s/PARAM_2/${TEST_PARAM_TYPE2}/g"> $TEST_FILE <<//EOF
65
66 // VALIDITY CIL which breaks the ECMA-335 rules. 
67 // this CIL should fail verification by a conforming CLI verifier.
68
69 .assembly '${TEST_NAME}_generated'
70 {
71   .hash algorithm 0x00008004
72   .ver  0:0:0:0
73 }
74
75 .class ClassA extends [mscorlib]System.Object
76 {
77 }
78
79 .class ClassB extends [mscorlib]System.Object
80 {
81 }
82
83 .class ClassSubA extends ClassA
84 {
85 }
86
87 .class interface abstract InterfaceA
88 {
89 }
90
91 .class interface abstract InterfaceB implements InterfaceA
92 {
93 }
94
95 .class ImplA extends [mscorlib]System.Object implements InterfaceA
96 {
97 }
98
99 .class sealed MyValueType extends [mscorlib]System.ValueType
100 {
101         .field private int32 v
102 }
103
104 .class public auto ansi sealed Int32Enum
105         extends [mscorlib]System.Enum
106 {
107         .field  public specialname  rtspecialname  unsigned int32 value__
108
109         .field public static literal valuetype Int32Enum V_0 = int32(0x00)
110         .field public static literal valuetype Int32Enum V_1 = int32(0x01)
111 }
112
113
114 .class public auto ansi sealed TargetDelegate extends [mscorlib]System.MulticastDelegate
115 {
116         .method public hidebysig  specialname  rtspecialname 
117                 instance default void .ctor (object 'object', native int 'method')  runtime managed 
118         {
119         }
120
121         .method public virtual  hidebysig  newslot
122                 instance $TCONV_1 RET_1 Invoke (PARAM_1 V_0)  runtime managed 
123         {
124         }
125
126         .method public virtual hidebysig  newslot 
127                 instance default class [mscorlib]System.IAsyncResult BeginInvoke (class [mscorlib]System.AsyncCallback callback, object 'object')  runtime managed 
128         {
129         }
130
131         .method public virtual  hidebysig  newslot 
132                 instance default RET_1 EndInvoke (class [mscorlib]System.IAsyncResult result)  runtime managed 
133         {
134         }
135 }
136
137
138 .class public auto ansi Driver
139 {
140         $MANAGED_METHOD
141
142         .method public static pinvokeimpl ("libtest" as "Bla" winapi) $TCONV_2 RET_2 NativeMethod (PARAM_2 V_0)  cil managed 
143     {
144     } 
145
146         .method public static int32 Foo() cil managed
147         {
148                 .entrypoint
149                 .maxstack 2
150                 .locals init ($LOCAL_PARAM_1 ARG)
151
152                 ldnull
153                 
154                 $LDFTN
155                 newobj instance void class TargetDelegate::.ctor(object, native int) // VALIDITY
156                 ldloc.0
157                 $CALLVIRT
158
159                 leave END
160 END:
161                 ldc.i4.0
162                 ret
163         }
164 }
165 //EOF