diff --git a/bind/gengo.go b/bind/gengo.go index c9fc952..67c9743 100644 --- a/bind/gengo.go +++ b/bind/gengo.go @@ -182,12 +182,18 @@ func (g *goGen) genStruct(obj *types.TypeName, T *types.Struct) { g.Printf("type proxy%s seq.Ref\n\n", obj.Name()) for _, f := range fields { + seqTyp := seqType(f.Type()) + g.Printf("func proxy%s%sSet(out, in *seq.Buffer) {\n", obj.Name(), f.Name()) g.Indent() g.Printf("ref := in.ReadRef()\n") - g.Printf("v := in.Read%s()\n", seqType(f.Type())) - // TODO(crawshaw): other kinds of non-ptr types. - g.Printf("ref.Get().(*%s.%s).%s = v\n", g.pkg.Name(), obj.Name(), f.Name()) + g.Printf("v := in.Read%s()\n", seqTyp) + if seqTyp == "Ref" { + g.Printf("ref.Get().(*%s.%s).%s = v.Get().(%s)\n", g.pkg.Name(), obj.Name(), f.Name(), g.typeString(f.Type())) + } else { + // TODO(crawshaw): other kinds of non-ptr types. + g.Printf("ref.Get().(*%s.%s).%s = v\n", g.pkg.Name(), obj.Name(), f.Name()) + } g.Outdent() g.Printf("}\n\n") @@ -195,7 +201,11 @@ func (g *goGen) genStruct(obj *types.TypeName, T *types.Struct) { g.Indent() g.Printf("ref := in.ReadRef()\n") g.Printf("v := ref.Get().(*%s.%s).%s\n", g.pkg.Name(), obj.Name(), f.Name()) - g.Printf("out.Write%s(v)\n", seqType(f.Type())) + if seqTyp == "Ref" { + g.Printf("out.WriteGoRef(v)\n") + } else { + g.Printf("out.Write%s(v)\n", seqTyp) + } g.Outdent() g.Printf("}\n\n") } diff --git a/bind/genjava.go b/bind/genjava.go index 236d4d1..a7af541 100644 --- a/bind/genjava.go +++ b/bind/genjava.go @@ -76,7 +76,11 @@ public void call(int code, go.Seq in, go.Seq out) { g.Printf("Seq out = new Seq();\n") g.Printf("in.writeRef(ref);\n") g.Printf("Seq.send(DESCRIPTOR, FIELD_%s_GET, in, out);\n", f.Name()) - g.Printf("return out.read%s;\n", seqRead(f.Type())) + if seqType(f.Type()) == "Ref" { + g.Printf("return new %s(out.read%s);\n", g.javaType(f.Type()), seqRead(f.Type())) + } else { + g.Printf("return out.read%s;\n", seqRead(f.Type())) + } g.Outdent() g.Printf("}\n\n") @@ -88,9 +92,8 @@ public void call(int code, go.Seq in, go.Seq out) { g.Printf("in.write%s;\n", seqWrite(f.Type(), "v")) g.Printf("Seq.send(DESCRIPTOR, FIELD_%s_SET, in, out);\n", f.Name()) g.Outdent() - g.Printf("}\n") + g.Printf("}\n\n") } - g.Printf("\n") for _, m := range methods { g.genFunc(m, true) diff --git a/bind/java/SeqTest.java b/bind/java/SeqTest.java index 6ad1986..0aee7e7 100644 --- a/bind/java/SeqTest.java +++ b/bind/java/SeqTest.java @@ -246,8 +246,15 @@ public class SeqTest extends AndroidTestCase { public void testUnnamedParams() { final String msg = "1234567"; - assertEquals("Want the length of \"1234567\" passed after unnamed params", + assertEquals("want the length of \"1234567\" passed after unnamed params", 7, Testpkg.UnnamedParams(10, 20, msg)); } + public void testPointerToStructAsField() { + Testpkg.Node a = Testpkg.NewNode("A"); + Testpkg.Node b = Testpkg.NewNode("B"); + a.setNext(b); + String got = a.String(); + assertEquals("want Node A points to Node B", "A:B:", got); + } } diff --git a/bind/java/testpkg/testpkg.go b/bind/java/testpkg/testpkg.go index 5b0c260..06b1536 100644 --- a/bind/java/testpkg/testpkg.go +++ b/bind/java/testpkg/testpkg.go @@ -124,3 +124,19 @@ func AppendToString(str string, someBytes []byte) []byte { func UnnamedParams(_, _ int, p0 string) int { return len(p0) } + +type Node struct { + V string + Next *Node +} + +func NewNode(name string) *Node { + return &Node{V: name} +} + +func (a *Node) String() string { + if a == nil { + return "" + } + return a.V + ":" + a.Next.String() +} diff --git a/bind/testdata/structs.java.golden b/bind/testdata/structs.java.golden index ced08fe..da65dea 100644 --- a/bind/testdata/structs.java.golden +++ b/bind/testdata/structs.java.golden @@ -42,6 +42,7 @@ public abstract class Structs { in.writeFloat64(v); Seq.send(DESCRIPTOR, FIELD_X_SET, in, out); } + public double getY() { Seq in = new Seq(); Seq out = new Seq();