each return jumps to cleanup, then jumps back to return
merging