From f12efec2c2698fb1ea775ce3d260a35628303833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Mon, 22 Jun 2020 10:57:01 +0900 Subject: [PATCH] vm_exec_handle_exception: do not goto into a branch I'm not necessarily against every goto in general, but jumping into a branch is definitely a bad idea. Better refactor. --- vm.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/vm.c b/vm.c index a6f8d927d2..6b78f545d8 100644 --- a/vm.c +++ b/vm.c @@ -2083,10 +2083,16 @@ vm_exec_handle_exception(rb_execution_context_t *ec, enum ruby_tag_type state, } } } - else if (state == TAG_BREAK && !escape_cfp) { - type = CATCH_TYPE_BREAK; + else if ((state == TAG_BREAK && !escape_cfp) || + (state == TAG_REDO) || + (state == TAG_NEXT)) { + type = (const enum catch_type[TAG_MASK]) { + [TAG_BREAK] = CATCH_TYPE_BREAK, + [TAG_NEXT] = CATCH_TYPE_NEXT, + [TAG_REDO] = CATCH_TYPE_REDO, + /* otherwise = dontcare */ + }[state]; - search_restart_point: ct = cfp->iseq->body->catch_table; if (ct) for (i = 0; i < ct->size; i++) { entry = UNALIGNED_MEMBER_PTR(ct, entries[i]); @@ -2116,14 +2122,6 @@ vm_exec_handle_exception(rb_execution_context_t *ec, enum ruby_tag_type state, } } } - else if (state == TAG_REDO) { - type = CATCH_TYPE_REDO; - goto search_restart_point; - } - else if (state == TAG_NEXT) { - type = CATCH_TYPE_NEXT; - goto search_restart_point; - } else { ct = cfp->iseq->body->catch_table; if (ct) for (i = 0; i < ct->size; i++) {