f2107bfbc4
In Go structs must be copied when used as arguments. To do so we must clone struct on VM level. This is done by appending this struct to an intermediate array.
68 lines
7.9 KiB
Go
68 lines
7.9 KiB
Go
package compiler_test
|
|
|
|
import (
|
|
"math/big"
|
|
"testing"
|
|
)
|
|
|
|
func TestAddressOfLiteral(t *testing.T) {
|
|
src := `package foo
|
|
type Foo struct { A int }
|
|
func Main() int {
|
|
f := &Foo{}
|
|
setA(f, 3)
|
|
return f.A
|
|
}
|
|
func setA(s *Foo, a int) { s.A = a }`
|
|
eval(t, src, big.NewInt(3))
|
|
}
|
|
|
|
func TestPointerDereference(t *testing.T) {
|
|
src := `package foo
|
|
type Foo struct { A int }
|
|
func Main() int {
|
|
f := &Foo{A: 4}
|
|
setA(*f, 3)
|
|
return f.A
|
|
}
|
|
func setA(s Foo, a int) { s.A = a }`
|
|
eval(t, src, big.NewInt(4))
|
|
}
|
|
|
|
func TestStructArgCopy(t *testing.T) {
|
|
t.Run("Simple", func(t *testing.T) {
|
|
src := `package foo
|
|
type Foo struct { A int }
|
|
func Main() int {
|
|
f := Foo{A: 4}
|
|
setA(f, 3)
|
|
return f.A
|
|
}
|
|
func setA(s Foo, a int) { s.A = a }`
|
|
eval(t, src, big.NewInt(4))
|
|
})
|
|
t.Run("StructField", func(t *testing.T) {
|
|
src := `package foo
|
|
type Bar struct { A int }
|
|
type Foo struct { B Bar }
|
|
func Main() int {
|
|
f := Foo{B: Bar{A: 4}}
|
|
setA(f, 3)
|
|
return f.B.A
|
|
}
|
|
func setA(s Foo, a int) { s.B.A = a }`
|
|
eval(t, src, big.NewInt(4))
|
|
})
|
|
t.Run("StructPointerField", func(t *testing.T) {
|
|
src := `package foo
|
|
type Bar struct { A int }
|
|
type Foo struct { B *Bar }
|
|
func Main() int {
|
|
f := Foo{B: &Bar{A: 4}}
|
|
setA(f, 3)
|
|
return f.B.A
|
|
}
|
|
func setA(s Foo, a int) { s.B.A = a }`
|
|
eval(t, src, big.NewInt(3))
|
|
})
|
|
}
|