diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-05 12:53:31 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-05 12:53:31 +0000 |
commit | 19737494b9f67f935acd5ec141c5137b8d20c3f3 (patch) | |
tree | 1ffcd9ea914b058e3634eeb7292c2ba04327f299 | |
parent | 928c99944ba88784a5e921df900472fb32963466 (diff) | |
download | ruby-19737494b9f67f935acd5ec141c5137b8d20c3f3.tar.gz |
array.c: prefer lhs elements
* array.c (rb_ary_or): lhs elements are prefered, so should not
replace with rhs elements.
* test/ruby/test_array.rb (test_OR_in_order): import the test failed
by r43969 from rubyspec/core/array/union_spec.rb.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | array.c | 18 | ||||
-rw-r--r-- | test/ruby/test_array.rb | 12 |
3 files changed, 37 insertions, 1 deletions
@@ -1,3 +1,11 @@ +Thu Dec 5 21:53:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * array.c (rb_ary_or): lhs elements are prefered, so should not + replace with rhs elements. + + * test/ruby/test_array.rb (test_OR_in_order): import the test failed + by r43969 from rubyspec/core/array/union_spec.rb. + Thu Dec 5 21:05:42 2013 Koichi Sasada <ko1@atdot.net> * gc.c (gc_info_decode): fix to avoid syntax error on VS2012. @@ -4025,6 +4025,14 @@ rb_ary_and(VALUE ary1, VALUE ary2) return ary3; } +static int +ary_hash_orset(st_data_t *key, st_data_t *value, st_data_t arg, int existing) +{ + if (existing) return ST_STOP; + *key = *value = (VALUE)arg; + return ST_CONTINUE; +} + /* * call-seq: * ary | other_ary -> new_ary @@ -4043,9 +4051,17 @@ static VALUE rb_ary_or(VALUE ary1, VALUE ary2) { VALUE hash, ary3; + long i; ary2 = to_ary(ary2); - hash = ary_add_hash(ary_make_hash(ary1), ary2); + hash = ary_make_hash(ary1); + + for (i=0; i<RARRAY_LEN(ary2); i++) { + VALUE elt = RARRAY_AREF(ary2, i); + if (!st_update(RHASH_TBL(hash), (st_data_t)elt, ary_hash_orset, (st_data_t)elt)) { + OBJ_WRITTEN(hash, Qundef, elt); + } + } ary3 = rb_hash_values(hash); ary_recycle_hash(hash); return ary3; diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index 85f1ec0058..1c2adf852b 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -1662,6 +1662,18 @@ class TestArray < Test::Unit::TestCase assert(c.none?(&:frozen?)) end + def test_OR_in_order + obj1, obj2 = Class.new do + attr_reader :name + def initialize(name) @name = name; end + def inspect; "test_OR_in_order(#{@name})"; end + def hash; 0; end + def eql?(a) true; end + break [new("1"), new("2")] + end + assert_equal([obj1], [obj1]|[obj2]) + end + def test_combination assert_equal(@cls[[]], @cls[1,2,3,4].combination(0).to_a) assert_equal(@cls[[1],[2],[3],[4]], @cls[1,2,3,4].combination(1).to_a) |