diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-28 13:55:17 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-11-28 13:55:17 +0000 |
commit | e84f80761840000dd84ecd30d97946832e44dd97 (patch) | |
tree | 09906d81a9bf245b99900330eff8043d1fd78534 /vm_backtrace.c | |
parent | 29eae8b1e9a5142b30250d0a9cc738b4ce94eadc (diff) |
merge revision(s) 64799,64800,64801: [Backport #15105]
fix typo.
* vm_exec.h (DEBUG_END_INSN()): use `ec` instead of `th`.
This macro is used when `VMDEBUG > 0`.
escape all env properly.
* vm_backtrace.c (rb_debug_inspector_open): escape all env using
`rb_vm_stack_to_heap()` before making bindings.
[Bug #15105]
There is a complicated story of this issue:
Without this patch, IFUNC frame does not escaped. A IFUNC frame
points to CFUNC ep as previous ep. However, CFUNC ep can be escaped
because of making bindings of Ruby level frames.
IFUNC's ep can points to invalidated ep and `rb_iter_break()` will
fail. This is why `any?` fails.
* test/-ext-/debug/test_debug.rb: add a test.
* remove trailing spaces.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_5@66074 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_backtrace.c')
-rw-r--r-- | vm_backtrace.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/vm_backtrace.c b/vm_backtrace.c index d82d73d963..7d6c675398 100644 --- a/vm_backtrace.c +++ b/vm_backtrace.c @@ -1201,6 +1201,9 @@ rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data) enum ruby_tag_type state; volatile VALUE MAYBE_UNUSED(result); + /* escape all env to heap */ + rb_vm_stack_to_heap(ec); + dbg_context.ec = ec; dbg_context.cfp = dbg_context.ec->cfp; dbg_context.backtrace = ec_backtrace_location_ary(ec, 0, 0); |