summaryrefslogtreecommitdiff
path: root/vm_core.h
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-09 01:02:13 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-09 01:02:13 +0000
commit3cb6952f12335ce0a84d612cdbebbc358c430e81 (patch)
tree301363c26604d05eb4ced3fdc1bb461831ed6fef /vm_core.h
parente3cfb1f3ca9ab0ef4980e4e3cf983323da9a1846 (diff)
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
Diffstat (limited to 'vm_core.h')
-rw-r--r--vm_core.h1
1 files changed, 0 insertions, 1 deletions
diff --git a/vm_core.h b/vm_core.h
index af9ec2b..6b094dc 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 */