1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

compile.c: compile_retry

* compile.c (compile_retry): extract from iseq_compile_each.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59596 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-08-15 00:45:14 +00:00
parent b0e2c2476e
commit bc33c5ce0a

View file

@ -4578,6 +4578,26 @@ compile_redo(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped)
return COMPILE_OK; return COMPILE_OK;
} }
static int
compile_retry(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped)
{
const int line = nd_line(node);
if (iseq->body->type == ISEQ_TYPE_RESCUE) {
ADD_INSN(ret, line, putnil);
ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETRY));
if (popped) {
ADD_INSN(ret, line, pop);
}
}
else {
COMPILE_ERROR(ERROR_ARGS "Invalid retry");
return COMPILE_NG;
}
return COMPILE_OK;
}
static int iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped); static int iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped);
/** /**
compile each node compile each node
@ -4752,21 +4772,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp
case NODE_REDO: case NODE_REDO:
CHECK(compile_redo(iseq, ret, node, popped)); CHECK(compile_redo(iseq, ret, node, popped));
break; break;
case NODE_RETRY:{ case NODE_RETRY:
if (iseq->body->type == ISEQ_TYPE_RESCUE) { CHECK(compile_retry(iseq, ret, node, popped));
ADD_INSN(ret, line, putnil);
ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETRY));
if (popped) {
ADD_INSN(ret, line, pop);
}
}
else {
COMPILE_ERROR(ERROR_ARGS "Invalid retry");
goto ng;
}
break; break;
}
case NODE_BEGIN:{ case NODE_BEGIN:{
CHECK(COMPILE_(ret, "NODE_BEGIN", node->nd_body, popped)); CHECK(COMPILE_(ret, "NODE_BEGIN", node->nd_body, popped));
break; break;