# More fixes for core/array specs (again)

**URL:** <https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027>\
**Category:** IronRuby\
**Created:** [April 21, 2009, 6:04am UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027 "2009-04-21T06:04:34Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![murena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ba0ec/32.png) [@murena](https://www.ruby-forum.com/u/murena)\
**Post date:** [April 21, 2009, 6:04am UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027/1 "2009-04-21T06:04:34Z")

</div>

Hi,  
I have attached a diff with new fixes for a whole bunch of failing  
expectations in the core/array specs.

- Slightly modified IListOps.UniqueSelf as suggested upon review.
- Fixed IListOps.ReverseIndex as Array#rindex should not fail if  
elements are removed from the array during the iteration over its  
elements.
- Changed IListOps.Reverse to return IList instances of the same type  
of the given self argument (this change also fixes the following  
failing spec: “Array#reverse returns subclass instance on Array  
subclasses”)
- Changed IListOps.SetElement to make it try to invoke #to\_ary on its  
argument for multi-element sets.
- Changed one overload of IListOps.Equals to make it try to call  
#to\_ary on the object argument of Array#== and use the resulting array  
as the actual argument for the equality check.
- Cleaning up tags removing expectations that do not fail anymore.
- Added ArrayOps.ToAry as Array#to\_a and Array#to\_ary behave  
differently on subclasses of arrays.
- Various changes to IListOps.Join to clear all of the remaining tags  
for the specs of Array#join. The tags marked as critical in  
join\_tags.txt are not related to pending bugs for Array#join.
- Changed IListOps.Repetition to return IList instances of the same  
type of the given self argument (this fixes also “Array#\* with an  
integer returns subclass instance with Array subclasses”)
- Modified IListOps.RecursiveJoin to make it flag the resulting string  
as tainted if the given array, at least one of its elements or the  
separator string are tainted.
- IListOps.Difference now uses Object#hash and Object#eql? to check  
for object equality, this fixes the failing spec “Array#- acts as if  
using an intermediate hash to collect values”

These changes directly clear the following failing expectations:

Array#[]= calls to\_ary on its rhs argument for multi-element sets  
Array#== calls to\_ary on its argument  
Array#join tries to convert the passed seperator to a String using  
#to\_str  
Array#join checks whether the passed seperator responds to #to\_str  
Array#join handles recursive arrays  
Array#join does not consider taint of either the array or the  
separator when the array is empty  
Array#join returns a string which would be infected with taint of the  
array, its elements or the separator when the array is not empty  
Array#join does not process the separator if the array is empty  
Array#join raises a TypeError if the passed separator is not a string  
and does not respond to #to\_str  
Array#- acts as if using an intermediate hash to collect values  
Array#\* with an integer returns subclass instance with Array subclasses  
Array#\* with an integer copies the taint status of the original array  
even if the array is empty  
Array#\* with an integer copies the taint status of the original array  
if the passed count is not 0  
Array#\* with a string returns a string which would be infected with  
taint of the array, its elements or the separator when the array is  
not empty  
Array#reverse returns subclass instance on Array subclasses  
Array#rindex does not fail when removing elements from block

I have only a question: I’ve made changes to IListOps.Reverse and  
IListOps.Repetition in order to make them return IList instead of  
RubyArray. In ruby, Array#reverse and Array#\* maintain the same type  
of self for the returning object (that is, if self is a  
RubyArray.Subclass then it is returned a new object of the same type).  
With these changes we would actually be able to do something like  
this:

> > > arraylist = System::Collections::ArrayList.new([1,2,3,4,5])  
> > > =\> [1, 2, 3, 4, 5]
> 
> > > multiplied\_arraylist = arraylist \* 2  
> > > =\> [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
> 
> > > multiplied\_arraylist.class  
> > > =\> System::Collections::ArrayList

Would it be a consistent behaviour?

On a (partially) unrelated note, I’ve just noticed that  
List.Reverse is more like Array#reverse! but it actually take the  
precedence over IListOps.Reverse. I’m just thinking if this could lead  
to some sort of confusion (ohan I’m not sure if anything can be done  
about this.

Thanks,  
Daniele

PS: I’m waiting to push these changes on my remote repository, Jim  
told he is going to pull today but I would like to wait for a review  
first (and yeah, today I’m too lazy to actually start off a new branch  
:-)).

---

<div class="post-metadata">

**Author:** ![murena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ba0ec/32.png) [@murena](https://www.ruby-forum.com/u/murena)\
**Post date:** [April 21, 2009, 6:58am UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027/2 "2009-04-21T06:58:26Z")

</div>

Looks great!

Could you copy the comment “# MRI follows hashing semantics here, so  
doesn’t actually call eql?/hash for Fixnum/Symbol” from  
core\array\minus\_spec.rb to IListOps.Difference as its not obvious why  
the code in IListOps.Difference does the complicated checks.

Yes, it seems OK that you can call all the Array methods on  
System::Collections::ArrayList (and any System::Collectinos::IList  
object in general). We are exposing Ruby String methods on  
System::String, and it would be consistent with that approach.

About List.Reverse, you could argue that if you use Ruby casing of  
“reverse”, IListOps should get precedence. Could you open a bug for this  
please? If you use “Reverse”, then the CLR method should get precedence,  
and there would be a possibility of confusion, but as you say, there is  
not much that can be done. It does not seem worth special-casing.

Thanks,  
Shri

---

<div class="post-metadata">

**Author:** ![murena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ba0ec/32.png) [@murena](https://www.ruby-forum.com/u/murena)\
**Post date:** [April 21, 2009, 8:45am UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027/3 "2009-04-21T08:45:47Z")

</div>

Daniele,

If you push this out tonight, I’ll pull it in tomorrow.

JD

---

<div class="post-metadata">

**Author:** ![murena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ba0ec/32.png) [@murena](https://www.ruby-forum.com/u/murena)\
**Post date:** [April 21, 2009, 1:46pm UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027/4 "2009-04-21T13:46:47Z")

</div>

Right now I don’t have access to my local repository, I think to be  
able to push on github by 9:00 PM CEST (UTC+2, that’s my timezone, it  
should be 12:00 PM PDT).

On Tue, Apr 21, 2009 at 08:39, Jim D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > To: removed\_email\_address@domain.invalid  
> > System::Collections::ArrayList (and any System::Collectinos::IList  
> > Thanks,  
> > Hi,  
> > subclasses")  
> > join\_tags.txt are not related to pending bugs for Array#join.  
> > These changes directly clear the following failing expectations:  
> > passed separator is not a string and does not respond to #to\_str
> > 
> > > > > multiplied\_arraylist = arraylist \* 2
> > 
> > [clorophilla.net](http://www.clorophilla.net/blog/)

–  
Daniele A.  
[http://www.clorophilla.net/blog/](http://www.clorophilla.net/blog/)  
[http://twitter.com/JoL1hAHN](http://twitter.com/JoL1hAHN)

---

<div class="post-metadata">

**Author:** ![murena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ba0ec/32.png) [@murena](https://www.ruby-forum.com/u/murena)\
**Post date:** [April 21, 2009, 1:59pm UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027/5 "2009-04-21T13:59:05Z")

</div>

OK I’ll add that comment to IListOps.Difference.  
From what I’ve seen yesterday “reverse” and “Reverse” both call the  
CLR method of List, I’ll try again later to confirm this behaviour  
just to be really sure before I open a bug.

Thanks,  
Daniele

On Tue, Apr 21, 2009 at 06:57, Shri B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> - Slightly modified IListOps.UniqueSelf as suggested upon review.
> - IListOps.Difference now uses Object#hash and Object#eql? to check for object equality, this fixes the failing spec “Array#- acts as if using an intermediate hash to collect values”  
> I have only a question: I’ve made changes to IListOps.Reverse and IListOps.Repetition in order to make them return IList instead of RubyArray. In ruby, Array#reverse and Array#\* maintain the same type of self for the returning object (that is, if self is a RubyArray.Subclass then it is returned a new object of the same type).  
> Would it be a consistent behaviour?  
> Daniele A.  
> [clorophilla.net](http://www.clorophilla.net/blog/)  
> [http://twitter.com/JoL1hAHN](http://twitter.com/JoL1hAHN)
> 
> * * *
> 
> Ironruby-core mailing list  
> removed\_email\_address@domain.invalid  
> [http://rubyforge.org/mailman/listinfo/ironruby-core](http://rubyforge.org/mailman/listinfo/ironruby-core)

–  
Daniele A.  
[http://www.clorophilla.net/blog/](http://www.clorophilla.net/blog/)  
[http://twitter.com/JoL1hAHN](http://twitter.com/JoL1hAHN)

---

<div class="post-metadata">

**Author:** ![murena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ba0ec/32.png) [@murena](https://www.ruby-forum.com/u/murena)\
**Post date:** [April 22, 2009, 6:05am UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027/6 "2009-04-22T06:05:54Z")

</div>

Awesome. I just started putting the other set of changes (Shri, Daniele  
and Jirapong’s changes as of ~7pm yesterday) through the continuous  
integration troll we call SNAP.

I’ll start pulling in the next set right away (Expected to be this  
change, my changes, and Jimmy’s changes)

JD

---

<div class="post-metadata">

**Author:** ![murena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/7ba0ec/32.png) [@murena](https://www.ruby-forum.com/u/murena)\
**Post date:** [April 21, 2009, 8:47pm UTC](https://www.ruby-forum.com/t/more-fixes-for-core-array-specs-again/166027/7 "2009-04-21T20:47:01Z")

</div>

Just pushed my changes (with the added comment to IListOps.Difference  
as suggested by Shri).

> <https://github.com/nrk/ironruby/commit/722dd4d2dc233458a49f154b926ea666d2cdb324>
>
> \* Modified IListOps.RecursiveJoin to make it flag the resulting string as tainte…d if the given array, at least one of its elements or the separator string are tainted.
> 
> \* Changed IListOps.Repetition to return IList instances of the same type of the given self argument (this fixes also "Array#\* with an integer returns subclass instance with Array subclasses")
> 
> \* Various changes to IListOps.Join to clear all of the remaining tags for the specs of Array#join. The tags marked as critical in join\_tags.txt are not related to pending bugs for Array#join.
> 
> \* Added ArrayOps.ToAry as Array#to\_a and Array#to\_ary behave differently on subclasses of arrays.
> 
> \* Cleaning up tags removing expectations that do not fail anymore.
> 
> \* Changed one overload of IListOps.Equals to make it try to call #to\_ary on the object argument of Array#== and use the resulting array as the actual argument for the equality check.
> 
> \* Changed IListOps.SetElement to make it try to invoke #to\_ary on its argument for multi-element sets.
> 
> \* Changed IListOps.Reverse to return IList instances of the same type of the given self argument (this change also fixes the following failing spec: "Array#reverse returns subclass instance on Array subclasses")
> 
> \* Fixed IListOps.ReverseIndex as Array#rindex should not fail if elements are removed from the array during the iteration over its elements.
> 
> \* Slightly modified IListOps.UniqueSelf as suggested upon review.

Thanks,  
Daniele

On Tue, Apr 21, 2009 at 13:43, Daniele A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > > doesn’t actually call eql?/hash for Fixnum/Symbol" from  
> > > this please? If you use “Reverse”, then the CLR method should get  
> > > removed\_email\_address@domain.invalid] On Behalf Of Daniele A.  
> > > elements are removed from the array during the iteration over its
> > > 
> > > - Cleaning up tags removing expectations that do not fail anymore.  
> > > separator string are tainted.  
> > > arrays Array#join does not consider taint of either the array or the  
> > > if the passed count is not 0  
> > > With these changes we would actually be able to do something like
> > > 
> > > he is going to pull today but I would like to wait for a review first
> 
> [clorophilla.net](http://www.clorophilla.net/blog/)  
> [http://twitter.com/JoL1hAHN](http://twitter.com/JoL1hAHN)

–  
Daniele A.  
[http://www.clorophilla.net/blog/](http://www.clorophilla.net/blog/)  
[http://twitter.com/JoL1hAHN](http://twitter.com/JoL1hAHN)
