• R/O
  • SSH

quipu: Commit

quipu mercurial repository


Commit MetaInfo

Révisiondd746fac3d09952c1e291c6ef38d1bf3179030bf (tree)
l'heure2018-06-20 03:24:34
AuteurAgustina Arzille <avarzille@rise...>
CommiterAgustina Arzille

Message de Log

Implement throwing exceptions in bytecode

Change Summary

Modification

diff -r 7ded2ec411d9 -r dd746fac3d09 bytecode.cpp
--- a/bytecode.cpp Tue Jun 19 13:39:55 2018 -0300
+++ b/bytecode.cpp Tue Jun 19 15:24:34 2018 -0300
@@ -18,14 +18,14 @@
1818 "nop\0dup\0pop\0ret\0is\0not\0cons\0list\0car\0cdr\0cadr\0nputcar\0"
1919 "nputcdr\0apply\0tapply\0loadt\0loadnil\0load0\0load1\0loadi8\0loada0\0"
2020 "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";
2929
3030 #define F_(n) 1 << (BC_FLG_FBIT + n)
3131
@@ -69,64 +69,66 @@
6969 { 161, 0 }, // captenv
7070 { 169, 0 }, // closure
7171 { 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
130132 { 0, 0 }
131133 };
132134
diff -r 7ded2ec411d9 -r dd746fac3d09 bytecode.h
--- a/bytecode.h Tue Jun 19 13:39:55 2018 -0300
+++ b/bytecode.h Tue Jun 19 15:24:34 2018 -0300
@@ -37,6 +37,8 @@
3737 OP_CAPTENV,
3838 OP_CLOSURE,
3939 OP_TRYEND,
40+ OP_RAISE,
41+ OP_RAISE2,
4042 // Opcodes with long forms.
4143 OP_ARGC,
4244 OP_ARGCL,
diff -r 7ded2ec411d9 -r dd746fac3d09 compiler.cpp
--- a/compiler.cpp Tue Jun 19 13:39:55 2018 -0300
+++ b/compiler.cpp Tue Jun 19 15:24:34 2018 -0300
@@ -1104,7 +1104,8 @@
11041104 SF_LET,
11051105 SF_RECUR,
11061106 SF_YIELD,
1107- SF_CALLCC
1107+ SF_CALLCC,
1108+ SF_RAISE
11081109 };
11091110
11101111 static const struct
@@ -1129,7 +1130,8 @@
11291130 { "let", 3, SF_LET },
11301131 { "recur", 5, SF_RECUR },
11311132 { "yield", 5, SF_YIELD },
1132- { "call/cc", 7, SF_CALLCC }
1133+ { "call/cc", 7, SF_CALLCC },
1134+ { "raise", 5, SF_RAISE }
11331135 };
11341136
11351137 static inline int
@@ -1421,6 +1423,22 @@
14211423 this->compile_try (env, tail, expr);
14221424 break;
14231425
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+
14241442 default:
14251443 this->compile_app (env, tail, expr);
14261444 }
@@ -2173,17 +2191,18 @@
21732191 P_(CAR), P_(CDR), P_(CADR), P_(NPUTCAR), P_(NPUTCDR), P_(APPLY),
21742192 P_(TAPPLY), P_(LOADT), P_(LOADNIL), P_(LOAD0), P_(LOAD1), P_(LOADI8),
21752193 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)
21872206 };
21882207
21892208 # undef P_
@@ -2788,6 +2807,14 @@
27882807
27892808 NEXT_OP;
27902809
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+
27912818 #ifndef GOTO_LABELS
27922819 default:
27932820 goto dispatch;
diff -r 7ded2ec411d9 -r dd746fac3d09 utils/opnames
--- a/utils/opnames Tue Jun 19 13:39:55 2018 -0300
+++ b/utils/opnames Tue Jun 19 15:24:34 2018 -0300
@@ -28,6 +28,8 @@
2828 captenv 0 0
2929 closure 0 0
3030 tryend 0 0
31+raise 0 0
32+raise2 0 0
3133 argc 1 0
3234 argc.l 1 long
3335 vargc 1 0
Afficher sur ancien navigateur de dépôt.