[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] golang/xenlight: implement constructor generation
> NewDomainConfig() as of this patch can never return success, because > DomainConfig.fromC() will call DomainBuildInfo.fromC(), which will choke > on b_info.type = LIBXL_DOMAIN_TYPE_INVALID. > > This is actually a bug in to/fromC. Consider libxl_channelinfo. > > The idl says: > > libxl_channelinfo = Struct("channelinfo", [ > ("backend", string), > ("backend_id", uint32), > ("frontend", string), > ("frontend_id", uint32), > ("devid", libxl_devid), > ("state", integer), > ("evtch", integer), > ("rref", integer), > ("u", KeyedUnion(None, libxl_channel_connection, "connection", > [("unknown", None), > ("pty", Struct(None, [("path", string),])), > ("socket", None), > ])), > ], dir=DIR_OUT) > > But the generated code currently only generates: > > type Channelinfo struct { > Backend string > BackendId uint32 > Frontend string > FrontendId uint32 > Devid Devid > State intWhich means if libxl passes back > Evtch int > Rref int > Connection ChannelConnection > ConnectionUnion channelinfoConnectionUnion > } > > type channelinfoConnectionUnion interface { > ischannelinfoConnectionUnion() > } > > type ChannelinfoConnectionUnionPty struct { > Path string > } > > func (x ChannelinfoConnectionUnionPty) ischannelinfoConnectionUnion() {} > > I think this makes sense -- there's no need to have types for 'unknown' > and 'socket' just to hold nothing. But then the marshaling code looks > like this: > > switch x.Connection { > case ChannelConnectionPty: > tmp, ok := x.ConnectionUnion.(ChannelinfoConnectionUnionPty) > if !ok { > return errors.New("wrong type for union key > connection") > } > var pty C.libxl_channelinfo_connection_union_pty > if tmp.Path != "" { > pty.path = C.CString(tmp.Path) > } > ptyBytes := C.GoBytes(unsafe.Pointer(&pty), > C.sizeof_libxl_channelinfo_connection_union_pty) > copy(xc.u[:], ptyBytes) > default: > return fmt.Errorf("invalid union key '%v'", x.Connection) > } > > So this will incorrectly fail for for either 'unknown' or 'socket'. > What we need to have is for toC to ignore enumerated values that have > empty types, and fromC to set the union to `nil` in these cases. > > I've got a patch -- I'll send it out. Oh, yeah I see the problem in xenlight_golang_union_from_C -- it just continues in the loop if f.type is None to avoid defining another fromC, but should still should add a case in the switch statement. Good catch, thanks. -NR _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |