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:
parent
3d490d209a
commit
7cbeff908f
3 changed files with 57 additions and 2 deletions
10
ChangeLog
10
ChangeLog
|
@ -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>
|
Sat Feb 16 13:40:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* configure.in (shvar_to_cpp): do not substitute exec_prefix itself
|
* configure.in (shvar_to_cpp): do not substitute exec_prefix itself
|
||||||
|
|
12
proc.c
12
proc.c
|
@ -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 *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);
|
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;
|
rb_binding_t *bind;
|
||||||
|
|
||||||
if (cfp == 0 || ruby_level_cfp == 0) {
|
if (cfp == 0 || ruby_level_cfp == 0) {
|
||||||
rb_raise(rb_eRuntimeError, "Can't create Binding Object on top of Fiber.");
|
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);
|
bindval = binding_alloc(rb_cBinding);
|
||||||
GetBindingPtr(bindval, bind);
|
GetBindingPtr(bindval, bind);
|
||||||
bind->env = rb_vm_make_env_object(th, cfp);
|
bind->env = envval;
|
||||||
bind->path = ruby_level_cfp->iseq->location.path;
|
bind->path = ruby_level_cfp->iseq->location.path;
|
||||||
bind->first_lineno = rb_vm_get_sourceline(ruby_level_cfp);
|
bind->first_lineno = rb_vm_get_sourceline(ruby_level_cfp);
|
||||||
|
|
||||||
|
|
|
@ -942,6 +942,16 @@ class TestSetTraceFunc < Test::Unit::TestCase
|
||||||
assert_security_error_safe4(func)
|
assert_security_error_safe4(func)
|
||||||
end
|
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
|
def test_trace_point_binding_in_ifunc
|
||||||
bug7774 = '[ruby-dev:46908]'
|
bug7774 = '[ruby-dev:46908]'
|
||||||
src = %q{
|
src = %q{
|
||||||
|
@ -969,5 +979,32 @@ class TestSetTraceFunc < Test::Unit::TestCase
|
||||||
rescue RuntimeError
|
rescue RuntimeError
|
||||||
end
|
end
|
||||||
}, bug7774
|
}, 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
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue