aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--array.c18
-rw-r--r--test/ruby/test_array.rb12
3 files changed, 37 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index be5dda2a33..b5cc46169e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/array.c b/array.c
index 39144b25f4..9668f17797 100644
--- a/array.c
+++ b/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;
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)