125 lines
3 KiB
Go
125 lines
3 KiB
Go
|
package compiler_test
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/d5/tengo/compiler"
|
||
|
)
|
||
|
|
||
|
func TestCompilerDeadCode(t *testing.T) {
|
||
|
expect(t, `
|
||
|
func() {
|
||
|
a := 4
|
||
|
return a
|
||
|
|
||
|
b := 5 // dead code from here
|
||
|
c := a
|
||
|
return b
|
||
|
}`,
|
||
|
bytecode(
|
||
|
concat(
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 2),
|
||
|
compiler.MakeInstruction(compiler.OpPop)),
|
||
|
objectsArray(
|
||
|
intObject(4),
|
||
|
intObject(5),
|
||
|
compiledFunction(0, 0,
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 0),
|
||
|
compiler.MakeInstruction(compiler.OpDefineLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 1)))))
|
||
|
|
||
|
expect(t, `
|
||
|
func() {
|
||
|
if true {
|
||
|
return 5
|
||
|
a := 4 // dead code from here
|
||
|
b := a
|
||
|
return b
|
||
|
} else {
|
||
|
return 4
|
||
|
c := 5 // dead code from here
|
||
|
d := c
|
||
|
return d
|
||
|
}
|
||
|
}`, bytecode(
|
||
|
concat(
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 2),
|
||
|
compiler.MakeInstruction(compiler.OpPop)),
|
||
|
objectsArray(
|
||
|
intObject(5),
|
||
|
intObject(4),
|
||
|
compiledFunction(0, 0,
|
||
|
compiler.MakeInstruction(compiler.OpTrue),
|
||
|
compiler.MakeInstruction(compiler.OpJumpFalsy, 9),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 0),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 1),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 1),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 1)))))
|
||
|
|
||
|
expect(t, `
|
||
|
func() {
|
||
|
a := 1
|
||
|
for {
|
||
|
if a == 5 {
|
||
|
return 10
|
||
|
}
|
||
|
5 + 5
|
||
|
return 20
|
||
|
b := a
|
||
|
return b
|
||
|
}
|
||
|
}`, bytecode(
|
||
|
concat(
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 4),
|
||
|
compiler.MakeInstruction(compiler.OpPop)),
|
||
|
objectsArray(
|
||
|
intObject(1),
|
||
|
intObject(5),
|
||
|
intObject(10),
|
||
|
intObject(20),
|
||
|
compiledFunction(0, 0,
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 0),
|
||
|
compiler.MakeInstruction(compiler.OpDefineLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 1),
|
||
|
compiler.MakeInstruction(compiler.OpEqual),
|
||
|
compiler.MakeInstruction(compiler.OpJumpFalsy, 19),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 2),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 1),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 1),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 1),
|
||
|
compiler.MakeInstruction(compiler.OpBinaryOp, 11),
|
||
|
compiler.MakeInstruction(compiler.OpPop),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 3),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 1)))))
|
||
|
|
||
|
expect(t, `
|
||
|
func() {
|
||
|
if true {
|
||
|
return 5
|
||
|
a := 4 // dead code from here
|
||
|
b := a
|
||
|
return b
|
||
|
} else {
|
||
|
return 4
|
||
|
c := 5 // dead code from here
|
||
|
d := c
|
||
|
return d
|
||
|
}
|
||
|
}`, bytecode(
|
||
|
concat(
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 2),
|
||
|
compiler.MakeInstruction(compiler.OpPop)),
|
||
|
objectsArray(
|
||
|
intObject(5),
|
||
|
intObject(4),
|
||
|
compiledFunction(0, 0,
|
||
|
compiler.MakeInstruction(compiler.OpTrue),
|
||
|
compiler.MakeInstruction(compiler.OpJumpFalsy, 9),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 0),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 1),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 1),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 1)))))
|
||
|
}
|