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