Actions
Bug #4890
closedDotNetIterator class doesn't implement hasNext() correctly
Start date:
2021-02-04
Due date:
% Done:
100%
Estimated time:
Legacy ID:
Applies to branch:
10
Fix Committed on Branch:
10, trunk
Fixed in Maintenance Release:
Platforms:
Description
This problem may be asymptomatic, but the class net.sf.saxon.dotnet.DotNetIterator
, which is used on the .NET product to bridge a C# IEnumerator
to a Java Iterator
, is incorrect. According to the contract for java.lang.Iterator
, the hasNext()
method should leave the state of the iterator unchanged, but we're calling MoveNext()
, which means that if you make two calls on hasNext()
without an intervening call on next()
, the iterator will change position.
It works so long as the caller calls hasNext()
exactly once between successive calls on next()
.
Updated by Michael Kay about 3 years ago
- Subject changed from DotNotIterator doesn't implement hasNext() correctly to DotNetIterator class doesn't implement hasNext() correctly
Updated by Michael Kay about 3 years ago
I think the correct logic would be:
public class IteratorFromEnumerator<T> : java.util.Iterator<T> {
private IEnumerator<T> enumerator;
private bool moreToCome ;
public IteratorFromEnumerator(IEnumerator<T> enumerator) {
this.enumerator = enumerator;
this.moreToCome = enumerator.MoveNext();
}
public bool hasNext() {
return moreToCome;
}
public T next() {
T nextItem = enumerator.Current;
this.moreToCome = enumerator.MoveNext();
return nextItem;
}
}
Updated by O'Neil Delpratt about 3 years ago
- Assignee changed from Michael Kay to O'Neil Delpratt
Updated by O'Neil Delpratt about 3 years ago
- Status changed from New to Resolved
- % Done changed from 0 to 100
- Applies to branch 10 added
- Fix Committed on Branch 10, trunk added
Bug fixed and committed to git repository.
Updated by O'Neil Delpratt about 3 years ago
- Status changed from Resolved to Closed
- Fixed in Maintenance Release 10.5 added
Bug fix applied to Saxon 10.5 maintenance release.
Please register to edit this issue
Actions