mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
merge revision(s) 43208: [Backport #9003]
* compar.c (cmp_eq): fail if recursion. [ruby-core:57736] [Bug #9003] * thread.c (rb_exec_recursive_paired_outer): new function which is combinnation of paired and outer variants. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@44742 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
54bd3c23fb
commit
0b494041de
6 changed files with 36 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
|||
Wed Jan 29 14:00:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* compar.c (cmp_eq): fail if recursion. [ruby-core:57736] [Bug #9003]
|
||||
|
||||
* thread.c (rb_exec_recursive_paired_outer): new function which is
|
||||
combinnation of paired and outer variants.
|
||||
|
||||
Wed Jan 29 13:40:48 2014 Eric Hodel <drbrain@segment7.net>
|
||||
|
||||
* lib/net/smtp.rb (Net::SMTP#critical): Always return a
|
||||
|
|
9
compar.c
9
compar.c
|
@ -31,10 +31,17 @@ rb_cmperr(VALUE x, VALUE y)
|
|||
rb_obj_classname(x), classname);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
cmp_eq_recursive(VALUE arg1, VALUE arg2, int recursive)
|
||||
{
|
||||
if (recursive) return Qfalse;
|
||||
return rb_funcall2(arg1, cmp, 1, &arg2);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
cmp_eq(VALUE *a)
|
||||
{
|
||||
VALUE c = rb_funcall(a[0], cmp, 1, a[1]);
|
||||
VALUE c = rb_exec_recursive_paired_outer(cmp_eq_recursive, a[0], a[1], a[1]);
|
||||
|
||||
if (NIL_P(c)) return Qfalse;
|
||||
if (rb_cmpint(c, a[0], a[1]) == 0) return Qtrue;
|
||||
|
|
|
@ -399,6 +399,7 @@ void rb_thread_atfork_before_exec(void);
|
|||
VALUE rb_exec_recursive(VALUE(*)(VALUE, VALUE, int),VALUE,VALUE);
|
||||
VALUE rb_exec_recursive_paired(VALUE(*)(VALUE, VALUE, int),VALUE,VALUE,VALUE);
|
||||
VALUE rb_exec_recursive_outer(VALUE(*)(VALUE, VALUE, int),VALUE,VALUE);
|
||||
VALUE rb_exec_recursive_paired_outer(VALUE(*)(VALUE, VALUE, int),VALUE,VALUE,VALUE);
|
||||
/* dir.c */
|
||||
VALUE rb_dir_getwd(void);
|
||||
/* file.c */
|
||||
|
|
|
@ -69,4 +69,11 @@ class TestComparable < Test::Unit::TestCase
|
|||
assert_raise(ArgumentError) { 1.0 < nil }
|
||||
assert_raise(ArgumentError) { 1.0 < Object.new }
|
||||
end
|
||||
|
||||
def test_no_cmp
|
||||
bug9003 = '[ruby-core:57736] [Bug #9003]'
|
||||
assert_nothing_raised(SystemStackError, bug9003) {
|
||||
@o <=> @o.dup
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
12
thread.c
12
thread.c
|
@ -4375,6 +4375,18 @@ rb_clear_trace_func(void)
|
|||
|
||||
static void call_trace_func(rb_event_flag_t, VALUE data, VALUE self, ID id, VALUE klass);
|
||||
|
||||
/*
|
||||
* If recursion is detected on the current method, obj and paired_obj,
|
||||
* the outermost func will be called with (obj, arg, Qtrue). All inner
|
||||
* func will be short-circuited using throw.
|
||||
*/
|
||||
|
||||
VALUE
|
||||
rb_exec_recursive_paired_outer(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE paired_obj, VALUE arg)
|
||||
{
|
||||
return exec_recursive(func, obj, rb_obj_id(paired_obj), arg, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* set_trace_func(proc) -> proc
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#define RUBY_VERSION "1.9.3"
|
||||
#define RUBY_PATCHLEVEL 496
|
||||
#define RUBY_PATCHLEVEL 497
|
||||
|
||||
#define RUBY_RELEASE_DATE "2014-01-29"
|
||||
#define RUBY_RELEASE_YEAR 2014
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue