|
@@ -2489,7 +2489,7 @@ node_t *_parse_stmt(list_t *tokens, size_t *pos, int allow_comma) {
|
|
|
else if (MATCH(RETURN)) {
|
|
|
node_t *a = NULL;
|
|
|
|
|
|
- if (!AT(RCB) && !AT(EOF) && !CLIFF)
|
|
|
+ if (!AT(RCB) && !CLIFF)
|
|
|
a = parse_expr(tokens, pos);
|
|
|
|
|
|
return NODE1(RETURN, a);
|
|
@@ -2527,7 +2527,7 @@ node_t *_parse_stmt(list_t *tokens, size_t *pos, int allow_comma) {
|
|
|
} else if (MATCH(THROW)) {
|
|
|
node_t *a = NULL;
|
|
|
|
|
|
- if (!CLIFF && !AT(COMMA) && !AT(RPAR) && !AT(RCB))
|
|
|
+ if (!CLIFF && !AT(COMMA) && !AT(RPAR) && !AT(RCB) && !AT(EOF))
|
|
|
a = parse_expr(tokens, pos);
|
|
|
|
|
|
return NODE1(THROW, a);
|
|
@@ -5725,13 +5725,23 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
|
|
|
break;
|
|
|
|
|
|
case N_THROW:
|
|
|
- EMIT("qi_throw(state, ");
|
|
|
- if (node->a)
|
|
|
+ if (!node->a) {
|
|
|
+ EMIT("qi_throw(state, state->nil);");
|
|
|
+ } else if (DEBUG) {
|
|
|
+ char *varname = tempvar();
|
|
|
+
|
|
|
+ EMIT("qi_value_t *%s = ", varname);
|
|
|
compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->a);
|
|
|
- else {
|
|
|
- EMIT("state->nil");
|
|
|
+ EMIT(";\n");
|
|
|
+
|
|
|
+ emit_debug(buf, node);
|
|
|
+
|
|
|
+ EMIT("qi_throw(state, %s);", varname);
|
|
|
+ } else {
|
|
|
+ EMIT("qi_throw(state, ");
|
|
|
+ compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->a);
|
|
|
+ EMIT(");");
|
|
|
}
|
|
|
- EMIT(");");
|
|
|
break;
|
|
|
|
|
|
case N_LABEL: {
|