diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2023-03-14 13:39:06 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-14 13:39:06 -0700 |
commit | 9a43c63d436568350333964a859fd14987a029f0 (patch) | |
tree | fda0025df06cf95fb9292c1822f548f26cd28cb2 /insns.def | |
parent | 76f2031884a7857649490f2ef8bcda534bd69c0c (diff) |
YJIT: Implement throw instruction (#7491)
* Break up jit_exec from vm_sendish
* YJIT: Implement throw instruction
* YJIT: Explain what rb_vm_throw does [ci skip]
Notes
Notes:
Merged-By: k0kubun <takashikkbn@gmail.com>
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 24 |
1 files changed, 24 insertions, 0 deletions
@@ -814,6 +814,12 @@ send VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, false); val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method); + jit_func_t func; + if (val == Qundef && (func = jit_compile(ec))) { + val = func(ec, ec->cfp); + if (ec->tag->state) THROW_EXCEPTION(val); + } + if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); @@ -833,6 +839,12 @@ opt_send_without_block VALUE bh = VM_BLOCK_HANDLER_NONE; val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method); + jit_func_t func; + if (val == Qundef && (func = jit_compile(ec))) { + val = func(ec, ec->cfp); + if (ec->tag->state) THROW_EXCEPTION(val); + } + if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); @@ -935,6 +947,12 @@ invokesuper VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, true); val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_super); + jit_func_t func; + if (val == Qundef && (func = jit_compile(ec))) { + val = func(ec, ec->cfp); + if (ec->tag->state) THROW_EXCEPTION(val); + } + if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); @@ -954,6 +972,12 @@ invokeblock VALUE bh = VM_BLOCK_HANDLER_NONE; val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_invokeblock); + jit_func_t func; + if (val == Qundef && (func = jit_compile(ec))) { + val = func(ec, ec->cfp); + if (ec->tag->state) THROW_EXCEPTION(val); + } + if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); |