In https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md:
Lemma 2. If the object graph satisfies the modified tricolor invariant, then every white object reachable (directly or indirectly) from a black object is grey-protected by a heap object.
Proof. Let W be a white object reachable from black object B via simple path B → O₁ → ⋯ → Oₙ → W. Note that W and all Oᵢ and must be heap objects because stacks can only point to themselves (in which case it would not be a simple path) or heap objects, so O₁ must be a heap object, and by lemma 1, the rest of the path must be heap objects. Without loss of generality, we can assume none of Oᵢ are black; otherwise, we can simply reconsider using the shortest path suffix that starts with a black object.
I’m having trouble understanding why it says stacks can only point to themselves (in which case it would not be a simple path)
, isn’t B -> stack object1 -> stack object2 -> ... -> heap object -> ... -> W
also possible?