On 12/10/19 3:47 PM, Nick Rosbrook wrote:
> From: Nick Rosbrook <rosbro...@ainfosec.com>
> 
> Signed-off-by: Nick Rosbrook <rosbro...@ainfosec.com>
> ---
>  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
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to