diff --git a/capnpc-go/capnpc-go.go b/capnpc-go/capnpc-go.go index 1554edc..0903d6a 100644 --- a/capnpc-go/capnpc-go.go +++ b/capnpc-go/capnpc-go.go @@ -966,14 +966,31 @@ func (t Type) json(w io.Writer) { func (n *node) defineNewStructFunc(w io.Writer) { assert(n.Which() == NODE_STRUCT, "invalid struct node") - 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()) - 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()) - 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()) - fprintf(w, "func ReadRoot%s(s *C.Segment) %s { return %s(s.Root(0).ToStruct()) }\n", - n.name, n.name, n.name) + var ( + datasz = n.Struct().DataWordCount() * 8 + ptrs = n.Struct().PointerCount() + ) + if !disabledStructFunc { + fprintf(w, "func New%s(s *C.Segment) %s { return %s(s.NewStruct(%d, %d)) }\n", + 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, datasz, ptrs) + fprintf(w, "func AutoNew%s(s *C.Segment) %s { return %s(s.NewStructAR(%d, %d)) }\n", + 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) {\n", n.name) + fprintf(w, "\treturn %d, %d\n", datasz, ptrs) + fprintf(w, "}\n") + + fprintf(w, "func (s *%s) NewP(p C.Struct) *%s {\n", n.name, n.name) + fprintf(w, "\tv := %s(p)\n", n.name) + fprintf(w, "\treturn &v\n") + fprintf(w, "}\n") + } } func (n *node) defineStructList(w io.Writer) { @@ -1015,6 +1032,8 @@ var ( disabledCaplitUnarshal = false disabledUtil = false disabledBase = false + enabledStructInfo = false + disabledStructFunc = false ignorePrivateInfoField = false privateInfoField = map[string]bool{ "fbName": true, @@ -1041,6 +1060,12 @@ 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("GO_CAPNP_STRUCT_FUNC_DISABLE")); err == nil { + disabledStructFunc = disable + } if disable, err := strconv.ParseBool(os.Getenv("IGNORE_PRIVATE_INFO_FIELD")); err == nil { ignorePrivateInfoField = disable }