I agree, based on my memory of thrashing around on this.

On Mon, Jan 25, 2010 at 10:21 AM, Dawid Weiss <dawid.we...@gmail.com> wrote:
> This looks like a bug, it's a different pattern everywhere else. See my patch.
>
> D.
>
> On Mon, Jan 25, 2010 at 4:16 PM, Benson Margulies <bimargul...@gmail.com> 
> wrote:
>> Well,
>>
>> I deleted my Harmony tree, I'll refetch it tonight and check.
>>
>> --benson
>>
>>
>> On Mon, Jan 25, 2010 at 8:26 AM, Dawid Weiss <dawid.we...@gmail.com> wrote:
>>> Hi Benson (and others),
>>>
>>> Say, when you moved the code from Apache Harmony, did you modify it
>>> along the way, or is it what's found in the Harmony's
>>> source code? I'm asking because we're still hitting those array out of
>>> bounds exceptions sometimes. They are tough to isolate, so I reverted
>>> to white-box code inspection. There is a repeated snippet of code that
>>> just isn't right to me, look here:
>>>
>>>      comparison = comp.compare(c, partitionIndex);
>>>      while (c >= b && comparison >= 0) {
>>>        if (comparison == 0) {
>>>          if (c == partitionIndex) {
>>>            partitionIndex = d;
>>>          } else if (d == partitionIndex) {
>>>            partitionIndex = c;
>>>          }
>>>          swap.swap(c, d);
>>>
>>>          d--;
>>>        }
>>>        c--;
>>>        comparison = comp.compare(c, partitionIndex);
>>>      }
>>>
>>> doing eager comparison counting is wrong because variable c _can go
>>> below _b_ (which can be the start index or zero). To keep
>>> the invariants correct, the code should read as follows:
>>>
>>>      int comparison;
>>>      while (c >= b && (comparison = comp.compare(c, partitionIndex)) >= 0) {
>>>        if (comparison == 0) {
>>>          if (c == partitionIndex) {
>>>            partitionIndex = d;
>>>          } else if (d == partitionIndex) {
>>>            partitionIndex = c;
>>>          }
>>>          swap.swap(c, d);
>>>
>>>          d--;
>>>        }
>>>        c--;
>>>      }
>>>
>>> Note that I did not analyze the whole logic flow of qsort in this
>>> ported code, but just looking at the code above it seems
>>> that c can indeed go beyond the marker limit.
>>>
>>> What do you think? A bug or am I just being dim?
>>>
>>> Dawid
>>>
>>
>

Reply via email to