On 12/10/19 3:47 PM, Nick Rosbrook wrote:
> From: Nick Rosbrook <[email protected]>
>
> Signed-off-by: Nick Rosbrook <[email protected]>
> ---
> tools/golang/xenlight/gengotypes.py | 39 +++-
> tools/golang/xenlight/helpers.gen.go | 300 +++++++++++++++++++++++++++
> 2 files changed, 338 insertions(+), 1 deletion(-)
>
> diff --git a/tools/golang/xenlight/gengotypes.py
> b/tools/golang/xenlight/gengotypes.py
> index b68c1aa66b..ee9aaf9eff 100644
> --- a/tools/golang/xenlight/gengotypes.py
> +++ b/tools/golang/xenlight/gengotypes.py
> @@ -252,7 +252,7 @@ def xenlight_golang_define_from_C(ty = None):
> for f in ty.fields:
> if f.type.typename is not None:
> if isinstance(f.type, idl.Array):
> - # TODO
> + body += xenlight_golang_array_from_C(f)
> continue
>
> body += xenlight_golang_convert_from_C(f)
> @@ -399,6 +399,43 @@ def xenlight_golang_union_from_C(ty = None, union_name =
> '', struct_name = ''):
>
> return (s,extras)
>
> +def xenlight_golang_array_from_C(ty = None):
> + """
> + Convert C array to Go slice using the method
> + described here:
> +
> + https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices
> + """
> + s = ''
> +
> + gotypename = xenlight_golang_fmt_name(ty.type.elem_type.typename)
> + goname = xenlight_golang_fmt_name(ty.name)
> + ctypename = ty.type.elem_type.typename
> + cname = ty.name
> + cslice = 'c{}'.format(goname)
> + clenvar = ty.type.lenvar.name
> + golenvar = xenlight_golang_fmt_name(clenvar,exported=False)
> +
> + s += '{} := int(xc.{})\n'.format(golenvar, clenvar)
> + s += '{} := '.format(cslice)
> + s +='(*[1<<28]C.{})(unsafe.Pointer(xc.{}))[:{}:{}]\n'.format(ctypename,
> cname,
> + golenvar,
> golenvar)
> + s += 'x.{} = make([]{}, {})\n'.format(goname, gotypename, golenvar)
> + s += 'for i, v := range {} {{\n'.format(cslice)
> +
> + is_enum = isinstance(ty.type.elem_type,idl.Enumeration)
> + if gotypename in go_builtin_types or is_enum:
> + s += 'x.{}[i] = {}(v)\n'.format(goname, gotypename)
> + else:
> + s += 'var e {}\n'.format(gotypename)
> + s += 'if err := e.fromC(&v); err != nil {\n'
> + s += 'return err }\n'
> + s += 'x.{}[i] = e\n'.format(goname)
> +
> + s += '}\n'
> +
> + return s
> +
> def xenlight_golang_fmt_name(name, exported = True):
> """
> Take a given type name and return an
> diff --git a/tools/golang/xenlight/helpers.gen.go
> b/tools/golang/xenlight/helpers.gen.go
> index e6eee234c0..2f917cac58 100644
> --- a/tools/golang/xenlight/helpers.gen.go
> +++ b/tools/golang/xenlight/helpers.gen.go
> @@ -263,6 +263,16 @@ func (x *SchedParams) fromC(xc *C.libxl_sched_params)
> error {
>
> func (x *VcpuSchedParams) fromC(xc *C.libxl_vcpu_sched_params) error {
> x.Sched = Scheduler(xc.sched)
> + numVcpus := int(xc.num_vcpus)
> + cVcpus := (*[1 <<
> 28]C.libxl_sched_params)(unsafe.Pointer(xc.vcpus))[:numVcpus:numVcpus]
> + x.Vcpus = make([]SchedParams, numVcpus)
> + for i, v := range cVcpus {
> + var e SchedParams
> + if err := e.fromC(&v); err != nil {
> + return err
> + }
> + x.Vcpus[i] = e
Along the same lines, any reason not to do the following?
if err := x.Vcpus[i].fromC(&v); err != nil {
return err
}
Everything else looks good.
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel