Browse Source

bolt-gen: make optional 'assignable' fields work

make assignable 'optional' fields work, add test for them
pull/2938/head
lisa neigut 5 years ago
committed by Rusty Russell
parent
commit
236d26308f
  1. 2
      tools/gen/impl_template
  2. 10
      tools/generate-bolts.py
  3. 2
      tools/test/test_cases

2
tools/gen/impl_template

@ -303,7 +303,7 @@ bool fromwire_${msg.name}(${'const tal_t *ctx, ' if msg.needs_context() else ''}
% if not varsized: % if not varsized:
*${f.name} = tal(ctx, ${typename}); *${f.name} = tal(ctx, ${typename});
% endif % endif
${fromwire_phrase(f, type_, varsized)}\ ${'*' if f.type_obj.is_assignable() else ''}${fromwire_phrase(f, type_, varsized)}\
} }
% endif ## End optional % endif ## End optional
% endif % endif

10
tools/generate-bolts.py

@ -75,9 +75,6 @@ class Field(object):
def is_varlen(self): def is_varlen(self):
return not self.count return not self.count
def is_optional(self):
return self.is_optional
def is_extension(self): def is_extension(self):
return bool(self.extension_names) return bool(self.extension_names)
@ -97,7 +94,10 @@ class Field(object):
if self.is_array(): if self.is_array():
return ', const {} {}[{}]'.format(type_name, self.name, self.count) return ', const {} {}[{}]'.format(type_name, self.name, self.count)
if self.type_obj.is_assignable() and not self.is_varlen(): if self.type_obj.is_assignable() and not self.is_varlen():
return ', {} {}'.format(type_name, self.name) name = self.name
if self.is_optional:
name = '*' + name
return ', {} {}'.format(type_name, name)
if self.is_varlen() and self.type_obj.is_varsize(): if self.is_varlen() and self.type_obj.is_varsize():
return ', const {} **{}'.format(type_name, self.name) return ', const {} **{}'.format(type_name, self.name)
return ', const {} *{}'.format(type_name, self.name) return ', const {} *{}'.format(type_name, self.name)
@ -145,7 +145,7 @@ class FieldSet(object):
return bool(self.len_fields) return bool(self.len_fields)
def needs_context(self): def needs_context(self):
return any([field.needs_context() for field in self.fields.values()]) return any([field.needs_context() or field.is_optional for field in self.fields.values()])
class Type(FieldSet): class Type(FieldSet):

2
tools/test/test_cases

@ -31,6 +31,8 @@ msgdata,test_msg,test_enum,e:test_enum,
msgdata,test_msg,test_struct,test_short_id, msgdata,test_msg,test_struct,test_short_id,
# test var-size struct # test var-size struct
msgdata,test_msg,test_varsize_struct,test_features, msgdata,test_msg,test_varsize_struct,test_features,
# test optional assignable
msgdata,test_msg,test_optional_assignable,?u32,
# test optional struct # test optional struct
msgdata,test_msg,test_optional_struct,?test_short_id, msgdata,test_msg,test_optional_struct,?test_short_id,
# test optional var-size struct # test optional var-size struct

Loading…
Cancel
Save