зеркало из https://github.com/github/ruby.git
only add the trailing nop if the catch table is not break / next / redo
We don't need nop padding when the catch tables are only for break / next / redo, so lets avoid them. This eliminates nop padding in many lambdas. Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
This commit is contained in:
Родитель
589a8026f0
Коммит
c8b47eb7c9
18
compile.c
18
compile.c
|
@ -1413,11 +1413,19 @@ iseq_insert_nop_between_end_and_cont(rb_iseq_t *iseq)
|
|||
LINK_ELEMENT *end = (LINK_ELEMENT *)(ptr[2] & ~1);
|
||||
LINK_ELEMENT *cont = (LINK_ELEMENT *)(ptr[4] & ~1);
|
||||
LINK_ELEMENT *e;
|
||||
for (e = end; e && (IS_LABEL(e) || IS_TRACE(e)); e = e->next) {
|
||||
if (e == cont) {
|
||||
INSN *nop = new_insn_core(iseq, 0, BIN(nop), 0, 0);
|
||||
ELEM_INSERT_NEXT(end, &nop->link);
|
||||
break;
|
||||
|
||||
enum catch_type ct = (enum catch_type)(ptr[0] & 0xffff);
|
||||
|
||||
if (ct != CATCH_TYPE_BREAK
|
||||
&& ct != CATCH_TYPE_NEXT
|
||||
&& ct != CATCH_TYPE_REDO) {
|
||||
|
||||
for (e = end; e && (IS_LABEL(e) || IS_TRACE(e)); e = e->next) {
|
||||
if (e == cont) {
|
||||
INSN *nop = new_insn_core(iseq, 0, BIN(nop), 0, 0);
|
||||
ELEM_INSERT_NEXT(end, &nop->link);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче