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