aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2021-01-12 14:47:42 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2021-01-13 14:56:05 -0800
commitc8b47eb7c97ef130b2c576e9d52e55ff4400bb9f (patch)
treedc63255617a65d211a830ccb6dc3b1c1045c4ad8
parent589a8026f029611dafb316fe750b54e54304239a (diff)
downloadruby-c8b47eb7c97ef130b2c576e9d52e55ff4400bb9f.tar.gz
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>
-rw-r--r--compile.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/compile.c b/compile.c
index 5e0fea094e..d1586acf31 100644
--- a/compile.c
+++ b/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;
+ }
}
}
}