(escapes int)
| 399 | } |
| 400 | |
| 401 | func (p *parser) testThenBlock(escapes int) int { |
| 402 | var jumpFalse int |
| 403 | p.next() |
| 404 | e := p.expression() |
| 405 | p.checkNext(tkThen) |
| 406 | if p.t == tkGoto || p.t == tkBreak { |
| 407 | e = p.function.GoIfFalse(e) |
| 408 | p.function.EnterBlock(false) |
| 409 | p.gotoStatement(e.t) |
| 410 | p.skipEmptyStatements() |
| 411 | if p.blockFollow(false) { |
| 412 | p.function.LeaveBlock() |
| 413 | return escapes |
| 414 | } |
| 415 | jumpFalse = p.function.Jump() |
| 416 | } else { |
| 417 | e = p.function.GoIfTrue(e) |
| 418 | p.function.EnterBlock(false) |
| 419 | jumpFalse = e.f |
| 420 | } |
| 421 | p.statementList() |
| 422 | p.function.LeaveBlock() |
| 423 | if p.t == tkElse || p.t == tkElseif { |
| 424 | escapes = p.function.Concatenate(escapes, p.function.Jump()) |
| 425 | } |
| 426 | p.function.PatchToHere(jumpFalse) |
| 427 | return escapes |
| 428 | } |
| 429 | |
| 430 | func (p *parser) ifStatement(line int) { |
| 431 | escapes := p.testThenBlock(noJump) |
no test coverage detected