mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-01 13:49:13 +00:00
compiler: support pointer dereferencing for structs
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
eb047b12a7
commit
d54c60ded3
2 changed files with 22 additions and 0 deletions
|
@ -610,6 +610,16 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor {
|
||||||
c.emitLoadConst(c.typeAndValueOf(n))
|
c.emitLoadConst(c.typeAndValueOf(n))
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
case *ast.StarExpr:
|
||||||
|
_, ok := c.getStruct(c.typeOf(n.X))
|
||||||
|
if !ok {
|
||||||
|
c.prog.Err = errors.New("dereferencing is only supported on structs")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ast.Walk(c, n.X)
|
||||||
|
c.emitConvert(stackitem.StructT)
|
||||||
|
return nil
|
||||||
|
|
||||||
case *ast.Ident:
|
case *ast.Ident:
|
||||||
if tv := c.typeAndValueOf(n); tv.Value != nil {
|
if tv := c.typeAndValueOf(n); tv.Value != nil {
|
||||||
c.emitLoadConst(tv)
|
c.emitLoadConst(tv)
|
||||||
|
|
|
@ -16,3 +16,15 @@ func TestAddressOfLiteral(t *testing.T) {
|
||||||
func setA(s *Foo, a int) { s.A = a }`
|
func setA(s *Foo, a int) { s.A = a }`
|
||||||
eval(t, src, big.NewInt(3))
|
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))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue