Ok, it's a stack management problem. Here's a reduced case:
puts (false or break)
The problem here is that the break (a simple jump in this case) occurs when there's state on the stack (preparation for the puts call). So the break jump jumps to a point in the stack which doesn't expect to have that stuff on the stack, and so there's an inconsistency which the bytecode validator picks up.
The fix for this, I believe, would be to detect when "break" is being used as an expression and fall back on the exception-based flow control. It's not a trivial fix at the moment, unfortunately.