1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* proc.c (rb_binding_new_with_cfp): create binding object even if

the frame is IFUNC. But return a ruby-level binding to keep
  compatibility.
  This patch fix degradation introduced from r39067.
  [Bug #7774] [ruby-dev:46960]
* test/ruby/test_settracefunc.rb: add a test.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39275 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2013-02-16 06:51:17 +00:00
parent 3d490d209a
commit 7cbeff908f
3 changed files with 57 additions and 2 deletions

View file

@ -1,3 +1,13 @@
Sat Feb 16 15:45:56 2013 Koichi Sasada <ko1@atdot.net>
* proc.c (rb_binding_new_with_cfp): create binding object even if
the frame is IFUNC. But return a ruby-level binding to keep
compatibility.
This patch fix degradation introduced from r39067.
[Bug #7774] [ruby-dev:46960]
* test/ruby/test_settracefunc.rb: add a test.
Sat Feb 16 13:40:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (shvar_to_cpp): do not substitute exec_prefix itself

12
proc.c
View file

@ -315,16 +315,24 @@ rb_binding_new_with_cfp(rb_thread_t *th, const rb_control_frame_t *src_cfp)
{
rb_control_frame_t *cfp = rb_vm_get_binding_creatable_next_cfp(th, src_cfp);
rb_control_frame_t *ruby_level_cfp = rb_vm_get_ruby_level_next_cfp(th, src_cfp);
VALUE bindval;
VALUE bindval, envval;
rb_binding_t *bind;
if (cfp == 0 || ruby_level_cfp == 0) {
rb_raise(rb_eRuntimeError, "Can't create Binding Object on top of Fiber.");
}
while (1) {
envval = rb_vm_make_env_object(th, cfp);
if (cfp == ruby_level_cfp) {
break;
}
cfp = rb_vm_get_binding_creatable_next_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp));
}
bindval = binding_alloc(rb_cBinding);
GetBindingPtr(bindval, bind);
bind->env = rb_vm_make_env_object(th, cfp);
bind->env = envval;
bind->path = ruby_level_cfp->iseq->location.path;
bind->first_lineno = rb_vm_get_sourceline(ruby_level_cfp);

View file

@ -942,6 +942,16 @@ class TestSetTraceFunc < Test::Unit::TestCase
assert_security_error_safe4(func)
end
def m1_for_test_trace_point_binding_in_ifunc(arg)
arg + nil
rescue
end
def m2_for_test_trace_point_binding_in_ifunc(arg)
arg.inject(:+)
rescue
end
def test_trace_point_binding_in_ifunc
bug7774 = '[ruby-dev:46908]'
src = %q{
@ -969,5 +979,32 @@ class TestSetTraceFunc < Test::Unit::TestCase
rescue RuntimeError
end
}, bug7774
# TracePoint
tp_b = nil
TracePoint.new(:raise) do |tp|
tp_b = tp.binding
end.enable do
m1_for_test_trace_point_binding_in_ifunc(0)
assert_equal(self, eval('self', tp_b), '[ruby-dev:46960]')
m2_for_test_trace_point_binding_in_ifunc([0, nil])
assert_equal(self, eval('self', tp_b), '[ruby-dev:46960]')
end
# set_trace_func
stf_b = nil
set_trace_func ->(event, file, line, id, binding, klass) do
stf_b = binding if event == 'raise'
end
begin
m1_for_test_trace_point_binding_in_ifunc(0)
assert_equal(self, eval('self', stf_b), '[ruby-dev:46960]')
m2_for_test_trace_point_binding_in_ifunc([0, nil])
assert_equal(self, eval('self', stf_b), '[ruby-dev:46960]')
ensure
set_trace_func(nil)
end
end
end