@ -31,6 +31,10 @@ class FieldType(object):
def is_assignable ( self ) :
def is_assignable ( self ) :
return self . name in [ ' u8 ' , ' u16 ' , ' u32 ' , ' u64 ' , ' bool ' ]
return self . name in [ ' u8 ' , ' u16 ' , ' u32 ' , ' u64 ' , ' bool ' ]
# We only accelerate the u8 case: it's common and trivial.
def has_array_helper ( self ) :
return self . name in [ ' u8 ' ]
# Returns base size
# Returns base size
@staticmethod
@staticmethod
def _typesize ( typename ) :
def _typesize ( typename ) :
@ -127,6 +131,9 @@ class Field(object):
return False
return False
return self . fieldtype . is_assignable ( )
return self . fieldtype . is_assignable ( )
def has_array_helper ( self ) :
return self . fieldtype . has_array_helper ( )
# Returns FieldType
# Returns FieldType
@staticmethod
@staticmethod
def _guess_type ( message , fieldname , base_size ) :
def _guess_type ( message , fieldname , base_size ) :
@ -209,6 +216,20 @@ class Message(object):
self . has_variable_fields = True
self . has_variable_fields = True
self . fields . append ( field )
self . fields . append ( field )
def print_fromwire_array ( self , subcalls , basetype , f , name , num_elems ) :
if f . has_array_helper ( ) :
subcalls . append ( ' \t fromwire_ {} _array(&cursor, plen, {} , {} ); '
. format ( basetype , name , num_elems ) )
else :
subcalls . append ( ' \t for (size_t i = 0; i < {} ; i++) '
. format ( num_elems ) )
if f . is_assignable ( ) :
subcalls . append ( ' \t \t {} [i] = fromwire_ {} (&cursor, plen); '
. format ( name , basetype ) )
else :
subcalls . append ( ' \t \t fromwire_ {} (&cursor, plen, {} + i); '
. format ( basetype , name ) )
def print_fromwire ( self , is_header ) :
def print_fromwire ( self , is_header ) :
ctx_arg = ' const tal_t *ctx, ' if self . has_variable_fields else ' '
ctx_arg = ' const tal_t *ctx, ' if self . has_variable_fields else ' '
@ -240,15 +261,15 @@ class Message(object):
subcalls . append ( ' \t fromwire_pad(&cursor, plen, {} ); '
subcalls . append ( ' \t fromwire_pad(&cursor, plen, {} ); '
. format ( f . num_elems ) )
. format ( f . num_elems ) )
elif f . is_array ( ) :
elif f . is_array ( ) :
subcalls . append ( " \t //1th case {name} " . format ( name = f . name ) )
self . print_fromwire_array ( subcalls , basetype , f , f . name ,
subcalls . append ( ' \t fromwire_ {} _array(&cursor, plen, {} , {} ); '
f . num_elems )
. format ( basetype , f . name , f . num_elems ) )
elif f . is_variable_size ( ) :
elif f . is_variable_size ( ) :
subcalls . append ( " \t //2th case {name} " . format ( name = f . name ) )
subcalls . append ( " \t //2th case {name} " . format ( name = f . name ) )
subcalls . append ( ' \t * {} = tal_arr(ctx, {} , {} ); '
subcalls . append ( ' \t * {} = tal_arr(ctx, {} , {} ); '
. format ( f . name , f . fieldtype . name , f . lenvar ) )
. format ( f . name , f . fieldtype . name , f . lenvar ) )
subcalls . append ( ' \t fromwire_ {} _array(&cursor, plen, * {} , {} ); '
. format ( basetype , f . name , f . lenvar ) )
self . print_fromwire_array ( subcalls , basetype , f , ' * ' + f . name ,
f . lenvar )
elif f . is_assignable ( ) :
elif f . is_assignable ( ) :
subcalls . append ( " \t //3th case {name} " . format ( name = f . name ) )
subcalls . append ( " \t //3th case {name} " . format ( name = f . name ) )
if f . is_len_var :
if f . is_len_var :
@ -271,6 +292,15 @@ class Message(object):
subcalls = ' \n ' . join ( subcalls )
subcalls = ' \n ' . join ( subcalls )
)
)
def print_towire_array ( self , subcalls , basetype , f , num_elems ) :
if f . has_array_helper ( ) :
subcalls . append ( ' \t towire_ {} _array(&p, {} , {} ); '
. format ( basetype , f . name , num_elems ) )
else :
subcalls . append ( ' \t for (size_t i = 0; i < {} ; i++) \n '
' \t \t towire_ {} (&p, {} + i); '
. format ( num_elems , basetype , f . name ) )
def print_towire ( self , is_header ) :
def print_towire ( self , is_header ) :
template = towire_header_templ if is_header else towire_impl_templ
template = towire_header_templ if is_header else towire_impl_templ
args = [ ]
args = [ ]
@ -304,11 +334,9 @@ class Message(object):
subcalls . append ( ' \t towire_pad(&p, {} ); '
subcalls . append ( ' \t towire_pad(&p, {} ); '
. format ( f . num_elems ) )
. format ( f . num_elems ) )
elif f . is_array ( ) :
elif f . is_array ( ) :
subcalls . append ( ' \t towire_ {} _array(&p, {} , {} ); '
self . print_towire_array ( subcalls , basetype , f , f . num_elems )
. format ( basetype , f . name , f . num_elems ) )
elif f . is_variable_size ( ) :
elif f . is_variable_size ( ) :
subcalls . append ( ' \t towire_ {} _array(&p, {} , {} ); '
self . print_towire_array ( subcalls , basetype , f , f . lenvar )
. format ( basetype , f . name , f . lenvar ) )
else :
else :
subcalls . append ( ' \t towire_ {} (&p, {} ); '
subcalls . append ( ' \t towire_ {} (&p, {} ); '
. format ( basetype , f . name ) )
. format ( basetype , f . name ) )