mirror of https://github.com/icsharpcode/ILSpy.git
Browse Source
A single slot always occupies the same flattened index, so filling, clearing, or replacing it moves no other child -- only the new child's own index needs setting. The generated single-slot setters now pass that index to SetChildNode (a compile-time constant when no collection precedes the slot; SetChild forwards its argument), which assigns childIndex directly and never invalidates -- mirroring the IL AST's SetChildInstruction(ref, value, index). Previously a set-from-null could not know the index here and fell back to invalidating, forcing a later O(children) EnsureChildIndices rebuild. With the indices now kept current by construction, NextSibling/PrevSibling inline the validity check and skip the (non-inlinable) EnsureChildIndices call in the overwhelmingly common already-valid case. Together these idle the renumber machinery on a System.Private.CoreLib decompile: EnsureChildIndices calls 53.4M -> 1.6M, actual rebuilds 1.97M -> 183K, elements renumbered 3.40M -> 757K. Output is byte-identical and the Pretty suite stays green with CheckInvariant validating the directly-assigned indices after every transform. Assisted-by: Claude:claude-opus-4-8:Claude Codepull/3807/head
2 changed files with 61 additions and 31 deletions
Loading…
Reference in new issue