Array#find can return the wrong value if it's mutated during iteration ----------------------------------------------------------------------
Key: JRUBY-4805 URL: http://jira.codehaus.org/browse/JRUBY-4805 Project: JRuby Issue Type: Bug Components: Core Classes/Modules Affects Versions: JRuby 1.5 Reporter: Charles Oliver Nutter Priority: Critical This is a regression that caused problems for Buildr: {noformat} ~/projects/buildr ➔ jruby -e "a = [1,2,3,4]; p a.find {|x| foo = x > 2; a.delete x if foo; foo}" 4 ~/projects/buildr ➔ ruby -e "a = [1,2,3,4]; p a.find {|x| foo = x > 2; a.delete x if foo; foo}" 3 {noformat} Below is a trivial patch, but I'm not sure exactly what other cases aren't being handled properly for this. We need to explore other mutation-during-search cases for the other methods we fast-pathed in 1.5. {noformat} diff --git a/src/org/jruby/RubyArray.java b/src/org/jruby/RubyArray.java index 05dc4a1..354a989 100644 --- a/src/org/jruby/RubyArray.java +++ b/src/org/jruby/RubyArray.java @@ -3793,7 +3793,8 @@ public class RubyArray extends RubyObject implements List { public IRubyObject detectCommon(ThreadContext context, IRubyObject ifnone, Block block) { for (int i = begin; i < begin + realLength; i++) { - if (block.yield(context, values[i]).isTrue()) return values[i]; + IRubyObject value = values[i]; + if (block.yield(context, value).isTrue()) return value; } return ifnone != null ? ifnone.callMethod(context, "call") : {noformat} -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email