Merge pull request #2720 from mono/fix-39325
[mono.git] / mono / tests / verifier / make_cross_nested_access_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_MEMBER_ACCESS=$5
13 TEST_EXTENDS=$6
14 TEST_LOAD_BASE=$7
15
16
17 if [ "$TEST_EXTENDS" == "yes" ]; then
18         TEST_EXTENDS="extends Owner\/Nested"
19         TEST_CONSTRUCTOR="call instance void Owner\/Nested::.ctor()"
20 else
21         TEST_EXTENDS="extends [mscorlib]System.Object"
22         TEST_CONSTRUCTOR="call instance void object::.ctor()"
23 fi
24
25 if [ "$TEST_LOAD_BASE" == "yes" ]; then
26         TEST_LOAD_REF="ldarg.0"
27 else
28         TEST_LOAD_REF="call class Owner\/Nested Owner::Create ()"
29 fi
30
31 TEST_NAME=${TEST_VALIDITY}_${TEST_NAME}
32 TEST_FILE=${TEST_NAME}_generated.il
33 echo $TEST_FILE
34 $SED -e "s/VALIDITY/${TEST_VALIDITY}/g" -e "s/OPCODE/${TEST_OP}/g" -e "s/CONSTRUCTOR/${TEST_CONSTRUCTOR}/g" -e "s/CLASS_ACCESS/${TEST_CLASS_ACCESS}/g" -e "s/MEMBER_ACCESS/${TEST_MEMBER_ACCESS}/g" -e "s/EXTENDS/${TEST_EXTENDS}/g"  -e "s/LOAD_REF/${TEST_LOAD_REF}/g" > $TEST_FILE <<//EOF
35
36 .assembly '${TEST_NAME}_generated'
37 {
38   .hash algorithm 0x00008004
39   .ver  0:0:0:0
40 }
41
42 // VALIDITY CIL which breaks the ECMA-335 rules. 
43 // this CIL should fail verification by a conforming CLI verifier.
44
45 .assembly extern mscorlib
46 {
47   .ver 1:0:5000:0
48   .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
49 }
50
51 .class public Owner extends [mscorlib]System.Object
52 {
53         .method public static Owner/Nested Create ()
54         {
55                 .maxstack 8
56                 newobj instance void class Owner/Nested::.ctor()
57                 ret
58         }
59
60         .method public hidebysig specialname rtspecialname instance default void .ctor () cil managed
61         {
62                 .maxstack 8
63                 ldarg.0 
64                 call instance void object::.ctor()
65                 ret
66         }
67
68         .class nested CLASS_ACCESS Nested extends [mscorlib]System.Object
69         {
70                 .field MEMBER_ACCESS int32 fld
71                 .field MEMBER_ACCESS static int32 sfld
72
73                 .method public hidebysig specialname rtspecialname instance default void .ctor () cil managed
74                 {
75                         .maxstack 8
76                         ldarg.0 
77                         call instance void object::.ctor()
78                         ret
79                 }
80
81                 .method MEMBER_ACCESS int32 Target ()
82                 {
83                         .maxstack 8
84                         ldc.i4.0
85                         ret 
86                 }               
87         }
88
89         .class nested public Test EXTENDS
90         {
91                 .method public hidebysig specialname rtspecialname instance default void .ctor () cil managed
92                 {
93                         .maxstack 8
94                         ldarg.0 
95                         CONSTRUCTOR
96                         ret
97                 }
98
99                 .method public void Method ()
100                 {
101                         .maxstack 8
102                         LOAD_REF
103                         OPCODE // VALIDITY.
104                         pop
105                         ret
106                 }       
107         }
108 }
109
110 .method public static int32 Main() cil managed
111 {
112         .entrypoint
113         .maxstack 8
114         newobj instance void class Owner/Test::.ctor()
115         call instance void class  Owner/Test::Method()
116         ldc.i4.0
117         ret
118 }
119 //EOF