mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
928c99944b
commit
19737494b9
3 changed files with 37 additions and 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.
|
||||
|
|
18
array.c
18
array.c
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue