added save-frame-and-locals
[voodoo-lang.git] / test / save-frame-and-locals.voo
blobd18851a012d87271b33e08d8dcc25b9dc4a78c06
1 # Test for save-frame-and-locals.
3 section data
5 address: word 0
6 frame: word 0
8 format_4:
9 string "%d %d %d %d\n\x00"
11 format_8:
12 string "%d %d %d %d %d %d %d %d\n\x00"
15 section functions
16 import exit printf
17 export main
19 align
20 nonlocal_jump:
21 function
22     let a 71
23     let b 72
24     let c 73
25     let d 74
26     let e 75
27     let f 76
28     let g 77
29     let h 78
30     restore-frame @frame
31     goto @address
32     call exit 2  # not reached
33 end function
36 align
37 passthrough:
38 function next-function
39     let a 41
40     let b 42
41     let c 43
42     let d 44
43     let e 45
44     let f 46
45     let g 47
46     let h 48
47     let i 49
48     call next-function
49     call exit 1  # not reached
50 end function
52 align
53 test:
54 function
55     let a 1
56     let b 2
57     let c 3
58     let d 4
59     let e 5
60     let f 6
61     let g 7
62     let h 8
63     let saved-frame auto-bytes %saved-frame-size
64     save-frame-and-locals saved-frame
66     set @address print_8_values
67     set @frame saved-frame
68     call passthrough test_explicit
70     goto end_test               # not reached
71 print_8_values:
72     restore-locals @frame
73     call printf format_8 a b c d e f g h
75 end_test:
76     return
77 end function
80 align
81 test_explicit:
82 function
83   let a 91
84   let b 92
85   let c 93
86   let d 94
87   let e 95
88   let f 96
89   let g 97
90   let h 98
91   let saved-address @address
92   let saved-frame @frame
94   set @frame auto-bytes %saved-frame-size
95   save-frame-and-locals @frame a c e g saved-address saved-frame
96   set @address print_4_values
97   call passthrough nonlocal_jump
98   call exit 3  # not reached
100 print_4_values:
101   restore-locals @frame a c e g saved-address saved-frame
102   call printf format_4 a c e g
103   set @address saved-address
104   set @frame saved-frame
105   
106   restore-frame @frame
107   goto @address
108 end function
111 align
112 main:
113 function argc argv
114     call test
115     return 0
116 end function