support dealiasing @-prefixed symbols
[antimony.git] / bootstrap / src / voodoo_translator / dealias.voo
blob2ad10f1a82fbd48b921fa4383f19dff1fbd85ab1
1 section functions
2 export sbJ_chop_at
3 export sbJ_dealias
4 export sbJ_dealias1_ex
5 export sbJ_make_dealias_state
6 import sbJ___log
7 import sbJ_eq
8 import sbJ_false
9 import sbJ_ge
10 import sbJ_gt
11 import sbJ_le
12 import sbJ_lt
13 import sbJ_ne
14 import sbJ_true
15 import sbJ_get_namespace
16 import sbJ_get_namespace_absolute
17 import sbJ_make_blob
18 import sbJ_namespace_intern
19 import sbJ_absolute_symbol
20 import sbJ_allocate_words
21 import sbJ_array
22 import sbJ_array_length
23 import sbJ_array_nth
24 import sbJ_array_t
25 import sbJ_blob_length
26 import sbJ_blob_nth
27 import sbJ_block
28 import sbJ_block_length
29 import sbJ_block_nth
30 import sbJ_block_t
31 import sbJ_concatenate_blobs
32 import sbJ_copy_blob_part
33 import sbJ_hash_table_get
34 import sbJ_hash_table_put
35 import sbJ_make_hash_table
36 import sbJ_symbol_eq
37 import sbJ_symbol_hash
38 import sbJ_symbol_name
39 import sbJ_symbol_namespace
40 import sbJ_symbol_t
41 import sbJ_type_of
42 section functions
43 align
44 sbJ_chop_at:
45 function sbJ_sym
46     block
47         # If sym's symbol-name starts in "@", returns a symbol in the same
48         # namespace as sym, but with the leading "@" removed from its name.
49         # Else, returns -1.
50         let sbJ_name call sbJ_symbol_name sbJ_sym
51         let sbJ_namelen call sbJ_blob_length sbJ_name
52         let sbJ__sb_G1 call sbJ_le sbJ_namelen 0
53         ifeq sbJ__sb_G1 @sbJ_true
54             block
55                 return -1
56             end block
57         end if
58         let sbJ__sb_G2 call sbJ_blob_nth sbJ_name 0
59         let sbJ__sb_G3 call sbJ_ne sbJ__sb_G2 64
60         ifeq sbJ__sb_G3 @sbJ_true
61             block
62                 return -1
63             end block
64         end if
65         let sbJ__sb_G4 sub sbJ_namelen 1
66         let sbJ_newname call sbJ_copy_blob_part sbJ_name 1 sbJ__sb_G4
67         let sbJ__sb_G5 call sbJ_symbol_namespace sbJ_sym
68         let sbJ_newsym call sbJ_namespace_intern sbJ__sb_G5 sbJ_newname
69         return sbJ_newsym
70     end block
71 end function
73 align
74 sbJ_dealias:
75 function sbJ_state sbJ_code
76     block
77         block
78             let _sb_G6 0
79             let sbJ_modified auto-words 1
80 _sb_G7:
81             set @sbJ_modified @sbJ_false
82             set sbJ_code call sbJ_dealias1_ex sbJ_state sbJ_code @sbJ_false sbJ_modified
83             set _sb_G6 @sbJ_modified
84             ifeq _sb_G6 @sbJ_false
85                 goto _sb_G8
86             end if
87             goto _sb_G7
88 _sb_G8:
89         end block
90         return sbJ_code
91     end block
92 end function
94 align
95 sbJ_dealias1_ex:
96 function sbJ_state sbJ_code sbJ_nested sbJ_modified
97     block
98         let sbJ_type call sbJ_type_of sbJ_code
99         let sbJ__sb_G9 call sbJ_eq sbJ_type sbJ_symbol_t
100         ifeq sbJ__sb_G9 @sbJ_true
101             block
102                 let sbJ__sb_G10 get-word sbJ_state 1
103                 let sbJ_match call sbJ_hash_table_get sbJ__sb_G10 sbJ_code -1
104                 let sbJ__sb_G11 call sbJ_eq sbJ_match -1
105                 ifeq sbJ__sb_G11 @sbJ_true
106                     block
107                         let sbJ_newsym call sbJ_chop_at sbJ_code
108                         let sbJ__sb_G12 call sbJ_ne sbJ_newsym -1
109                         ifeq sbJ__sb_G12 @sbJ_true
110                             block
111                                 let sbJ_result call sbJ_dealias1_ex sbJ_state sbJ_newsym sbJ_nested sbJ_modified
112                                 let sbJ__sb_G13 call sbJ_symbol_namespace sbJ_result
113                                 let sbJ__sb_G14 call sbJ_make_blob _sb_G53 1
114                                 let sbJ__sb_G15 call sbJ_symbol_name sbJ_result
115                                 let sbJ__sb_G16 call sbJ_concatenate_blobs sbJ__sb_G14 sbJ__sb_G15
116                                 let sbJ__sb_G17 call sbJ_namespace_intern sbJ__sb_G13 sbJ__sb_G16
117                                 return sbJ__sb_G17
118                             end block
119                         else
120                             block
121                                 return sbJ_code
122                             end block
123                         end if
124                         return sbJ_code
125                     end block
126                 else
127                     block
128                         set @sbJ_modified @sbJ_true
129                         return sbJ_match
130                     end block
131                 end if
132             end block
133         else
134             block
135                 let sbJ__sb_G18 call sbJ_eq sbJ_type sbJ_array_t
136                 ifeq sbJ__sb_G18 @sbJ_true
137                     block
138                         let sbJ_len call sbJ_array_length sbJ_code
139                         let sbJ__sb_G19 call sbJ_eq sbJ_nested @sbJ_false
140                         ifeq sbJ__sb_G19 @sbJ_true
141                             block
142                                 let sbJ__sb_G20 call sbJ_gt sbJ_len 1
143                                 ifeq sbJ__sb_G20 @sbJ_true
144                                     block
145                                         let sbJ_firstJ2dword call sbJ_array_nth sbJ_code 0
146                                         let sbJ__sb_G21 call sbJ_make_blob _sb_G54 2
147                                         let sbJ__sb_G22 call sbJ_get_namespace_absolute sbJ__sb_G21
148                                         let sbJ__sb_G23 call sbJ_make_blob _sb_G55 5
149                                         let sbJ__sb_G24 call sbJ_namespace_intern sbJ__sb_G22 sbJ__sb_G23
150                                         let sbJ__sb_G25 call sbJ_eq sbJ_firstJ2dword sbJ__sb_G24
151                                         ifeq sbJ__sb_G25 @sbJ_true
152                                             block
153                                                 let sbJ_sym call sbJ_array_nth sbJ_code 1
154                                                 let sbJ_to_sym call sbJ_array_nth sbJ_code 2
155                                                 let sbJ__sb_G26 call sbJ_ne sbJ_sym sbJ_to_sym
156                                                 ifeq sbJ__sb_G26 @sbJ_true
157                                                     block
158                                                         let sbJ__sb_G27 get-word sbJ_state 1
159                                                         call sbJ_hash_table_put sbJ__sb_G27 sbJ_sym sbJ_to_sym
160                                                     end block
161                                                 end if
162                                                 set @sbJ_modified @sbJ_true
163                                                 let sbJ__sb_G28 call sbJ_array 0 0
164                                                 return sbJ__sb_G28
165                                             end block
166                                         else
167                                             block
168                                                 let sbJ__sb_G29 call sbJ_make_blob _sb_G56 2
169                                                 let sbJ__sb_G30 call sbJ_get_namespace_absolute sbJ__sb_G29
170                                                 let sbJ__sb_G31 call sbJ_make_blob _sb_G57 6
171                                                 let sbJ__sb_G32 call sbJ_namespace_intern sbJ__sb_G30 sbJ__sb_G31
172                                                 let sbJ__sb_G33 call sbJ_eq sbJ_firstJ2dword sbJ__sb_G32
173                                                 ifeq sbJ__sb_G33 @sbJ_true
174                                                     block
175                                                         let sbJ_sym call sbJ_array_nth sbJ_code 1
176                                                         let sbJ__sb_G34 get-word sbJ_state 1
177                                                         let sbJ__sb_G35 call sbJ_make_blob _sb_G58 2
178                                                         let sbJ__sb_G36 call sbJ_get_namespace_absolute sbJ__sb_G35
179                                                         let sbJ__sb_G37 call sbJ_make_blob _sb_G59 4
180                                                         let sbJ__sb_G38 call sbJ_namespace_intern sbJ__sb_G36 sbJ__sb_G37
181                                                         let sbJ__sb_G39 call sbJ_get_namespace sbJ__sb_G38
182                                                         let sbJ__sb_G40 call sbJ_symbol_name sbJ_sym
183                                                         let sbJ__sb_G41 call sbJ_namespace_intern sbJ__sb_G39 sbJ__sb_G40
184                                                         call sbJ_hash_table_put sbJ__sb_G34 sbJ_sym sbJ__sb_G41
185                                                         set @sbJ_modified @sbJ_true
186                                                         let sbJ__sb_G42 call sbJ_array 0 0
187                                                         return sbJ__sb_G42
188                                                     end block
189                                                 end if
190                                             end block
191                                         end if
192                                     end block
193                                 end if
194                             end block
195                         end if
196                         let sbJ_items auto-words sbJ_len
197                         block
198                             let _sb_G60 0
199                             let sbJ_i 0
200 _sb_G61:
201                             let sbJ__sb_G43 call sbJ_lt sbJ_i sbJ_len
202                             set _sb_G60 sbJ__sb_G43
203                             ifeq _sb_G60 @sbJ_false
204                                 goto _sb_G62
205                             end if
206                             let sbJ__sb_G44 call sbJ_array_nth sbJ_code sbJ_i
207                             let sbJ__sb_G45 call sbJ_dealias1_ex sbJ_state sbJ__sb_G44 @sbJ_true sbJ_modified
208                             set-word sbJ_items sbJ_i sbJ__sb_G45
209                             set sbJ_i add sbJ_i 1
210                             goto _sb_G61
211 _sb_G62:
212                         end block
213                         let sbJ__sb_G46 call sbJ_array sbJ_len sbJ_items
214                         return sbJ__sb_G46
215                     end block
216                 else
217                     block
218                         let sbJ__sb_G47 call sbJ_eq sbJ_type sbJ_block_t
219                         ifeq sbJ__sb_G47 @sbJ_true
220                             block
221                                 let sbJ_len call sbJ_block_length sbJ_code
222                                 let sbJ_items auto-words sbJ_len
223                                 block
224                                     let _sb_G63 0
225                                     let sbJ_i 0
226 _sb_G64:
227                                     let sbJ__sb_G48 call sbJ_lt sbJ_i sbJ_len
228                                     set _sb_G63 sbJ__sb_G48
229                                     ifeq _sb_G63 @sbJ_false
230                                         goto _sb_G65
231                                     end if
232                                     let sbJ__sb_G49 call sbJ_block_nth sbJ_code sbJ_i
233                                     let sbJ__sb_G50 call sbJ_dealias1_ex sbJ_state sbJ__sb_G49 @sbJ_true sbJ_modified
234                                     set-word sbJ_items sbJ_i sbJ__sb_G50
235                                     set sbJ_i add sbJ_i 1
236                                     goto _sb_G64
237 _sb_G65:
238                                 end block
239                                 let sbJ__sb_G51 call sbJ_array sbJ_len sbJ_items
240                                 let sbJ__sb_G52 call sbJ_block sbJ__sb_G51
241                                 return sbJ__sb_G52
242                             end block
243                         else
244                             block
245                                 return sbJ_code
246                             end block
247                         end if
248                     end block
249                 end if
250             end block
251         end if
252     end block
253 end function
255 align
256 sbJ_make_dealias_state:
257 function 
258     block
259         let sbJ_state call sbJ_allocate_words 2
260         let sbJ__sb_G66 call sbJ_make_hash_table sbJ_symbol_hash sbJ_symbol_eq
261         set-word sbJ_state 1 sbJ__sb_G66
262         return sbJ_state
263     end block
264 end function
267 section data
268 _sb_G53:
269 string "@"
270 _sb_G54:
271 string "sb"
272 _sb_G55:
273 string "alias"
274 _sb_G56:
275 string "sb"
276 _sb_G57:
277 string "extern"
278 _sb_G58:
279 string "sb"
280 _sb_G59:
281 string "core"