70 lines
2 KiB
Go
70 lines
2 KiB
Go
|
package compiler_test
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/d5/tengo/compiler"
|
||
|
)
|
||
|
|
||
|
func TestCompilerScopes(t *testing.T) {
|
||
|
expect(t, `
|
||
|
if a := 1; a {
|
||
|
a = 2
|
||
|
b := a
|
||
|
} else {
|
||
|
a = 3
|
||
|
b := a
|
||
|
}`, bytecode(
|
||
|
concat(
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 0),
|
||
|
compiler.MakeInstruction(compiler.OpSetGlobal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetGlobal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpJumpFalsy, 27),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 1),
|
||
|
compiler.MakeInstruction(compiler.OpSetGlobal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetGlobal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpSetGlobal, 1),
|
||
|
compiler.MakeInstruction(compiler.OpJump, 39),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 2),
|
||
|
compiler.MakeInstruction(compiler.OpSetGlobal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetGlobal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpSetGlobal, 1)),
|
||
|
objectsArray(
|
||
|
intObject(1),
|
||
|
intObject(2),
|
||
|
intObject(3))))
|
||
|
|
||
|
expect(t, `
|
||
|
func() {
|
||
|
if a := 1; a {
|
||
|
a = 2
|
||
|
b := a
|
||
|
} else {
|
||
|
a = 3
|
||
|
b := a
|
||
|
}
|
||
|
}`, bytecode(
|
||
|
concat(
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 3),
|
||
|
compiler.MakeInstruction(compiler.OpPop)),
|
||
|
objectsArray(
|
||
|
intObject(1),
|
||
|
intObject(2),
|
||
|
intObject(3),
|
||
|
compiledFunction(0, 0,
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 0),
|
||
|
compiler.MakeInstruction(compiler.OpDefineLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpJumpFalsy, 22),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 1),
|
||
|
compiler.MakeInstruction(compiler.OpSetLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpDefineLocal, 1),
|
||
|
compiler.MakeInstruction(compiler.OpJump, 31),
|
||
|
compiler.MakeInstruction(compiler.OpConstant, 2),
|
||
|
compiler.MakeInstruction(compiler.OpSetLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpGetLocal, 0),
|
||
|
compiler.MakeInstruction(compiler.OpDefineLocal, 1),
|
||
|
compiler.MakeInstruction(compiler.OpReturn, 0)))))
|
||
|
}
|