allocate fewer local variable slots
[voodoo-lang.git] / test / restore-locals.voo
blobe22992d94a9f9736b4d7e475c0f149fbc70f84ce
1 # Test for save-locals and restore-locals.
3 section data
5 address: word 0
6 frame: word 0
8 format_5:
9 string "%d %d %d %d %d\n\x00"
11 format_20:
12 string "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n\x00"
15 section functions
16 import exit printf
17 export main
19 align
20 test:
21 function
22     let a 1
23     let b 2
24     let c 3
25     let d 4
26     let e 5
27     let f 6
28     let g 7
29     let h 8
30     let i 9
31     let j 10
32     let k 11
33     let l 12
34     let m 13
35     let n 14
36     let o 15
37     let p 16
38     let q 17
39     let r 18
40     let s 19
41     let t 20
42     let saved-frame auto-bytes %saved-frame-size
43     save-frame saved-frame
45     set a 22
46     set c 23
47     set e 24
48     set g 25
49     set i 26
50     set k 27
51     set m 28
52     set o 29
53     set q 30
54     set s 31
55     save-locals saved-frame
57     set @address print_values
58     set @frame saved-frame
59     call passthrough saved-frame
61     goto end_test               # not reached
62 print_values:
63     restore-locals @frame
64     call printf format_20 a b c d e f g h i j \
65         k l m n o p q r s t
67     set a 91
68     set i 92
69     set q 93
70     save-locals saved-frame a c e g i k m o q s saved-frame
71     set @address print_values1
72     set @frame saved-frame
73     call passthrough saved-frame
75     goto end_test               # not reached
76 print_values1:
77     restore-locals @frame a e i m q saved-frame
78     call printf format_5 a e i m q
80 end_test:
81     return
82 end function
85 align
86 nonlocal_jump:
87 function frame
88     let a 71
89     let b 72
90     let c 73
91     let d 74
92     let e 75
93     let f 76
94     let g 77
95     let h 78
96     let i 79
97     let j 80
98     let k 81
99     let l 82
100     let m 83
101     let n 84
102     let o 85
103     let p 86
104     let q 87
105     let r 88
106     let s 89
107     let t 90
108     restore-frame frame
109     goto @address
110     call exit 2
111 end function
113 align
114 passthrough:
115 function frame
116     let a 41
117     let b 42
118     let c 43
119     let d 44
120     let e 45
121     let f 46
122     let g 47
123     let h 48
124     let i 49
125     call nonlocal_jump frame
126     call exit 1
127 end function
130 align
131 main:
132 function argc argv
133     call test
134     return 0
135 end function