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>
|
||||
|
||||
* 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 *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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue