Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions gen/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ func (d *decodeGen) structAsTuple(s *Struct) {
d.p.declare(sz, u32)
d.assignArray(sz, arrayHeader, 0)
if s.AsVarTuple {
d.p.printf("\nif %[1]s == 0 { return }", sz)
d.p.printf("\nfor %[1]s > 0 {", sz) // start the block
} else {
d.p.arrayCheck(strconv.Itoa(len(s.Fields)), sz)
}
Expand Down Expand Up @@ -239,11 +239,12 @@ func (d *decodeGen) structAsTuple(s *Struct) {
d.p.printf("\n}") // close if statement
}
if s.AsVarTuple {
d.p.printf("\nif %[1]s--; %[1]s == 0 { return }", sz)
d.p.printf("\nif %[1]s--; %[1]s == 0 { break }", sz) // exit from the block
}
}
if s.AsVarTuple {
d.p.printf("\nfor ; %[1]s > 0; %[1]s-- {\nif err = dc.Skip(); err != nil {\nerr = msgp.WrapError(err)\nreturn\n}\n}", sz)
d.p.printf("\n}") // end the block
}
}

Expand Down
5 changes: 3 additions & 2 deletions gen/unmarshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ func (u *unmarshalGen) tuple(s *Struct) {
u.p.declare(sz, u32)
u.assignAndCheck(sz, arrayHeader)
if s.AsVarTuple {
u.p.printf("\nif %[1]s == 0 {\no = bts\nreturn\n}", sz)
u.p.printf("\nfor %[1]s > 0 {", sz) // start the block
} else {
u.p.arrayCheck(strconv.Itoa(len(s.Fields)), sz)
}
Expand Down Expand Up @@ -265,11 +265,12 @@ func (u *unmarshalGen) tuple(s *Struct) {
u.p.printf("\n}")
}
if s.AsVarTuple {
u.p.printf("\nif %[1]s--; %[1]s == 0 {\no = bts\nreturn\n}", sz)
u.p.printf("\nif %[1]s--; %[1]s == 0 { break }", sz) // exit from the block
}
}
if s.AsVarTuple {
u.p.printf("\nfor ; %[1]s > 0; %[1]s-- {\nbts, err = msgp.Skip(bts)\nif err != nil {\nerr = msgp.WrapError(err)\nreturn\n}\n}", sz)
u.p.printf("\n}") // end the block
}
}

Expand Down
60 changes: 60 additions & 0 deletions issue430_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package main

import "testing"

func TestIssue430Nested(t *testing.T) {
mainFilename, err := generate(t, issue430Nested)
if err != nil {
t.Fatalf("generate failed: %v", err)
}

goExec(t, mainFilename, false) // exec go run
goExec(t, mainFilename, true) // exec go test
}

var issue430Nested = `package main

import (
"fmt"
"os"
)

//go:generate msgp

//msgp:vartuple Bag
type Bag struct {
ItemID uint32
ItemNum uint32
}

//msgp:vartuple User
type User struct {
Name string
Bag []*Bag
}

func main() {
u := User{Name: "user", Bag: []*Bag{{1, 2}, {3, 4}}}
data, err := u.MarshalMsg(nil)
if err != nil {
fmt.Println("User MarshalMsg failed:", err)
os.Exit(1)
}

var user User
if _, err := user.UnmarshalMsg(data); err != nil {
fmt.Println("User UnmarshalMsg failed:", err)
os.Exit(1)
}
if user.Name != "user" ||
user.Bag[0] == nil ||
user.Bag[0].ItemID != 1 ||
user.Bag[0].ItemNum != 2 ||
user.Bag[1] == nil ||
user.Bag[1].ItemID != 3 ||
user.Bag[1].ItemNum != 4 {
fmt.Println("User UnmarshalMsg bad user:", user)
os.Exit(1)
}
}
`
Loading