diff --git a/tools/gen/impl_template b/tools/gen/impl_template index c540466c4..118d57a26 100644 --- a/tools/gen/impl_template +++ b/tools/gen/impl_template @@ -60,25 +60,32 @@ towire_${f.type_obj.name}(${ptr}, ${'' if f.type_obj.is_assignable() else '&'}${ if f.type_obj.is_varsize(): typename += ' *' %>\ -% if f.is_varlen(): -${fieldname} = ${f.size('*plen')} ? tal_arr(${ctx}, ${typename}, ${f.size('*plen')}) : NULL; -% endif % if f.is_array() or f.is_varlen(): % if f.type_obj.has_array_helper(): + ## We assume array helpers only deal with things literally transcribed!! + % if f.is_varlen(): +${fieldname} = ${f.size('*plen')} ? tal_arr(${ctx}, ${typename}, ${f.size('*plen')}) : NULL; + % endif fromwire_${type_}_array(cursor, plen, ${fieldname}, ${f.size('*plen')}); % else: + % if f.is_varlen(): +${fieldname} = ${f.size('*plen')} ? tal_arr(${ctx}, ${typename}, 0) : NULL; + % endif % if f.is_implicit_len(): - for (size_t i = 0; *plen != 0; i++) + for (size_t i = 0; *plen != 0; i++) { % else: - for (size_t i = 0; i < ${f.size()}; i++) + for (size_t i = 0; i < ${f.size()}; i++) { % endif + ${typename} tmp; % if f.type_obj.is_assignable(): - (${fieldname})[i] = fromwire_${type_}(cursor, plen); + tmp = fromwire_${type_}(cursor, plen); % elif f.is_varlen() and f.type_obj.is_varsize(): - (${fieldname})[i] = fromwire_${type_}(${ctx}, cursor, plen); + tmp = fromwire_${type_}(${ctx}, cursor, plen); % else: - fromwire_${type_}(cursor, plen, ${fieldname} + i); + fromwire_${type_}(cursor, plen, &tmp); % endif + tal_arr_expand(&${fieldname}, tmp); + } % endif % else: % if f.type_obj.is_assignable():