|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |