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:
parent
b0e2c2476e
commit
bc33c5ce0a
1 changed files with 22 additions and 14 deletions
36
compile.c
36
compile.c
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue