It occured to me on the way onto the train that this construct doesn't need pass_two(). When I get home to more bandwidth I'll cook up a simplified version that resolves break distance in zend_do_brk_cont() and frees the labels in do_end_loop().
Okay, simpler/leaner implementation now available. The new version only touches zend_compile.[ch] and zend_language_parser.y though the functionality is the same.