diff options
author | Jeremy Evans <code@jeremyevans.net> | 2022-04-01 07:22:49 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2022-04-01 07:22:49 -0700 |
commit | d1d48cb690fdad855da94b2a2d11721428bc06ba (patch) | |
tree | 156fcb356f2b4206a93f374c281449a7f3fe41c2 /vm.c | |
parent | d8352ff3ac6960f029e3c9253f527f6e4a845645 (diff) |
Revert "Raise RuntimeError if Kernel#binding is called from a non-Ruby frame"
This reverts commit 343ea9967e4a6b279eed6bd8e81ad0bdc747f254.
This causes an assertion failure with -DRUBY_DEBUG=1 -DRGENGC_CHECK_MODE=2
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -1233,12 +1233,15 @@ rb_vm_make_binding(const rb_execution_context_t *ec, const rb_control_frame_t *s if (cfp == 0 || ruby_level_cfp == 0) { rb_raise(rb_eRuntimeError, "Can't create Binding Object on top of Fiber."); } - if (!VM_FRAME_RUBYFRAME_P(src_cfp) && - !VM_FRAME_RUBYFRAME_P(RUBY_VM_PREVIOUS_CONTROL_FRAME(src_cfp))) { - rb_raise(rb_eRuntimeError, "Cannot create Binding object for non-Ruby caller"); + + while (1) { + envval = vm_make_env_object(ec, cfp); + if (cfp == ruby_level_cfp) { + break; + } + cfp = rb_vm_get_binding_creatable_next_cfp(ec, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)); } - envval = vm_make_env_object(ec, cfp); bindval = rb_binding_alloc(rb_cBinding); GetBindingPtr(bindval, bind); vm_bind_update_env(bindval, bind, envval); |