From 3cb6952f12335ce0a84d612cdbebbc358c430e81 Mon Sep 17 00:00:00 2001 From: ko1 Date: Fri, 9 Nov 2018 01:02:13 +0000 Subject: fix passing wrong `passed_bmethod_me`. * vm_core.h: remove `rb_execution_context_t::passed_bmethod_me` and fix functions to pass the `me` directly. `passed_bmethod_me` was used to make bmethod (methods defined by `defined_method`). `rb_vm_invoke_bmethod` invoke `Proc` with `me` information as method frame (`lambda` frame, actually). If the proc call is not bmethod call, `passed_bmethod_me` should be NULL. However, there is a bug which passes wrong `me` for normal block call. http://ci.rvm.jp/results/trunk-asserts@silicon-docker/1449470 This is because wrong `me` was remained in `passed_bmethod_me` (and used incorrectly it after collected by GC). We need to clear `passed_bmethod_me` just after bmethod call, but clearing is not enough. To solve this issue, I removed `passed_bmethod_me` and pass `me` information as a function parameter of `rb_vm_invoke_bmethod`, `invoke_block_from_c_proc` and `invoke_iseq_block_from_c` in vm.c. * vm.c (invoke_iseq_block_from_c): the number of parameters is too long so that I try to specify `ALWAYS_INLINE`. * vm.c (invoke_block_from_c_proc): ditto. * vm_insnhelper.c (vm_yield_with_cfunc): now there are no pathes to use bmethod here. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_core.h | 1 - 1 file changed, 1 deletion(-) (limited to 'vm_core.h') diff --git a/vm_core.h b/vm_core.h index af9ec2b8ef..6b094dcbfb 100644 --- a/vm_core.h +++ b/vm_core.h @@ -858,7 +858,6 @@ typedef struct rb_execution_context_struct { /* temporary places */ VALUE errinfo; VALUE passed_block_handler; /* for rb_iterate */ - const rb_callable_method_entry_t *passed_bmethod_me; /* for bmethod */ uint8_t raised_flag; /* only 3 bits needed */ -- cgit v1.2.3