When you're reading a nested message, you temporarily set a 'currentLimit' position (using pushLimit()). During reads, when the soft limit is reached, it is signaled by returning a tag value of 0, which causes message parsing to stop. The hard end-of-stream also sends this signal.