quipu mercurial repository
Révision | dd746fac3d09952c1e291c6ef38d1bf3179030bf (tree) |
---|---|
l'heure | 2018-06-20 03:24:34 |
Auteur | Agustina Arzille <avarzille@rise...> |
Commiter | Agustina Arzille |
Implement throwing exceptions in bytecode
@@ -18,14 +18,14 @@ | ||
18 | 18 | "nop\0dup\0pop\0ret\0is\0not\0cons\0list\0car\0cdr\0cadr\0nputcar\0" |
19 | 19 | "nputcdr\0apply\0tapply\0loadt\0loadnil\0load0\0load1\0loadi8\0loada0\0" |
20 | 20 | "loada1\0loadc00\0loadc01\0loadap0\0loadap1\0mkcont\0captenv\0closure\0" |
21 | - "tryend\0argc\0argc.l\0vargc\0vargc.l\0jmp\0jmp.l\0brt\0brt.l\0brn\0" | |
22 | - "brn.l\0brneq\0brneq.l\0tcall\0tcall.l\0call\0call.l\0setc\0setc.l\0" | |
23 | - "seta\0seta.l\0setap\0setap.l\0setg\0setg.l\0loadc\0loadc.l\0loada\0" | |
24 | - "loada.l\0loadap\0loadap.l\0loadg\0loadg.l\0loadv\0loadv.l\0loadx\0" | |
25 | - "loadx.l\0bind\0bind.l\0recur\0recur.l\0trecur\0trecur.l\0mkframe\0" | |
26 | - "mkframe.l\0unwind\0unwind.l\0trybegin\0trybegin.l\0setapop\0setapop.l\0" | |
27 | - "irtjmp\0irtjmp.l\0optargs\0optargs.l\0brbound\0brbound.l\0kwargs\0" | |
28 | - "kwargs.l"; | |
21 | + "tryend\0raise\0raise2\0argc\0argc.l\0vargc\0vargc.l\0jmp\0jmp.l\0" | |
22 | + "brt\0brt.l\0brn\0brn.l\0brneq\0brneq.l\0tcall\0tcall.l\0call\0call.l\0" | |
23 | + "setc\0setc.l\0seta\0seta.l\0setap\0setap.l\0setg\0setg.l\0loadc\0" | |
24 | + "loadc.l\0loada\0loada.l\0loadap\0loadap.l\0loadg\0loadg.l\0loadv\0" | |
25 | + "loadv.l\0loadx\0loadx.l\0bind\0bind.l\0recur\0recur.l\0trecur\0trecur.l\0" | |
26 | + "mkframe\0mkframe.l\0unwind\0unwind.l\0trybegin\0trybegin.l\0setapop\0" | |
27 | + "setapop.l\0irtjmp\0irtjmp.l\0optargs\0optargs.l\0brbound\0brbound.l\0" | |
28 | + "kwargs\0kwargs.l"; | |
29 | 29 | |
30 | 30 | #define F_(n) 1 << (BC_FLG_FBIT + n) |
31 | 31 |
@@ -69,64 +69,66 @@ | ||
69 | 69 | { 161, 0 }, // captenv |
70 | 70 | { 169, 0 }, // closure |
71 | 71 | { 177, 0 }, // tryend |
72 | - { 184, 1 }, // argc | |
73 | - { 189, 1 | BC_LONG_FORM }, // argc.l | |
74 | - { 196, 1 }, // vargc | |
75 | - { 202, 1 | BC_LONG_FORM }, // vargc.l | |
76 | - { 210, 1 | BC_BRANCH_FORM }, // jmp | |
77 | - { 214, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // jmp.l | |
78 | - { 220, 1 | BC_BRANCH_FORM }, // brt | |
79 | - { 224, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // brt.l | |
80 | - { 230, 1 | BC_BRANCH_FORM }, // brn | |
81 | - { 234, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // brn.l | |
82 | - { 240, 1 | BC_BRANCH_FORM }, // brneq | |
83 | - { 246, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // brneq.l | |
84 | - { 254, 1 | BC_CALL_FORM }, // tcall | |
85 | - { 260, 1 | BC_CALL_FORM | BC_LONG_FORM }, // tcall.l | |
86 | - { 268, 1 | BC_CALL_FORM }, // call | |
87 | - { 273, 1 | BC_CALL_FORM | BC_LONG_FORM }, // call.l | |
88 | - { 280, 2 }, // setc | |
89 | - { 285, 2 | BC_LONG_FORM }, // setc.l | |
90 | - { 292, 1 }, // seta | |
91 | - { 297, 1 | BC_LONG_FORM }, // seta.l | |
92 | - { 304, 2 }, // setap | |
93 | - { 310, 2 | BC_LONG_FORM }, // setap.l | |
94 | - { 318, 1 }, // setg | |
95 | - { 323, 1 | BC_LONG_FORM }, // setg.l | |
96 | - { 330, 2 | BC_LOAD_FORM | BC_PURE_FORM }, // loadc | |
97 | - { 336, 2 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loadc.l | |
98 | - { 344, 1 | BC_LOAD_FORM | BC_PURE_FORM }, // loada | |
99 | - { 350, 1 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loada.l | |
100 | - { 358, 2 | BC_LOAD_FORM | BC_PURE_FORM }, // loadap | |
101 | - { 365, 2 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loadap.l | |
102 | - { 374, 1 | BC_LOAD_FORM }, // loadg | |
103 | - { 380, 1 | BC_LOAD_FORM | BC_LONG_FORM }, // loadg.l | |
104 | - { 388, 1 | BC_LOAD_FORM | BC_PURE_FORM }, // loadv | |
105 | - { 394, 1 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loadv.l | |
106 | - { 402, 1 | BC_LOAD_FORM }, // loadx | |
107 | - { 408, 1 | BC_LOAD_FORM | BC_LONG_FORM }, // loadx.l | |
108 | - { 416, 1 }, // bind | |
109 | - { 421, 1 | BC_LONG_FORM }, // bind.l | |
110 | - { 428, 1 | BC_CALL_FORM }, // recur | |
111 | - { 434, 1 | BC_CALL_FORM | BC_LONG_FORM }, // recur.l | |
112 | - { 442, 1 | BC_CALL_FORM }, // trecur | |
113 | - { 449, 1 | BC_CALL_FORM | BC_LONG_FORM }, // trecur.l | |
114 | - { 458, 1 }, // mkframe | |
115 | - { 466, 1 | BC_LONG_FORM }, // mkframe.l | |
116 | - { 476, 1 }, // unwind | |
117 | - { 483, 1 | BC_LONG_FORM }, // unwind.l | |
118 | - { 492, 1 | BC_BRANCH_FORM }, // trybegin | |
119 | - { 501, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // trybegin.l | |
120 | - { 512, 1 }, // setapop | |
121 | - { 520, 1 | BC_LONG_FORM }, // setapop.l | |
122 | - { 530, 1 | BC_BRANCH_FORM }, // irtjmp | |
123 | - { 537, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // irtjmp.l | |
124 | - { 546, 2 }, // optargs | |
125 | - { 554, 2 | BC_LONG_FORM }, // optargs.l | |
126 | - { 564, 1 }, // brbound | |
127 | - { 572, 1 | BC_LONG_FORM }, // brbound.l | |
128 | - { 582, 3 }, // kwargs | |
129 | - { 589, 3 | BC_LONG_FORM }, // kwargs.l | |
72 | + { 184, 0 }, // raise | |
73 | + { 190, 0 }, // raise2 | |
74 | + { 197, 1 }, // argc | |
75 | + { 202, 1 | BC_LONG_FORM }, // argc.l | |
76 | + { 209, 1 }, // vargc | |
77 | + { 215, 1 | BC_LONG_FORM }, // vargc.l | |
78 | + { 223, 1 | BC_BRANCH_FORM }, // jmp | |
79 | + { 227, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // jmp.l | |
80 | + { 233, 1 | BC_BRANCH_FORM }, // brt | |
81 | + { 237, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // brt.l | |
82 | + { 243, 1 | BC_BRANCH_FORM }, // brn | |
83 | + { 247, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // brn.l | |
84 | + { 253, 1 | BC_BRANCH_FORM }, // brneq | |
85 | + { 259, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // brneq.l | |
86 | + { 267, 1 | BC_CALL_FORM }, // tcall | |
87 | + { 273, 1 | BC_CALL_FORM | BC_LONG_FORM }, // tcall.l | |
88 | + { 281, 1 | BC_CALL_FORM }, // call | |
89 | + { 286, 1 | BC_CALL_FORM | BC_LONG_FORM }, // call.l | |
90 | + { 293, 2 }, // setc | |
91 | + { 298, 2 | BC_LONG_FORM }, // setc.l | |
92 | + { 305, 1 }, // seta | |
93 | + { 310, 1 | BC_LONG_FORM }, // seta.l | |
94 | + { 317, 2 }, // setap | |
95 | + { 323, 2 | BC_LONG_FORM }, // setap.l | |
96 | + { 331, 1 }, // setg | |
97 | + { 336, 1 | BC_LONG_FORM }, // setg.l | |
98 | + { 343, 2 | BC_LOAD_FORM | BC_PURE_FORM }, // loadc | |
99 | + { 349, 2 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loadc.l | |
100 | + { 357, 1 | BC_LOAD_FORM | BC_PURE_FORM }, // loada | |
101 | + { 363, 1 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loada.l | |
102 | + { 371, 2 | BC_LOAD_FORM | BC_PURE_FORM }, // loadap | |
103 | + { 378, 2 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loadap.l | |
104 | + { 387, 1 | BC_LOAD_FORM }, // loadg | |
105 | + { 393, 1 | BC_LOAD_FORM | BC_LONG_FORM }, // loadg.l | |
106 | + { 401, 1 | BC_LOAD_FORM | BC_PURE_FORM }, // loadv | |
107 | + { 407, 1 | BC_LOAD_FORM | BC_PURE_FORM | BC_LONG_FORM }, // loadv.l | |
108 | + { 415, 1 | BC_LOAD_FORM }, // loadx | |
109 | + { 421, 1 | BC_LOAD_FORM | BC_LONG_FORM }, // loadx.l | |
110 | + { 429, 1 }, // bind | |
111 | + { 434, 1 | BC_LONG_FORM }, // bind.l | |
112 | + { 441, 1 | BC_CALL_FORM }, // recur | |
113 | + { 447, 1 | BC_CALL_FORM | BC_LONG_FORM }, // recur.l | |
114 | + { 455, 1 | BC_CALL_FORM }, // trecur | |
115 | + { 462, 1 | BC_CALL_FORM | BC_LONG_FORM }, // trecur.l | |
116 | + { 471, 1 }, // mkframe | |
117 | + { 479, 1 | BC_LONG_FORM }, // mkframe.l | |
118 | + { 489, 1 }, // unwind | |
119 | + { 496, 1 | BC_LONG_FORM }, // unwind.l | |
120 | + { 505, 1 | BC_BRANCH_FORM }, // trybegin | |
121 | + { 514, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // trybegin.l | |
122 | + { 525, 1 }, // setapop | |
123 | + { 533, 1 | BC_LONG_FORM }, // setapop.l | |
124 | + { 543, 1 | BC_BRANCH_FORM }, // irtjmp | |
125 | + { 550, 1 | BC_BRANCH_FORM | BC_LONG_FORM }, // irtjmp.l | |
126 | + { 559, 2 }, // optargs | |
127 | + { 567, 2 | BC_LONG_FORM }, // optargs.l | |
128 | + { 577, 1 }, // brbound | |
129 | + { 585, 1 | BC_LONG_FORM }, // brbound.l | |
130 | + { 595, 3 }, // kwargs | |
131 | + { 602, 3 | BC_LONG_FORM }, // kwargs.l | |
130 | 132 | { 0, 0 } |
131 | 133 | }; |
132 | 134 |
@@ -37,6 +37,8 @@ | ||
37 | 37 | OP_CAPTENV, |
38 | 38 | OP_CLOSURE, |
39 | 39 | OP_TRYEND, |
40 | + OP_RAISE, | |
41 | + OP_RAISE2, | |
40 | 42 | // Opcodes with long forms. |
41 | 43 | OP_ARGC, |
42 | 44 | OP_ARGCL, |
@@ -1104,7 +1104,8 @@ | ||
1104 | 1104 | SF_LET, |
1105 | 1105 | SF_RECUR, |
1106 | 1106 | SF_YIELD, |
1107 | - SF_CALLCC | |
1107 | + SF_CALLCC, | |
1108 | + SF_RAISE | |
1108 | 1109 | }; |
1109 | 1110 | |
1110 | 1111 | static const struct |
@@ -1129,7 +1130,8 @@ | ||
1129 | 1130 | { "let", 3, SF_LET }, |
1130 | 1131 | { "recur", 5, SF_RECUR }, |
1131 | 1132 | { "yield", 5, SF_YIELD }, |
1132 | - { "call/cc", 7, SF_CALLCC } | |
1133 | + { "call/cc", 7, SF_CALLCC }, | |
1134 | + { "raise", 5, SF_RAISE } | |
1133 | 1135 | }; |
1134 | 1136 | |
1135 | 1137 | static inline int |
@@ -1421,6 +1423,22 @@ | ||
1421 | 1423 | this->compile_try (env, tail, expr); |
1422 | 1424 | break; |
1423 | 1425 | |
1426 | + case SF_RAISE: | |
1427 | + if (xcdr (expr) == NIL) | |
1428 | + this->code.push_back (OPX_(RAISE)); | |
1429 | + else | |
1430 | + { | |
1431 | + if (!xcons_p (xcdr (expr))) | |
1432 | + specform_error (this->interp, "raise", SPECFORM_DOTTED); | |
1433 | + else if (xcddr (expr) != NIL) | |
1434 | + specform_error (this->interp, "raise", SPECFORM_TOOMANY); | |
1435 | + | |
1436 | + this->compile_in (env, false, xcadr (expr)); | |
1437 | + this->code.push_back (OPX_(RAISE2)); | |
1438 | + } | |
1439 | + | |
1440 | + break; | |
1441 | + | |
1424 | 1442 | default: |
1425 | 1443 | this->compile_app (env, tail, expr); |
1426 | 1444 | } |
@@ -2173,17 +2191,18 @@ | ||
2173 | 2191 | P_(CAR), P_(CDR), P_(CADR), P_(NPUTCAR), P_(NPUTCDR), P_(APPLY), |
2174 | 2192 | P_(TAPPLY), P_(LOADT), P_(LOADNIL), P_(LOAD0), P_(LOAD1), P_(LOADI8), |
2175 | 2193 | P_(LOADA0), P_(LOADA1), P_(LOADC00), P_(LOADC01), P_(LOADAP0), |
2176 | - P_(LOADAP1), P_(MKCONT), P_(CAPTENV), P_(CLOSURE), P_(TRYEND), P_(ARGC), | |
2177 | - P_(ARGCL), P_(VARGC), P_(VARGCL), P_(JMP), P_(JMPL), P_(BRT), P_(BRTL), | |
2178 | - P_(BRN), P_(BRNL), P_(BRNEQ), P_(BRNEQL), P_(TCALL), P_(TCALLL), P_(CALL), | |
2179 | - P_(CALLL), P_(SETC), P_(SETCL), P_(SETA), P_(SETAL), P_(SETAP), | |
2180 | - P_(SETAPL), P_(SETG), P_(SETGL), P_(LOADC), P_(LOADCL), P_(LOADA), | |
2181 | - P_(LOADAL), P_(LOADAP), P_(LOADAPL), P_(LOADG), P_(LOADGL), P_(LOADV), | |
2182 | - P_(LOADVL), P_(LOADX), P_(LOADXL), P_(BIND), P_(BINDL), P_(RECUR), | |
2183 | - P_(RECURL), P_(TRECUR), P_(TRECURL), P_(MKFRAME), P_(MKFRAMEL), | |
2184 | - P_(UNWIND), P_(UNWINDL), P_(TRYBEGIN), P_(TRYBEGINL), P_(SETAPOP), | |
2185 | - P_(SETAPOPL), P_(IRTJMP), P_(IRTJMPL), P_(OPTARGS), P_(OPTARGSL), | |
2186 | - P_(BRBOUND), P_(BRBOUNDL), P_(KWARGS), P_(KWARGSL) | |
2194 | + P_(LOADAP1), P_(MKCONT), P_(CAPTENV), P_(CLOSURE), P_(TRYEND), P_(RAISE), | |
2195 | + P_(RAISE2), P_(ARGC), P_(ARGCL), P_(VARGC), P_(VARGCL), P_(JMP), | |
2196 | + P_(JMPL), P_(BRT), P_(BRTL), P_(BRN), P_(BRNL), P_(BRNEQ), P_(BRNEQL), | |
2197 | + P_(TCALL), P_(TCALLL), P_(CALL), P_(CALLL), P_(SETC), P_(SETCL), | |
2198 | + P_(SETA), P_(SETAL), P_(SETAP), P_(SETAPL), P_(SETG), P_(SETGL), | |
2199 | + P_(LOADC), P_(LOADCL), P_(LOADA), P_(LOADAL), P_(LOADAP), P_(LOADAPL), | |
2200 | + P_(LOADG), P_(LOADGL), P_(LOADV), P_(LOADVL), P_(LOADX), P_(LOADXL), | |
2201 | + P_(BIND), P_(BINDL), P_(RECUR), P_(RECURL), P_(TRECUR), P_(TRECURL), | |
2202 | + P_(MKFRAME), P_(MKFRAMEL), P_(UNWIND), P_(UNWINDL), P_(TRYBEGIN), | |
2203 | + P_(TRYBEGINL), P_(SETAPOP), P_(SETAPOPL), P_(IRTJMP), P_(IRTJMPL), | |
2204 | + P_(OPTARGS), P_(OPTARGSL), P_(BRBOUND), P_(BRBOUNDL), P_(KWARGS), | |
2205 | + P_(KWARGSL) | |
2187 | 2206 | }; |
2188 | 2207 | |
2189 | 2208 | # undef P_ |
@@ -2788,6 +2807,14 @@ | ||
2788 | 2807 | |
2789 | 2808 | NEXT_OP; |
2790 | 2809 | |
2810 | + OP_(RAISE): | |
2811 | + if (interp->lasterr == UNBOUND) | |
2812 | + interp->raise2 ("runtime-error", "no exception to reraise"); | |
2813 | + interp->raise (interp->lasterr); | |
2814 | + | |
2815 | + OP_(RAISE2): | |
2816 | + interp->raise (interp->pop ()); | |
2817 | + | |
2791 | 2818 | #ifndef GOTO_LABELS |
2792 | 2819 | default: |
2793 | 2820 | goto dispatch; |
@@ -28,6 +28,8 @@ | ||
28 | 28 | captenv 0 0 |
29 | 29 | closure 0 0 |
30 | 30 | tryend 0 0 |
31 | +raise 0 0 | |
32 | +raise2 0 0 | |
31 | 33 | argc 1 0 |
32 | 34 | argc.l 1 long |
33 | 35 | vargc 1 0 |