Revision | 134 (tree) |
---|---|
Time | 2018-09-19 07:09:24 |
Author | jakobthomsen |
implement simple conditional call
@@ -34,6 +34,14 @@ | ||
34 | 34 | { |
35 | 35 | switch(fn$$$) |
36 | 36 | { |
37 | + case /*false*/0x21727BA00LLU: | |
38 | + ACCESS_RETURN = 0; | |
39 | + RET; | |
40 | + | |
41 | + case /*true*/0xBEDC200LLU: | |
42 | + ACCESS_RETURN = 1; | |
43 | + RET; | |
44 | + | |
37 | 45 | case /*exit*/0x83392F0LLU: |
38 | 46 | exit(ACCESS_ARG(0)); |
39 | 47 | RET; |
@@ -240,6 +248,11 @@ | ||
240 | 248 | { CALLBEGIN(0/*void*/); RETURNTO(0x2B72DBA08695LLU); CALLEND(0xADCB6E81E7279DB0LLU); }; |
241 | 249 | |
242 | 250 | } |
251 | + else if(c$$$ == '?') | |
252 | + { | |
253 | + { CALLBEGIN(0/*void*/); RETURNTO(0x2B72DBA08695LLU); CALLEND(0x2B72DBA09210LLU); }; | |
254 | + | |
255 | + } | |
243 | 256 | else if(isalpha(c$$$)) |
244 | 257 | { |
245 | 258 | ungetc(c$$$, stdin); |
@@ -287,6 +300,21 @@ | ||
287 | 300 | |
288 | 301 | RET; |
289 | 302 | |
303 | + case /*parseif*/0x2B72DBA09210LLU: | |
304 | + ACCESS_RETURN = ++ACCESS_CURADDR; // HACK store addr in return | |
305 | + fprintf(stdout, "// predicate\n"); | |
306 | + CALLBEGIN(0/*void*/); RETURNTO(0x2B72DBA09211LLU); CALLEND(0x2B72DBA079C9E70LLU); | |
307 | +case 0x2B72DBA09211LLU: | |
308 | + | |
309 | + fprintf(stdout, "if(!ACCESS_CURRENT)\n"); | |
310 | + fprintf(stdout, " JUMP(0x%0llXLLU); // skip consequent\n", (long long unsigned int)ACCESS_RETURN); | |
311 | + fprintf(stdout, "// consequent\n"); | |
312 | + CALLBEGIN(0/*void*/); RETURNTO(0x2B72DBA09212LLU); CALLEND(0x2B72DBA079C9E70LLU); | |
313 | +case 0x2B72DBA09212LLU: | |
314 | + | |
315 | + fprintf(stdout, "case 0x%0llXLLU%c // skip to here\n", (long long unsigned int)ACCESS_RETURN, 58); | |
316 | + RET; | |
317 | + | |
290 | 318 | case /*parsecall*/0x2B72DBA079C9E70LLU: |
291 | 319 | fputs("CALLBEGIN(0/*void*/); ", stdout); // NOTE do NOT enclose in block because a case-label can appear inbetween if nested call |
292 | 320 | CALLBEGIN(0/*void*/); RETURNTO(0x2B72DBA079C9E71LLU); CALLEND(0x2B72DBA091F0LLU); |
@@ -1,3 +1,9 @@ | ||
1 | + false | |
2 | + :ACCESS_RETURN = 0;: | |
3 | + @ | |
4 | + true | |
5 | + :ACCESS_RETURN = 1;: | |
6 | + @ | |
1 | 7 | exit |
2 | 8 | :exit(ACCESS_ARG(0));: |
3 | 9 | @ |
@@ -170,6 +176,10 @@ | ||
170 | 176 | {: |
171 | 177 | ^parsecall$(): |
172 | 178 | } |
179 | + else if(c$$$ == '?') | |
180 | + {: | |
181 | + ^parseif(): | |
182 | + } | |
173 | 183 | else if(isalpha(c$$$)) |
174 | 184 | { |
175 | 185 | ungetc(c$$$, stdin);: |
@@ -203,6 +213,16 @@ | ||
203 | 213 | parsefns'' |
204 | 214 | `parsefns |
205 | 215 | @ |
216 | + parseif | |
217 | + :ACCESS_RETURN = ++ACCESS_CURADDR; // HACK store addr in return: | |
218 | + :fprintf(stdout, "// predicate\n");: | |
219 | + parsecall() | |
220 | + :fprintf(stdout, "if(!ACCESS_CURRENT)\n");: | |
221 | + :fprintf(stdout, " JUMP(0x%0llXLLU); // skip consequent\n", (long long unsigned int)ACCESS_RETURN);: | |
222 | + :fprintf(stdout, "// consequent\n");: | |
223 | + parsecall() | |
224 | + :fprintf(stdout, "case 0x%0llXLLU%c // skip to here\n", (long long unsigned int)ACCESS_RETURN, 58);: | |
225 | + @ | |
206 | 226 | parsecall: |
207 | 227 | fputs("CALLBEGIN(0/*void*/); ", stdout); // NOTE do NOT enclose in block because a case-label can appear inbetween if nested call: |
208 | 228 | parseid() |