[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH for-4.14] golang/xenlight: fix code generation for python 2.6



> -----Original Message-----
> From: Nick Rosbrook <rosbrookn@xxxxxxxxx>
> Sent: 21 July 2020 00:55
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: paul@xxxxxxx; Nick Rosbrook <rosbrookn@xxxxxxxxxxxx>; George Dunlap 
> <george.dunlap@xxxxxxxxxx>;
> Ian Jackson <ian.jackson@xxxxxxxxxxxxx>; Wei Liu <wl@xxxxxxx>
> Subject: [PATCH for-4.14] golang/xenlight: fix code generation for python 2.6
> 
> Before python 2.7, str.format() calls required that the format fields
> were explicitly enumerated, e.g.:
> 
>   '{0} {1}'.format(foo, bar)
> 
>   vs.
> 
>   '{} {}'.format(foo, bar)
> 
> Currently, gengotypes.py uses the latter pattern everywhere, which means
> the Go bindings do not build on python 2.6. Use the 2.6 syntax for
> format() in order to support python 2.6 for now.
> 
> Signed-off-by: Nick Rosbrook <rosbrookn@xxxxxxxxxxxx>

I'm afraid this is too late for 4.14 now. We are in hard freeze, so only minor 
docs changes or critical bug fixes are being taken at
this point.

  Paul

> ---
>  tools/golang/xenlight/gengotypes.py | 204 ++++++++++++++--------------
>  1 file changed, 102 insertions(+), 102 deletions(-)
> 
> diff --git a/tools/golang/xenlight/gengotypes.py 
> b/tools/golang/xenlight/gengotypes.py
> index 557fecd07b..ebec938224 100644
> --- a/tools/golang/xenlight/gengotypes.py
> +++ b/tools/golang/xenlight/gengotypes.py
> @@ -3,7 +3,7 @@
>  import os
>  import sys
> 
> -sys.path.append('{}/tools/libxl'.format(os.environ['XEN_ROOT']))
> +sys.path.append('{0}/tools/libxl'.format(os.environ['XEN_ROOT']))
>  import idl
> 
>  # Go versions of some builtin types.
> @@ -73,14 +73,14 @@ def xenlight_golang_define_enum(ty = None):
> 
>      if ty.typename is not None:
>          typename = xenlight_golang_fmt_name(ty.typename)
> -        s += 'type {} int\n'.format(typename)
> +        s += 'type {0} int\n'.format(typename)
> 
>      # Start const block
>      s += 'const(\n'
> 
>      for v in ty.values:
>          name = xenlight_golang_fmt_name(v.name)
> -        s += '{} {} = {}\n'.format(name, typename, v.value)
> +        s += '{0} {1} = {2}\n'.format(name, typename, v.value)
> 
>      # End const block
>      s += ')\n'
> @@ -99,9 +99,9 @@ def xenlight_golang_define_struct(ty = None, typename = 
> None, nested = False):
> 
>      # Begin struct definition
>      if nested:
> -        s += '{} struct {{\n'.format(name)
> +        s += '{0} struct {{\n'.format(name)
>      else:
> -        s += 'type {} struct {{\n'.format(name)
> +        s += 'type {0} struct {{\n'.format(name)
> 
>      # Write struct fields
>      for f in ty.fields:
> @@ -111,13 +111,13 @@ def xenlight_golang_define_struct(ty = None, typename = 
> None, nested = False):
>                  typename = xenlight_golang_fmt_name(typename)
>                  name     = xenlight_golang_fmt_name(f.name)
> 
> -                s += '{} []{}\n'.format(name, typename)
> +                s += '{0} []{1}\n'.format(name, typename)
>              else:
>                  typename = f.type.typename
>                  typename = xenlight_golang_fmt_name(typename)
>                  name     = xenlight_golang_fmt_name(f.name)
> 
> -                s += '{} {}\n'.format(name, typename)
> +                s += '{0} {1}\n'.format(name, typename)
> 
>          elif isinstance(f.type, idl.Struct):
>              r = xenlight_golang_define_struct(f.type, typename=f.name, 
> nested=True)
> @@ -132,7 +132,7 @@ def xenlight_golang_define_struct(ty = None, typename = 
> None, nested = False):
>              extras.extend(r[1])
> 
>          else:
> -            raise Exception('type {} not supported'.format(f.type))
> +            raise Exception('type {0} not supported'.format(f.type))
> 
>      # End struct definition
>      s += '}\n'
> @@ -151,11 +151,11 @@ def xenlight_golang_define_union(ty = None, struct_name 
> = '', union_name = ''):
>      s = ''
>      extras = []
> 
> -    interface_name = '{}_{}_union'.format(struct_name, ty.keyvar.name)
> +    interface_name = '{0}_{1}_union'.format(struct_name, ty.keyvar.name)
>      interface_name = xenlight_golang_fmt_name(interface_name, exported=False)
> 
> -    s += 'type {} interface {{\n'.format(interface_name)
> -    s += 'is{}()\n'.format(interface_name)
> +    s += 'type {0} interface {{\n'.format(interface_name)
> +    s += 'is{0}()\n'.format(interface_name)
>      s += '}\n'
> 
>      extras.append(s)
> @@ -165,7 +165,7 @@ def xenlight_golang_define_union(ty = None, struct_name = 
> '', union_name = ''):
>              continue
> 
>          # Define struct
> -        name = '{}_{}_union_{}'.format(struct_name, ty.keyvar.name, f.name)
> +        name = '{0}_{1}_union_{2}'.format(struct_name, ty.keyvar.name, 
> f.name)
>          r = xenlight_golang_define_struct(f.type, typename=name)
>          extras.append(r[0])
>          extras.extend(r[1])
> @@ -173,21 +173,21 @@ def xenlight_golang_define_union(ty = None, struct_name 
> = '', union_name = ''):
>          # This typeof trick ensures that the fields used in the cgo struct
>          # used for marshaling are the same as the fields of the union in the
>          # actual C type, and avoids re-defining all of those fields.
> -        s = 'typedef typeof(((struct {} *)NULL)->{}.{}){};'
> +        s = 'typedef typeof(((struct {0} *)NULL)->{1}.{2}){3};'
>          s = s.format(struct_name, union_name, f.name, name)
>          cgo_helpers_preamble.append(s)
> 
>          # Define function to implement 'union' interface
>          name = xenlight_golang_fmt_name(name)
> -        s = 'func (x {}) is{}(){{}}\n'.format(name, interface_name)
> +        s = 'func (x {0}) is{1}(){{}}\n'.format(name, interface_name)
>          extras.append(s)
> 
>      fname = xenlight_golang_fmt_name(ty.keyvar.name)
>      ftype = xenlight_golang_fmt_name(ty.keyvar.type.typename)
> -    s = '{} {}\n'.format(fname, ftype)
> +    s = '{0} {1}\n'.format(fname, ftype)
> 
> -    fname = xenlight_golang_fmt_name('{}_union'.format(ty.keyvar.name))
> -    s += '{} {}\n'.format(fname, interface_name)
> +    fname = xenlight_golang_fmt_name('{0}_union'.format(ty.keyvar.name))
> +    s += '{0} {1}\n'.format(fname, interface_name)
> 
>      return (s,extras)
> 
> @@ -243,7 +243,7 @@ def xenlight_golang_define_from_C(ty = None):
>      Define the fromC marshaling function for the type
>      represented by ty.
>      """
> -    func = 'func (x *{}) fromC(xc *C.{}) error {{\n {}\n return nil}}\n'
> +    func = 'func (x *{0}) fromC(xc *C.{1}) error {{\n {2}\n return nil}}\n'
> 
>      goname = xenlight_golang_fmt_name(ty.typename)
>      cname  = ty.typename
> @@ -271,7 +271,7 @@ def xenlight_golang_define_from_C(ty = None):
>              extras.extend(r[1])
> 
>          else:
> -            raise Exception('type {} not supported'.format(f.type))
> +            raise Exception('type {0} not supported'.format(f.type))
> 
>      return (func.format(goname, cname, body), extras)
> 
> @@ -300,8 +300,8 @@ def xenlight_golang_convert_from_C(ty = None, outer_name 
> = None, cvarname = None
> 
>      # If outer_name is set, treat this as nested.
>      if outer_name is not None:
> -        goname = '{}.{}'.format(xenlight_golang_fmt_name(outer_name), goname)
> -        cname  = '{}.{}'.format(outer_name, cname)
> +        goname = '{0}.{1}'.format(xenlight_golang_fmt_name(outer_name), 
> goname)
> +        cname  = '{0}.{1}'.format(outer_name, cname)
> 
>      # Types that satisfy this condition can be easily casted or
>      # converted to a Go builtin type.
> @@ -312,15 +312,15 @@ def xenlight_golang_convert_from_C(ty = None, 
> outer_name = None, cvarname = None
>      if not is_castable:
>          # If the type is not castable, we need to call its fromC
>          # function.
> -        s += 'if err := x.{}.fromC(&{}.{});'.format(goname,cvarname,cname)
> -        s += 'err != nil {{\nreturn fmt.Errorf("converting field {}: %v", 
> err)\n}}\n'.format(goname)
> +        s += 'if err := x.{0}.fromC(&{1}.{2});'.format(goname,cvarname,cname)
> +        s += 'err != nil {{\nreturn fmt.Errorf("converting field {0}: %v", 
> err)\n}}\n'.format(goname)
> 
>      elif gotypename == 'string':
>          # Use the cgo helper for converting C strings.
> -        s += 'x.{} = C.GoString({}.{})\n'.format(goname,cvarname,cname)
> +        s += 'x.{0} = C.GoString({1}.{2})\n'.format(goname,cvarname,cname)
> 
>      else:
> -        s += 'x.{} = {}({}.{})\n'.format(goname,gotypename,cvarname,cname)
> +        s += 'x.{0} = 
> {1}({2}.{3})\n'.format(goname,gotypename,cvarname,cname)
> 
>      return s
> 
> @@ -331,9 +331,9 @@ def xenlight_golang_union_from_C(ty = None, union_name = 
> '', struct_name = ''):
>      gokeyname = xenlight_golang_fmt_name(keyname)
>      keytype   = ty.keyvar.type.typename
>      gokeytype = xenlight_golang_fmt_name(keytype)
> -    field_name = xenlight_golang_fmt_name('{}_union'.format(keyname))
> +    field_name = xenlight_golang_fmt_name('{0}_union'.format(keyname))
> 
> -    interface_name = '{}_{}_union'.format(struct_name, keyname)
> +    interface_name = '{0}_{1}_union'.format(struct_name, keyname)
>      interface_name = xenlight_golang_fmt_name(interface_name, exported=False)
> 
>      cgo_keyname = keyname
> @@ -343,7 +343,7 @@ def xenlight_golang_union_from_C(ty = None, union_name = 
> '', struct_name = ''):
>      cases = {}
> 
>      for f in ty.fields:
> -        val = '{}_{}'.format(keytype, f.name)
> +        val = '{0}_{1}'.format(keytype, f.name)
>          val = xenlight_golang_fmt_name(val)
> 
>          # Add to list of cases to make for the switch
> @@ -354,17 +354,17 @@ def xenlight_golang_union_from_C(ty = None, union_name 
> = '', struct_name = ''):
>              continue
> 
>          # Define fromC func for 'union' struct.
> -        typename   = '{}_{}_union_{}'.format(struct_name,keyname,f.name)
> +        typename   = '{0}_{1}_union_{2}'.format(struct_name,keyname,f.name)
>          gotypename = xenlight_golang_fmt_name(typename)
> 
>          # Define the function here. The cases for keyed unions are a little
>          # different.
> -        s = 'func (x *{}) fromC(xc *C.{}) error 
> {{\n'.format(gotypename,struct_name)
> -        s += 'if {}(xc.{}) != {} {{\n'.format(gokeytype,cgo_keyname,val)
> -        err_string = '"expected union key {}"'.format(val)
> -        s += 'return errors.New({})\n'.format(err_string)
> +        s = 'func (x *{0}) fromC(xc *C.{1}) error 
> {{\n'.format(gotypename,struct_name)
> +        s += 'if {0}(xc.{1}) != {2} {{\n'.format(gokeytype,cgo_keyname,val)
> +        err_string = '"expected union key {0}"'.format(val)
> +        s += 'return errors.New({0})\n'.format(err_string)
>          s += '}\n\n'
> -        s += 'tmp := 
> (*C.{})(unsafe.Pointer(&xc.{}[0]))\n'.format(typename,union_name)
> +        s += 'tmp := 
> (*C.{0})(unsafe.Pointer(&xc.{1}[0]))\n'.format(typename,union_name)
> 
>          for nf in f.type.fields:
>              s += xenlight_golang_convert_from_C(nf,cvarname='tmp')
> @@ -374,35 +374,35 @@ def xenlight_golang_union_from_C(ty = None, union_name 
> = '', struct_name = ''):
> 
>          extras.append(s)
> 
> -    s = 'x.{} = {}(xc.{})\n'.format(gokeyname,gokeytype,cgo_keyname)
> -    s += 'switch x.{}{{\n'.format(gokeyname)
> +    s = 'x.{0} = {1}(xc.{2})\n'.format(gokeyname,gokeytype,cgo_keyname)
> +    s += 'switch x.{0}{{\n'.format(gokeyname)
> 
>      # Create switch statement to determine which 'union element'
>      # to populate in the Go struct.
>      for case_name, case_tuple in sorted(cases.items()):
>          (case_val, case_type) = case_tuple
> 
> -        s += 'case {}:\n'.format(case_val)
> +        s += 'case {0}:\n'.format(case_val)
> 
>          if case_type is None:
> -            s += "x.{} = nil\n".format(field_name)
> +            s += "x.{0} = nil\n".format(field_name)
>              continue
> 
> -        gotype = '{}_{}_union_{}'.format(struct_name,keyname,case_name)
> +        gotype = '{0}_{1}_union_{2}'.format(struct_name,keyname,case_name)
>          gotype = xenlight_golang_fmt_name(gotype)
> -        goname = '{}_{}'.format(keyname,case_name)
> +        goname = '{0}_{1}'.format(keyname,case_name)
>          goname = xenlight_golang_fmt_name(goname,exported=False)
> 
> -        s += 'var {} {}\n'.format(goname, gotype)
> -        s += 'if err := {}.fromC(xc);'.format(goname)
> -        s += 'err != nil {{\n return fmt.Errorf("converting field {}: %v", 
> err)\n}}\n'.format(goname)
> +        s += 'var {0} {1}\n'.format(goname, gotype)
> +        s += 'if err := {0}.fromC(xc);'.format(goname)
> +        s += 'err != nil {{\n return fmt.Errorf("converting field {0}: %v",
> err)\n}}\n'.format(goname)
> 
> -        s += 'x.{} = {}\n'.format(field_name, goname)
> +        s += 'x.{0} = {1}\n'.format(field_name, goname)
> 
>      # End switch statement
>      s += 'default:\n'
> -    err_string = '"invalid union key \'%v\'", x.{}'.format(gokeyname)
> -    s += 'return fmt.Errorf({})'.format(err_string)
> +    err_string = '"invalid union key \'%v\'", x.{0}'.format(gokeyname)
> +    s += 'return fmt.Errorf({0})'.format(err_string)
>      s += '}\n'
> 
>      return (s,extras)
> @@ -420,22 +420,22 @@ def xenlight_golang_array_from_C(ty = None):
>      goname     = xenlight_golang_fmt_name(ty.name)
>      ctypename  = ty.type.elem_type.typename
>      cname      = ty.name
> -    cslice     = 'c{}'.format(goname)
> +    cslice     = 'c{0}'.format(goname)
>      clenvar    = ty.type.lenvar.name
> 
> -    s += 'x.{} = nil\n'.format(goname)
> -    s += 'if n := int(xc.{}); n > 0 {{\n'.format(clenvar)
> -    s += '{} := '.format(cslice)
> -    s +='(*[1<<28]C.{})(unsafe.Pointer(xc.{}))[:n:n]\n'.format(ctypename, 
> cname)
> -    s += 'x.{} = make([]{}, n)\n'.format(goname, gotypename)
> -    s += 'for i, v := range {} {{\n'.format(cslice)
> +    s += 'x.{0} = nil\n'.format(goname)
> +    s += 'if n := int(xc.{0}); n > 0 {{\n'.format(clenvar)
> +    s += '{0} := '.format(cslice)
> +    s +='(*[1<<28]C.{0})(unsafe.Pointer(xc.{1}))[:n:n]\n'.format(ctypename, 
> cname)
> +    s += 'x.{0} = make([]{1}, n)\n'.format(goname, gotypename)
> +    s += 'for i, v := range {0} {{\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)
> +        s += 'x.{0}[i] = {1}(v)\n'.format(goname, gotypename)
>      else:
> -        s += 'if err := x.{}[i].fromC(&v); err != nil {{\n'.format(goname)
> -        s += 'return fmt.Errorf("converting field {}: %v", err) 
> }}\n'.format(goname)
> +        s += 'if err := x.{0}[i].fromC(&v); err != nil {{\n'.format(goname)
> +        s += 'return fmt.Errorf("converting field {0}: %v", err) 
> }}\n'.format(goname)
> 
>      s += '}\n}\n'
> 
> @@ -446,11 +446,11 @@ def xenlight_golang_define_to_C(ty = None, typename = 
> None, nested = False):
>      Define the toC marshaling function for the type
>      represented by ty.
>      """
> -    func = 'func (x *{}) toC(xc *C.{}) (err error){{{}\n return nil\n }}\n'
> +    func = 'func (x *{0}) toC(xc *C.{1}) (err error){{{2}\n return nil\n 
> }}\n'
>      body = ''
> 
>      if ty.dispose_fn is not None:
> -        body += 'defer func(){{\nif err != 
> nil{{\nC.{}(xc)}}\n}}()\n\n'.format(ty.dispose_fn)
> +        body += 'defer func(){{\nif err != 
> nil{{\nC.{0}(xc)}}\n}}()\n\n'.format(ty.dispose_fn)
> 
>      goname = xenlight_golang_fmt_name(ty.typename)
>      cname  = ty.typename
> @@ -471,7 +471,7 @@ def xenlight_golang_define_to_C(ty = None, typename = 
> None, nested = False):
>              body += xenlight_golang_union_to_C(f.type, f.name, ty.typename)
> 
>          else:
> -            raise Exception('type {} not supported'.format(f.type))
> +            raise Exception('type {0} not supported'.format(f.type))
> 
>      return func.format(goname, cname, body)
> 
> @@ -506,26 +506,26 @@ def xenlight_golang_convert_to_C(ty = None, outer_name 
> = None,
> 
>      # If outer_name is set, treat this as nested.
>      if outer_name is not None:
> -        goname = '{}.{}'.format(xenlight_golang_fmt_name(outer_name), goname)
> -        cname  = '{}.{}'.format(outer_name, cname)
> +        goname = '{0}.{1}'.format(xenlight_golang_fmt_name(outer_name), 
> goname)
> +        cname  = '{0}.{1}'.format(outer_name, cname)
> 
>      is_castable = (ty.type.json_parse_type == 'JSON_INTEGER' or
>                     isinstance(ty.type, idl.Enumeration) or
>                     gotypename in go_builtin_types)
> 
>      if not is_castable:
> -        s += 'if err := {}.{}.toC(&{}.{}); err != nil 
> {{\n'.format(govarname,goname,
> +        s += 'if err := {0}.{1}.toC(&{2}.{3}); err != nil 
> {{\n'.format(govarname,goname,
>                                                                     
> cvarname,cname)
> -        s += 'return fmt.Errorf("converting field {}: %v", 
> err)\n}}\n'.format(goname)
> +        s += 'return fmt.Errorf("converting field {0}: %v", 
> err)\n}}\n'.format(goname)
> 
>      elif gotypename == 'string':
>          # Use the cgo helper for converting C strings.
> -        s += 'if {}.{} != "" {{\n'.format(govarname,goname)
> -        s += '{}.{} = C.CString({}.{})}}\n'.format(cvarname,cname,
> +        s += 'if {0}.{1} != "" {{\n'.format(govarname,goname)
> +        s += '{0}.{1} = C.CString({2}.{3})}}\n'.format(cvarname,cname,
>                                                     govarname,goname)
> 
>      else:
> -        s += '{}.{} = C.{}({}.{})\n'.format(cvarname,cname,ctypename,
> +        s += '{0}.{1} = C.{2}({3}.{4})\n'.format(cvarname,cname,ctypename,
>                                              govarname,goname)
> 
>      return s
> @@ -537,7 +537,7 @@ def xenlight_golang_union_to_C(ty = None, union_name = '',
>      keytype   = ty.keyvar.type.typename
>      gokeytype = xenlight_golang_fmt_name(keytype)
> 
> -    interface_name = '{}_{}_union'.format(struct_name, keyname)
> +    interface_name = '{0}_{1}_union'.format(struct_name, keyname)
>      interface_name = xenlight_golang_fmt_name(interface_name, exported=False)
> 
>      cgo_keyname = keyname
> @@ -545,44 +545,44 @@ def xenlight_golang_union_to_C(ty = None, union_name = 
> '',
>          cgo_keyname = '_' + cgo_keyname
> 
> 
> -    s = 'xc.{} = C.{}(x.{})\n'.format(cgo_keyname,keytype,gokeyname)
> -    s += 'switch x.{}{{\n'.format(gokeyname)
> +    s = 'xc.{0} = C.{1}(x.{2})\n'.format(cgo_keyname,keytype,gokeyname)
> +    s += 'switch x.{0}{{\n'.format(gokeyname)
> 
>      # Create switch statement to determine how to populate the C union.
>      for f in ty.fields:
> -        key_val = '{}_{}'.format(keytype, f.name)
> +        key_val = '{0}_{1}'.format(keytype, f.name)
>          key_val = xenlight_golang_fmt_name(key_val)
> 
> -        s += 'case {}:\n'.format(key_val)
> +        s += 'case {0}:\n'.format(key_val)
> 
>          if f.type is None:
>              s += "break\n"
>              continue
> 
> -        cgotype = '{}_{}_union_{}'.format(struct_name,keyname,f.name)
> +        cgotype = '{0}_{1}_union_{2}'.format(struct_name,keyname,f.name)
>          gotype  = xenlight_golang_fmt_name(cgotype)
> 
> -        field_name = xenlight_golang_fmt_name('{}_union'.format(keyname))
> -        s += 'tmp, ok := x.{}.({})\n'.format(field_name,gotype)
> +        field_name = xenlight_golang_fmt_name('{0}_union'.format(keyname))
> +        s += 'tmp, ok := x.{0}.({1})\n'.format(field_name,gotype)
>          s += 'if !ok {\n'
> -        s += 'return errors.New("wrong type for union key 
> {}")\n'.format(keyname)
> +        s += 'return errors.New("wrong type for union key 
> {0}")\n'.format(keyname)
>          s += '}\n'
> 
> -        s += 'var {} C.{}\n'.format(f.name,cgotype)
> +        s += 'var {0} C.{1}\n'.format(f.name,cgotype)
>          for uf in f.type.fields:
>              s += xenlight_golang_convert_to_C(uf,cvarname=f.name,
>                                                govarname='tmp')
> 
>          # The union is still represented as Go []byte.
> -        s += '{}Bytes := 
> C.GoBytes(unsafe.Pointer(&{}),C.sizeof_{})\n'.format(f.name,
> +        s += '{0}Bytes := 
> C.GoBytes(unsafe.Pointer(&{1}),C.sizeof_{2})\n'.format(f.name,
>                                                                               
>  f.name,
>                                                                               
>  cgotype)
> -        s += 'copy(xc.{}[:],{}Bytes)\n'.format(union_name,f.name)
> +        s += 'copy(xc.{0}[:],{1}Bytes)\n'.format(union_name,f.name)
> 
>      # End switch statement
>      s += 'default:\n'
> -    err_string = '"invalid union key \'%v\'", x.{}'.format(gokeyname)
> -    s += 'return fmt.Errorf({})'.format(err_string)
> +    err_string = '"invalid union key \'%v\'", x.{0}'.format(gokeyname)
> +    s += 'return fmt.Errorf({0})'.format(err_string)
>      s += '}\n'
> 
>      return s
> @@ -599,29 +599,29 @@ def xenlight_golang_array_to_C(ty = None):
> 
>      is_enum = isinstance(ty.type.elem_type,idl.Enumeration)
>      if gotypename in go_builtin_types or is_enum:
> -        s += 'if {} := len(x.{}); {} > 0 
> {{\n'.format(golenvar,goname,golenvar)
> -        s += 'xc.{} = 
> (*C.{})(C.malloc(C.size_t({}*{})))\n'.format(cname,ctypename,
> +        s += 'if {0} := len(x.{1}); {2} > 0 
> {{\n'.format(golenvar,goname,golenvar)
> +        s += 'xc.{0} = 
> (*C.{1})(C.malloc(C.size_t({2}*{3})))\n'.format(cname,ctypename,
>                                                                     
> golenvar,golenvar)
> -        s += 'xc.{} = C.int({})\n'.format(clenvar,golenvar)
> -        s += 'c{} := 
> (*[1<<28]C.{})(unsafe.Pointer(xc.{}))[:{}:{}]\n'.format(goname,
> +        s += 'xc.{0} = C.int({1})\n'.format(clenvar,golenvar)
> +        s += 'c{0} := 
> (*[1<<28]C.{1})(unsafe.Pointer(xc.{2}))[:{3}:{4}]\n'.format(goname,
>                                                                        
> ctypename,cname,
>                                                                        
> golenvar,golenvar)
> -        s += 'for i,v := range x.{} {{\n'.format(goname)
> -        s += 'c{}[i] = C.{}(v)\n'.format(goname,ctypename)
> +        s += 'for i,v := range x.{0} {{\n'.format(goname)
> +        s += 'c{0}[i] = C.{1}(v)\n'.format(goname,ctypename)
>          s += '}\n}\n'
> 
>          return s
> 
> -    s += 'if {} := len(x.{}); {} > 0 {{\n'.format(golenvar,goname,golenvar)
> -    s += 'xc.{} = 
> (*C.{})(C.malloc(C.ulong({})*C.sizeof_{}))\n'.format(cname,ctypename,
> +    s += 'if {0} := len(x.{1}); {2} > 0 
> {{\n'.format(golenvar,goname,golenvar)
> +    s += 'xc.{0} = 
> (*C.{1})(C.malloc(C.ulong({2})*C.sizeof_{3}))\n'.format(cname,ctypename,
>                                                                     
> golenvar,ctypename)
> -    s += 'xc.{} = C.int({})\n'.format(clenvar,golenvar)
> -    s += 'c{} := 
> (*[1<<28]C.{})(unsafe.Pointer(xc.{}))[:{}:{}]\n'.format(goname,
> +    s += 'xc.{0} = C.int({1})\n'.format(clenvar,golenvar)
> +    s += 'c{0} := 
> (*[1<<28]C.{1})(unsafe.Pointer(xc.{2}))[:{3}:{4}]\n'.format(goname,
>                                                                           
> ctypename,cname,
>                                                                           
> golenvar,golenvar)
> -    s += 'for i,v := range x.{} {{\n'.format(goname)
> -    s += 'if err := v.toC(&c{}[i]); err != nil {{\n'.format(goname)
> -    s += 'return fmt.Errorf("converting field {}: %v", err)\n'.format(goname)
> +    s += 'for i,v := range x.{0} {{\n'.format(goname)
> +    s += 'if err := v.toC(&c{0}[i]); err != nil {{\n'.format(goname)
> +    s += 'return fmt.Errorf("converting field {0}: %v", 
> err)\n'.format(goname)
>      s += '}\n}\n}\n'
> 
>      return s
> @@ -633,7 +633,7 @@ def xenlight_golang_define_constructor(ty = None):
>      gotypename = xenlight_golang_fmt_name(ctypename)
> 
>      # Since this func is exported, add a comment as per Go conventions.
> -    s += '// New{} returns an instance of {}'.format(gotypename,gotypename)
> +    s += '// New{0} returns an instance of {1}'.format(gotypename,gotypename)
>      s += ' initialized with defaults.\n'
> 
>      # If a struct has a keyed union, an extra argument is
> @@ -643,7 +643,7 @@ def xenlight_golang_define_constructor(ty = None):
>      init_fns = []
> 
>      # Add call to parent init_fn first.
> -    init_fns.append('C.{}(&xc)'.format(ty.init_fn))
> +    init_fns.append('C.{0}(&xc)'.format(ty.init_fn))
> 
>      for f in ty.fields:
>          if not isinstance(f.type, idl.KeyedUnion):
> @@ -658,24 +658,24 @@ def xenlight_golang_define_constructor(ty = None):
>          # Serveral keyed unions use 'type' as the key variable name. In
>          # that case, prepend the first letter of the Go type name.
>          if param_goname == 'type':
> -            param_goname = '{}type'.format(param_gotype.lower()[0])
> +            param_goname = '{0}type'.format(param_gotype.lower()[0])
> 
>          # Add call to keyed union's init_fn.
> -        init_fns.append('C.{}_{}(&xc, C.{}({}))'.format(ty.init_fn,
> +        init_fns.append('C.{0}_{1}(&xc, C.{2}({3}))'.format(ty.init_fn,
>                                                          param.name,
>                                                          param_ctype,
>                                                          param_goname))
> 
>          # Add to params list.
> -        params.append('{} {}'.format(param_goname, param_gotype))
> +        params.append('{0} {1}'.format(param_goname, param_gotype))
> 
>      # Define function
> -    s += 'func New{}({}) (*{}, error) {{\n'.format(gotypename,
> +    s += 'func New{0}({1}) (*{2}, error) {{\n'.format(gotypename,
>                                                     ','.join(params),
>                                                     gotypename)
> 
>      # Declare variables.
> -    s += 'var (\nx {}\nxc C.{})\n\n'.format(gotypename, ctypename)
> +    s += 'var (\nx {0}\nxc C.{1})\n\n'.format(gotypename, ctypename)
> 
>      # Write init_fn calls.
>      s += '\n'.join(init_fns)
> @@ -684,7 +684,7 @@ def xenlight_golang_define_constructor(ty = None):
>      # Make sure dispose_fn get's called when constructor
>      # returns.
>      if ty.dispose_fn is not None:
> -        s += 'defer C.{}(&xc)\n'.format(ty.dispose_fn)
> +        s += 'defer C.{0}(&xc)\n'.format(ty.dispose_fn)
> 
>      s += '\n'
> 
> @@ -727,7 +727,7 @@ if __name__ == '__main__':
>      header_comment="""// DO NOT EDIT.
>  //
>  // This file is generated by:
> -// {}
> +// {0}
>  //
> 
>  """.format(' '.join(sys.argv))
> --
> 2.17.1





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.