remove unnecessary JMP when there's no ELSE block
This commit is contained in:
parent
4b370e8623
commit
d581cb24e4
2 changed files with 21 additions and 17 deletions
|
@ -207,22 +207,27 @@ func (c *Compiler) Compile(node ast.Node) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// second jump placeholder
|
|
||||||
jumpPos2 := c.emit(OpJump, 0)
|
|
||||||
|
|
||||||
// update first jump offset
|
|
||||||
curPos := len(c.currentInstructions())
|
|
||||||
c.changeOperand(jumpPos1, curPos)
|
|
||||||
|
|
||||||
if node.Else != nil {
|
if node.Else != nil {
|
||||||
|
// second jump placeholder
|
||||||
|
jumpPos2 := c.emit(OpJump, 0)
|
||||||
|
|
||||||
|
// update first jump offset
|
||||||
|
curPos := len(c.currentInstructions())
|
||||||
|
c.changeOperand(jumpPos1, curPos)
|
||||||
|
|
||||||
if err := c.Compile(node.Else); err != nil {
|
if err := c.Compile(node.Else); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update second jump offset
|
||||||
|
curPos = len(c.currentInstructions())
|
||||||
|
c.changeOperand(jumpPos2, curPos)
|
||||||
|
} else {
|
||||||
|
// update first jump offset
|
||||||
|
curPos := len(c.currentInstructions())
|
||||||
|
c.changeOperand(jumpPos1, curPos)
|
||||||
}
|
}
|
||||||
|
|
||||||
// update second jump offset
|
|
||||||
curPos = len(c.currentInstructions())
|
|
||||||
c.changeOperand(jumpPos2, curPos)
|
|
||||||
case *ast.ForStmt:
|
case *ast.ForStmt:
|
||||||
return c.compileForStmt(node)
|
return c.compileForStmt(node)
|
||||||
case *ast.ForInStmt:
|
case *ast.ForInStmt:
|
||||||
|
|
|
@ -165,13 +165,12 @@ func TestCompiler_Compile(t *testing.T) {
|
||||||
expect(t, `if true { 10 }; 3333`,
|
expect(t, `if true { 10 }; 3333`,
|
||||||
bytecode(
|
bytecode(
|
||||||
concat(
|
concat(
|
||||||
compiler.MakeInstruction(compiler.OpTrue), // 0000
|
compiler.MakeInstruction(compiler.OpTrue), // 0000
|
||||||
compiler.MakeInstruction(compiler.OpJumpFalsy, 11), // 0001
|
compiler.MakeInstruction(compiler.OpJumpFalsy, 8), // 0001
|
||||||
compiler.MakeInstruction(compiler.OpConstant, 0), // 0004
|
compiler.MakeInstruction(compiler.OpConstant, 0), // 0004
|
||||||
compiler.MakeInstruction(compiler.OpPop), // 0007
|
compiler.MakeInstruction(compiler.OpPop), // 0007
|
||||||
compiler.MakeInstruction(compiler.OpJump, 11), // 0008
|
compiler.MakeInstruction(compiler.OpConstant, 1), // 0008
|
||||||
compiler.MakeInstruction(compiler.OpConstant, 1), // 0011
|
compiler.MakeInstruction(compiler.OpPop)), // 0011
|
||||||
compiler.MakeInstruction(compiler.OpPop)), // 0014
|
|
||||||
objectsArray(
|
objectsArray(
|
||||||
intObject(10),
|
intObject(10),
|
||||||
intObject(3333))))
|
intObject(3333))))
|
||||||
|
|
Loading…
Reference in a new issue