Refactor ISEQ_TYPE_DEFINED_GUARD out
This commit removes ISEQ_TYPE_DEFINED_GUARD because it is no longer needed. And this introduces ISEQ_TYPE_PLAIN which means that the iseq does nothing special but just wrap an expression. Currently, this is used for once execution: `/foo#{ bar }baz/o`. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61601 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ecc29dc209
commit
e1428e5c92
11
compile.c
11
compile.c
@ -29,8 +29,6 @@
|
|||||||
#undef RUBY_UNTYPED_DATA_WARNING
|
#undef RUBY_UNTYPED_DATA_WARNING
|
||||||
#define RUBY_UNTYPED_DATA_WARNING 0
|
#define RUBY_UNTYPED_DATA_WARNING 0
|
||||||
|
|
||||||
#define ISEQ_TYPE_ONCE_GUARD ISEQ_TYPE_DEFINED_GUARD
|
|
||||||
|
|
||||||
#define FIXNUM_INC(n, i) ((n)+(INT2FIX(i)&~FIXNUM_FLAG))
|
#define FIXNUM_INC(n, i) ((n)+(INT2FIX(i)&~FIXNUM_FLAG))
|
||||||
#define FIXNUM_OR(n, i) ((n)|INT2FIX(i))
|
#define FIXNUM_OR(n, i) ((n)|INT2FIX(i))
|
||||||
|
|
||||||
@ -706,9 +704,8 @@ rb_iseq_compile_node(rb_iseq_t *iseq, const NODE *node)
|
|||||||
iseq_set_exception_local_table(iseq);
|
iseq_set_exception_local_table(iseq);
|
||||||
CHECK(COMPILE_POPPED(ret, "ensure", node));
|
CHECK(COMPILE_POPPED(ret, "ensure", node));
|
||||||
break;
|
break;
|
||||||
case ISEQ_TYPE_DEFINED_GUARD:
|
case ISEQ_TYPE_PLAIN:
|
||||||
iseq_set_exception_local_table(iseq);
|
CHECK(COMPILE(ret, "ensure", node));
|
||||||
CHECK(COMPILE(ret, "defined guard", node));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
COMPILE_ERROR(ERROR_ARGS "unknown scope: %d", iseq->body->type);
|
COMPILE_ERROR(ERROR_ARGS "unknown scope: %d", iseq->body->type);
|
||||||
@ -6626,10 +6623,8 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
|
|||||||
}
|
}
|
||||||
case NODE_ONCE:{
|
case NODE_ONCE:{
|
||||||
int ic_index = iseq->body->is_size++;
|
int ic_index = iseq->body->is_size++;
|
||||||
NODE tmp_node;
|
|
||||||
const rb_iseq_t *block_iseq;
|
const rb_iseq_t *block_iseq;
|
||||||
rb_node_init(&tmp_node, NODE_SCOPE, 0, (VALUE)node->nd_body, 0);
|
block_iseq = NEW_CHILD_ISEQ(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_PLAIN, line);
|
||||||
block_iseq = NEW_CHILD_ISEQ(&tmp_node, make_name_for_block(iseq), ISEQ_TYPE_ONCE_GUARD, line);
|
|
||||||
|
|
||||||
ADD_INSN2(ret, line, once, block_iseq, INT2FIX(ic_index));
|
ADD_INSN2(ret, line, once, block_iseq, INT2FIX(ic_index));
|
||||||
|
|
||||||
|
12
iseq.c
12
iseq.c
@ -575,7 +575,7 @@ iseq_type_from_sym(VALUE type)
|
|||||||
const ID id_ensure = rb_intern("ensure");
|
const ID id_ensure = rb_intern("ensure");
|
||||||
const ID id_eval = rb_intern("eval");
|
const ID id_eval = rb_intern("eval");
|
||||||
const ID id_main = rb_intern("main");
|
const ID id_main = rb_intern("main");
|
||||||
const ID id_defined_guard = rb_intern("defined_guard");
|
const ID id_plain = rb_intern("plain");
|
||||||
/* ensure all symbols are static or pinned down before
|
/* ensure all symbols are static or pinned down before
|
||||||
* conversion */
|
* conversion */
|
||||||
const ID typeid = rb_check_id(&type);
|
const ID typeid = rb_check_id(&type);
|
||||||
@ -587,7 +587,7 @@ iseq_type_from_sym(VALUE type)
|
|||||||
if (typeid == id_ensure) return ISEQ_TYPE_ENSURE;
|
if (typeid == id_ensure) return ISEQ_TYPE_ENSURE;
|
||||||
if (typeid == id_eval) return ISEQ_TYPE_EVAL;
|
if (typeid == id_eval) return ISEQ_TYPE_EVAL;
|
||||||
if (typeid == id_main) return ISEQ_TYPE_MAIN;
|
if (typeid == id_main) return ISEQ_TYPE_MAIN;
|
||||||
if (typeid == id_defined_guard) return ISEQ_TYPE_DEFINED_GUARD;
|
if (typeid == id_plain) return ISEQ_TYPE_PLAIN;
|
||||||
return (enum iseq_type)-1;
|
return (enum iseq_type)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1240,7 +1240,7 @@ static VALUE iseq_data_to_ary(const rb_iseq_t *iseq);
|
|||||||
* The type of the instruction sequence.
|
* The type of the instruction sequence.
|
||||||
*
|
*
|
||||||
* Valid values are +:top+, +:method+, +:block+, +:class+, +:rescue+,
|
* Valid values are +:top+, +:method+, +:block+, +:class+, +:rescue+,
|
||||||
* +:ensure+, +:eval+, +:main+, and +:defined_guard+.
|
* +:ensure+, +:eval+, +:main+, and +plain+.
|
||||||
*
|
*
|
||||||
* [locals]
|
* [locals]
|
||||||
* An array containing the names of all arguments and local variables as
|
* An array containing the names of all arguments and local variables as
|
||||||
@ -2145,7 +2145,7 @@ iseq_data_to_ary(const rb_iseq_t *iseq)
|
|||||||
DECL_SYMBOL(ensure);
|
DECL_SYMBOL(ensure);
|
||||||
DECL_SYMBOL(eval);
|
DECL_SYMBOL(eval);
|
||||||
DECL_SYMBOL(main);
|
DECL_SYMBOL(main);
|
||||||
DECL_SYMBOL(defined_guard);
|
DECL_SYMBOL(plain);
|
||||||
|
|
||||||
if (sym_top == 0) {
|
if (sym_top == 0) {
|
||||||
int i;
|
int i;
|
||||||
@ -2160,7 +2160,7 @@ iseq_data_to_ary(const rb_iseq_t *iseq)
|
|||||||
INIT_SYMBOL(ensure);
|
INIT_SYMBOL(ensure);
|
||||||
INIT_SYMBOL(eval);
|
INIT_SYMBOL(eval);
|
||||||
INIT_SYMBOL(main);
|
INIT_SYMBOL(main);
|
||||||
INIT_SYMBOL(defined_guard);
|
INIT_SYMBOL(plain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* type */
|
/* type */
|
||||||
@ -2173,7 +2173,7 @@ iseq_data_to_ary(const rb_iseq_t *iseq)
|
|||||||
case ISEQ_TYPE_ENSURE: type = sym_ensure; break;
|
case ISEQ_TYPE_ENSURE: type = sym_ensure; break;
|
||||||
case ISEQ_TYPE_EVAL: type = sym_eval; break;
|
case ISEQ_TYPE_EVAL: type = sym_eval; break;
|
||||||
case ISEQ_TYPE_MAIN: type = sym_main; break;
|
case ISEQ_TYPE_MAIN: type = sym_main; break;
|
||||||
case ISEQ_TYPE_DEFINED_GUARD: type = sym_defined_guard; break;
|
case ISEQ_TYPE_PLAIN: type = sym_plain; break;
|
||||||
default: rb_bug("unsupported iseq type");
|
default: rb_bug("unsupported iseq type");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -299,7 +299,7 @@ struct rb_iseq_constant_body {
|
|||||||
ISEQ_TYPE_ENSURE,
|
ISEQ_TYPE_ENSURE,
|
||||||
ISEQ_TYPE_EVAL,
|
ISEQ_TYPE_EVAL,
|
||||||
ISEQ_TYPE_MAIN,
|
ISEQ_TYPE_MAIN,
|
||||||
ISEQ_TYPE_DEFINED_GUARD
|
ISEQ_TYPE_PLAIN
|
||||||
} type; /* instruction sequence type */
|
} type; /* instruction sequence type */
|
||||||
|
|
||||||
unsigned int iseq_size;
|
unsigned int iseq_size;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user