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_2_0_0@43230 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2013-10-09 16:36:05 +00:00
parent a577137cfd
commit c05d019cb4
6 changed files with 36 additions and 2 deletions

View file

@ -1,3 +1,10 @@
Thu Oct 10 01:14:37 2013 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.
Thu Oct 10 01:07:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/tempfile.rb (Tempfile#unlink): finalizer is no longer needed

View file

@ -51,10 +51,17 @@ rb_invcmp(VALUE x, VALUE y)
}
}
static VALUE
cmp_eq_recursive(VALUE arg1, VALUE arg2, int recursive)
{
if (recursive) return Qfalse;
return rb_funcall(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;

View file

@ -426,6 +426,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 */

View file

@ -76,4 +76,11 @@ class TestComparable < Test::Unit::TestCase
assert_nil(Time.new <=> "")
}
end
def test_no_cmp
bug9003 = '[ruby-core:57736] [Bug #9003]'
assert_nothing_raised(SystemStackError, bug9003) {
@o <=> @o.dup
}
end
end

View file

@ -4877,6 +4877,18 @@ rb_exec_recursive_outer(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE arg)
return exec_recursive(func, obj, 0, arg, 1);
}
/*
* 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:
* thr.backtrace -> array

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.0.0"
#define RUBY_RELEASE_DATE "2013-10-10"
#define RUBY_PATCHLEVEL 333
#define RUBY_PATCHLEVEL 334
#define RUBY_RELEASE_YEAR 2013
#define RUBY_RELEASE_MONTH 10