Revision: 5255 http://trac.macosforge.org/projects/ruby/changeset/5255 Author: watson1978@gmail.com Date: 2011-03-06 00:34:38 -0800 (Sun, 06 Mar 2011) Log Message: ----------- Array#reverse will not raise a SecurityError when $SAFE is 4. Test Script: {{{ require 'test/unit/assertions.rb' include Test::Unit::Assertions ary = [ "a", "b", "c" ] ret = nil Thread.start { $SAFE=4 ret = ["c", "b", "a"] == ary.reverse begin ary.reverse! rescue SecurityError => err else raise "error" end }.join assert_equal(true, ret) assert_equal(["a", "b", "c"], ary) puts :ok }}} Modified Paths: -------------- MacRuby/trunk/array.c Modified: MacRuby/trunk/array.c =================================================================== --- MacRuby/trunk/array.c 2011-03-05 14:09:55 UTC (rev 5254) +++ MacRuby/trunk/array.c 2011-03-06 08:34:38 UTC (rev 5255) @@ -1319,7 +1319,17 @@ static VALUE rary_reverse(VALUE ary, SEL sel) { - return rary_reverse_bang(rary_dup(ary, 0), 0); + VALUE dup = rary_dup(ary, 0); + + if (RARY(dup)->len > 1) { + for (size_t i = 0; i < RARY(dup)->len / 2; i++) { + const size_t j = RARY(dup)->len - i - 1; + VALUE elem = rary_elt(dup, i); + rary_elt_set(dup, i, rary_elt(dup, j)); + rary_elt_set(dup, j, elem); + } + } + return dup; } static inline long