Add a test.
[mono.git] / mono / tests / verifier / make_double_nesting_test.sh
1 #! /bin/sh
2
3 TEST_NAME=$1
4 TEST_VALIDITY=$2
5 TEST_OP=$3
6 TEST_CLASS_ACCESS=$4
7 TEST_NESTED_ACCESS=$5
8 TEST_MEMBER_ACCESS=$6
9 TEST_BASE_EXTENDS=$7
10 TEST_NESTED_EXTENDS=$8
11 TEST_LOAD_BASE=$9
12
13
14 if [ "$TEST_BASE_EXTENDS" == "yes" ]; then
15         TEST_BASE_EXTENDS="extends Root"
16         TEST_BASE_CONSTRUCTOR="call instance void Root::.ctor()"
17 else
18         TEST_BASE_EXTENDS="extends [mscorlib]System.Object"
19         TEST_BASE_CONSTRUCTOR="call instance void object::.ctor()"
20 fi
21
22 if [ "$TEST_NESTED_EXTENDS" == "yes" ]; then
23         TEST_NESTED_EXTENDS="extends Root\/Nested"
24         TEST_NESTED_CONSTRUCTOR="call instance void Root\/Nested::.ctor()"
25 else
26         TEST_NESTED_EXTENDS="extends [mscorlib]System.Object"
27         TEST_NESTED_CONSTRUCTOR="call instance void object::.ctor()"
28 fi
29
30 if [ "$TEST_LOAD_BASE" == "yes" ]; then
31         TEST_LOAD_REF="ldarg.0"
32 else
33         TEST_LOAD_REF="call class Root\/Nested Root::Create ()"
34 fi
35
36 TEST_NAME=${TEST_VALIDITY}_${TEST_NAME}
37 TEST_FILE=${TEST_NAME}_generated.il
38 echo $TEST_FILE
39
40 sed -e "s/CLASS_ACCESS/${TEST_CLASS_ACCESS}/g" -e "s/NESTED_ACCESS/${TEST_NESTED_ACCESS}/g" -e "s/MEMBER_ACCESS/${TEST_MEMBER_ACCESS}/g" -e "s/ROOT_EXTENDS/${TEST_BASE_EXTENDS}/g" -e "s/ROOT_CONSTRUCTOR/${TEST_BASE_CONSTRUCTOR}/g" -e "s/NESTED_EXTENDS/${TEST_NESTED_EXTENDS}/g" -e "s/NESTED_CONSTRUCTOR/${TEST_NESTED_CONSTRUCTOR}/g" -e "s/LOAD_REF/${TEST_LOAD_REF}/g" -e "s/OPCODE/${TEST_OP}/g" -e "s/VALIDITY/${TEST_VALIDITY}/g" > $TEST_FILE <<//EOF
41
42 .assembly '${TEST_NAME}_generated'
43 {
44   .hash algorithm 0x00008004
45   .ver  0:0:0:0
46 }
47
48 // VALIDITY CIL which breaks the ECMA-335 rules. 
49 // this CIL should fail verification by a conforming CLI verifier.
50
51 .assembly extern mscorlib
52 {
53   .ver 1:0:5000:0
54   .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
55 }
56
57 .class CLASS_ACCESS Root extends [mscorlib]System.Object
58 {
59         .method public static class Root/Nested Create ()
60         {
61                 .maxstack 8
62                 newobj instance void class Root/Nested::.ctor()
63                 ret
64         }
65
66         .method public hidebysig specialname rtspecialname instance default void .ctor () cil managed
67         {
68                 .maxstack 8
69                 ldarg.0 
70                 call instance void object::.ctor()
71                 ret
72         }
73
74         .class nested NESTED_ACCESS Nested extends [mscorlib]System.Object
75         {
76                 .field MEMBER_ACCESS int32 fld
77                 .field MEMBER_ACCESS static int32 sfld
78
79                 .method public hidebysig specialname rtspecialname instance default void .ctor () cil managed
80                 {
81                         .maxstack 8
82                         ldarg.0 
83                         call instance void object::.ctor()
84                         ret
85                 }
86
87                 .method MEMBER_ACCESS virtual hidebysig newslot instance int32 Target ()
88                 {
89                         .maxstack 8
90                         ldc.i4.0
91                         ret 
92                 }               
93         }
94 }
95
96
97 .class public Extension ROOT_EXTENDS
98 {
99         .method public static void Execute ()
100         {
101                 .maxstack 8
102                 newobj instance void class Extension/MyNested::.ctor()
103                 call instance void class Extension/MyNested::Method()
104                 ret
105         }
106
107         .method public hidebysig specialname rtspecialname instance default void .ctor () cil managed
108         {
109                 .maxstack 8
110                 ldarg.0 
111                 ROOT_CONSTRUCTOR
112                 ret
113         }
114
115         .class nested MEMBER_ACCESS MyNested NESTED_EXTENDS
116         {
117                 .method MEMBER_ACCESS virtual hidebysig instance int32 Target ()
118                 {
119                         .maxstack 8
120                         ldc.i4.0
121                         ret 
122                 }
123
124                 .method public hidebysig specialname rtspecialname instance default void .ctor () cil managed
125                 {
126                         .maxstack 8
127                         ldarg.0 
128                         NESTED_CONSTRUCTOR
129                         ret
130                 }
131
132                 .method public void Method ()
133                 {
134                         .maxstack 8
135                         LOAD_REF
136                         OPCODE // VALIDITY.
137                         pop
138                         ret
139                 }
140         }
141 }
142
143 .method public static int32 Main() cil managed
144 {
145         .entrypoint
146         .maxstack 8
147         call void class Extension::Execute ()
148         ldc.i4.0
149         ret
150 }
151
152 //EOF