[
https://issues.apache.org/jira/browse/TINKERPOP-3029?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17802640#comment-17802640
]
ASF GitHub Bot commented on TINKERPOP-3029:
-------------------------------------------
FlorianHockmann commented on code in PR #2424:
URL: https://github.com/apache/tinkerpop/pull/2424#discussion_r1441466689
##########
gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs:
##########
@@ -82,21 +82,22 @@ public bool MoveNext()
}
private bool MoveNextInternal()
- {
+ {
if (_fetchedNext) return _nextAvailable;
+
+ if (!_nextAvailable || _nextAvailable &&
TraverserEnumerator.Current?.Bulk == 0)
Review Comment:
@EricSites sure, but `DefaultTraversal` is an `IEnumerator` itself so
`GetCurrent()` just forwards to `TraverserEnumerator.Current`. If it's illegal
to call `TraverserEnumerator.Current` before calling
`TraverserEnumerator.MoveNext()`, then it's also illegal to call `GetCurrent()`
before calling `MoveNext()`.
We could of course use a flag to check whether enumeration has been started
in `GetCurrent()` and return `null` otherwise, but I don't think it's a good
idea to deviate from the default behavior of .NET enumerators.
Did you see `GetCurrent()` in any stack trace?
> Gremlin.Net: Traversal enumeration fails on .NET 8
> --------------------------------------------------
>
> Key: TINKERPOP-3029
> URL: https://issues.apache.org/jira/browse/TINKERPOP-3029
> Project: TinkerPop
> Issue Type: Bug
> Components: dotnet
> Affects Versions: 3.5.8, 3.6.6, 3.7.1
> Reporter: Florian Hockmann
> Assignee: Florian Hockmann
> Priority: Critical
>
> This has been reported by Eric Sites on the dev mailing list:
> [https://lists.apache.org/thread/snztwgk3s18h83mx8ql455hmx6ncl2r4]
> ----
> I am having a lot of issues using the Gremlin.Net driver version 3.7.1 with
> .Net 8.
> It is almost entirely unusable.
> Any request that uses an Iterator throws an exception ({{{}MoveNext{}}},
> {{{}Next{}}}, {{{}Iterate{}}}).
> {{{}System.InvalidOperationException: Enumeration has not started. Call
> MoveNext{}}}.
> Tracked it down to a change in .Net 8 {{IEnumerable<T>.Current}} behavior.
> Here is an issue about this filed in dotnet runtime:
> [https://github.com/dotnet/runtime/issues/85243]
> New bad code:
> {code:java}
> var enumerator = saves.GetEnumerator();
> while (enumerator.Current == null) // <- Throws exception now
> {
> if (!enumerator.MoveNext())
> return list;
> }
> {code}
> Should be changed to something like this:
> {code:java}
> while (enumerator.MoveNext())
> {
> var item = enumerator.Current;
> }
> {code}
> Here is an example of the issue in the Gremlin.Net code:
> [https://github.com/apache/tinkerpop/blob/e8b9532fc0ec811460e97ebf5e00b8b9ec9192ac/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs#L132]
> {code:java}
> private object? GetCurrent()
> {
> // Use dynamic to object to prevent runtime dynamic conversion evaluation
> return TraverserEnumerator.Current?.Object;
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)