summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-28 13:55:17 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-28 13:55:17 +0000
commite84f80761840000dd84ecd30d97946832e44dd97 (patch)
tree09906d81a9bf245b99900330eff8043d1fd78534
parent29eae8b1e9a5142b30250d0a9cc738b4ce94eadc (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
-rw-r--r--test/-ext-/debug/test_debug.rb16
-rw-r--r--version.h2
-rw-r--r--vm_backtrace.c3
-rw-r--r--vm_exec.h2
4 files changed, 21 insertions, 2 deletions
diff --git a/test/-ext-/debug/test_debug.rb b/test/-ext-/debug/test_debug.rb
index 3804714d0d..bc41c1bb79 100644
--- a/test/-ext-/debug/test_debug.rb
+++ b/test/-ext-/debug/test_debug.rb
@@ -56,4 +56,20 @@ class TestDebug < Test::Unit::TestCase
binds = inspector_in_eval
binds_check binds, bug7635
end
+
+ class MyRelation
+ include Enumerable
+
+ def each
+ yield :each_entry
+ end
+ end
+
+ def test_lazy_block
+ x = MyRelation.new.any? do
+ Bug::Debug.inspector
+ true
+ end
+ assert_equal true, x, '[Bug #15105]'
+ end
end
diff --git a/version.h b/version.h
index e88b6ab32e..cc5f50a49b 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.5.4"
#define RUBY_RELEASE_DATE "2018-11-28"
-#define RUBY_PATCHLEVEL 113
+#define RUBY_PATCHLEVEL 114
#define RUBY_RELEASE_YEAR 2018
#define RUBY_RELEASE_MONTH 11
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);
diff --git a/vm_exec.h b/vm_exec.h
index 29120975ce..2f4b403e9a 100644
--- a/vm_exec.h
+++ b/vm_exec.h
@@ -36,7 +36,7 @@ typedef rb_iseq_t *ISEQ;
#endif
#define DEBUG_END_INSN() \
- rb_vmdebug_debug_print_post(th, GET_CFP() SC_REGS());
+ rb_vmdebug_debug_print_post(ec, GET_CFP() SC_REGS());
#else