summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2022-04-01 07:22:49 -0700
committerJeremy Evans <code@jeremyevans.net>2022-04-01 07:22:49 -0700
commitd1d48cb690fdad855da94b2a2d11721428bc06ba (patch)
tree156fcb356f2b4206a93f374c281449a7f3fe41c2 /vm.c
parentd8352ff3ac6960f029e3c9253f527f6e4a845645 (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.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/vm.c b/vm.c
index 8bfebcccef..2e014dcadd 100644
--- a/vm.c
+++ b/vm.c
@@ -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);