diff --git a/capnpc-go/capnpc-go.go b/capnpc-go/capnpc-go.go index 1554edc..56a3d83 100644 --- a/capnpc-go/capnpc-go.go +++ b/capnpc-go/capnpc-go.go @@ -966,14 +966,25 @@ func (t Type) json(w io.Writer) { func (n *node) defineNewStructFunc(w io.Writer) { assert(n.Which() == NODE_STRUCT, "invalid struct node") + var ( + datasz = n.Struct().DataWordCount() * 8 + ptrs = n.Struct().PointerCount() + ) fprintf(w, "func New%s(s *C.Segment) %s { return %s(s.NewStruct(%d, %d)) }\n", - n.name, n.name, n.name, n.Struct().DataWordCount()*8, n.Struct().PointerCount()) + n.name, n.name, n.name, datasz, ptrs) fprintf(w, "func NewRoot%s(s *C.Segment) %s { return %s(s.NewRootStruct(%d, %d)) }\n", - n.name, n.name, n.name, n.Struct().DataWordCount()*8, n.Struct().PointerCount()) + n.name, n.name, n.name, datasz, ptrs) fprintf(w, "func AutoNew%s(s *C.Segment) %s { return %s(s.NewStructAR(%d, %d)) }\n", - n.name, n.name, n.name, n.Struct().DataWordCount()*8, n.Struct().PointerCount()) + n.name, n.name, n.name, datasz, ptrs) fprintf(w, "func ReadRoot%s(s *C.Segment) %s { return %s(s.Root(0).ToStruct()) }\n", n.name, n.name, n.name) + + if enabledStructInfo { + fprintf(w, "func (s *%s) StructInfo() (int, int) { return %d, %d }\n", + n.name, datasz, ptrs) + fprintf(w, "func (s *%s) NewP(p C.Struct) *%s {\nv := %s(p)\nreturn &v\n}\n", + n.name, n.name, n.name) + } } func (n *node) defineStructList(w io.Writer) { @@ -1015,6 +1026,7 @@ var ( disabledCaplitUnarshal = false disabledUtil = false disabledBase = false + enabledStructInfo = false ignorePrivateInfoField = false privateInfoField = map[string]bool{ "fbName": true, @@ -1041,6 +1053,9 @@ func init() { if disable, err := strconv.ParseBool(os.Getenv("GO_CAPNP_BASE_DISABLE")); err == nil { disabledBase = disable } + if enable, err := strconv.ParseBool(os.Getenv("GO_CAPNP_STRUCT_INFO_ENABLE")); err == nil { + enabledStructInfo = enable + } if disable, err := strconv.ParseBool(os.Getenv("IGNORE_PRIVATE_INFO_FIELD")); err == nil { ignorePrivateInfoField = disable }