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
103 lines
1.1 KiB
Go
103 lines
1.1 KiB
Go
package runtime_test
|
|
|
|
import "testing"
|
|
|
|
func TestVMScopes(t *testing.T) {
|
|
// shadowed global variable
|
|
expect(t, `
|
|
c := 5
|
|
if a := 3; a {
|
|
c := 6
|
|
} else {
|
|
c := 7
|
|
}
|
|
out = c
|
|
`, nil, 5)
|
|
|
|
// shadowed local variable
|
|
expect(t, `
|
|
func() {
|
|
c := 5
|
|
if a := 3; a {
|
|
c := 6
|
|
} else {
|
|
c := 7
|
|
}
|
|
out = c
|
|
}()
|
|
`, nil, 5)
|
|
|
|
// 'b' is declared in 2 separate blocks
|
|
expect(t, `
|
|
c := 5
|
|
if a := 3; a {
|
|
b := 8
|
|
c = b
|
|
} else {
|
|
b := 9
|
|
c = b
|
|
}
|
|
out = c
|
|
`, nil, 8)
|
|
|
|
// shadowing inside for statement
|
|
expect(t, `
|
|
a := 4
|
|
b := 5
|
|
for i:=0;i<3;i++ {
|
|
b := 6
|
|
for j:=0;j<2;j++ {
|
|
b := 7
|
|
a = i*j
|
|
}
|
|
}
|
|
out = a`, nil, 2)
|
|
|
|
// shadowing variable declared in init statement
|
|
expect(t, `
|
|
if a := 5; a {
|
|
a := 6
|
|
out = a
|
|
}`, nil, 6)
|
|
expect(t, `
|
|
a := 4
|
|
if a := 5; a {
|
|
a := 6
|
|
out = a
|
|
}`, nil, 6)
|
|
expect(t, `
|
|
a := 4
|
|
if a := 0; a {
|
|
a := 6
|
|
out = a
|
|
} else {
|
|
a := 7
|
|
out = a
|
|
}`, nil, 7)
|
|
expect(t, `
|
|
a := 4
|
|
if a := 0; a {
|
|
out = a
|
|
} else {
|
|
out = a
|
|
}`, nil, 0)
|
|
|
|
// shadowing function level
|
|
expect(t, `
|
|
a := 5
|
|
func() {
|
|
a := 6
|
|
a = 7
|
|
}()
|
|
out = a
|
|
`, nil, 5)
|
|
expect(t, `
|
|
a := 5
|
|
func() {
|
|
if a := 7; true {
|
|
a = 8
|
|
}
|
|
}()
|
|
out = a
|
|
`, nil, 5)
|
|
}
|