b9c1c92d2d
* dead code elimination phase 1 * combine dead code elimination with return fix code * remove last instruction tracking from compiler code (not needed) * fix a symbol table block scope bug * add some more tests
124 lines
3 KiB
Go
124 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)))))
|
|
}
|