RFR: 8196340: (coll) Examine overriding inherited methods in ArrayList and ArrayList.SubList (original) (raw)
Ivan Gerasimov ivan.gerasimov at oracle.com
Mon May 14 20:29:36 UTC 2018
- Previous message: RFR: 8196340: (coll) Examine overriding inherited methods in ArrayList and ArrayList.SubList
- Next message: RFR: 8196340: (coll) Examine overriding inherited methods in ArrayList and ArrayList.SubList
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Thank you Claes!
The mutator methods normally first update the modCount and then change the size of ArrayList.
Then, in other methods the modCount is copied to a local variable first, and after that the size is copied.
This is not true for equalsRange(List<?> other, int from, int to) when it is called from ArrayList.equals: the size is first copied to the argument and then the modCount is checked inside of equalsRange(). If the size and modCount are changed in between, then equals may produce a wrong results.
It seems to be more accurate to store this.modCount prior calling to equalsRange((List<?>) o, 0, size); and do checkForComodification(expectedModCount); after it is done.
Checking for modCount inside equalsRange() can probably be safely removed.
There's another call to equalsRange() from SubList.equals(). In this case checkForComodification(); is already called after calling to equalsRange(), so everything seems to be fine here.
With kind regards,
Ivan
On 5/14/18 6:37 AM, Claes Redestad wrote: > Hi Ivan, >> right, checkForComodification() alone should be sufficient here. >> Updated in-place: http://cr.openjdk.java.net/~redestad/8196340/open.01/ >> Thanks! >> /Claes >> On 2018-05-12 03:38, Ivan Gerasimov wrote: >> Hi Claes! >>>> One thing I can't figure out is why both these two checks are necessary: >>>> 1303 checkForComodification(); >> 1304 root.checkForComodification(expectedModCount); >>>> The former compares the current root.modCount with the one at the >> time this subList was created. >>>> The later one compares the current root.modCount with the one at the >> time the method was called. >>>> If the later fails, wouldn't it imply the former should also have >> failed? >>>>>> With kind regards, >>>> Ivan >
With kind regards, Ivan Gerasimov
- Previous message: RFR: 8196340: (coll) Examine overriding inherited methods in ArrayList and ArrayList.SubList
- Next message: RFR: 8196340: (coll) Examine overriding inherited methods in ArrayList and ArrayList.SubList
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]