Browse Source

tools/generate-wire.py: open-code array handling for non-u8.

Except for the trivial case of u8 arrays, have the generator create
the loop code for the array iteration.

This removes some trivial helpers, and avoids us having to write more.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 8 years ago
parent
commit
9768e4c907
  1. 17
      lightningd/utxo.c
  2. 5
      lightningd/utxo.h
  3. 46
      tools/generate-wire.py
  4. 42
      wire/fromwire.c
  5. 42
      wire/towire.c
  6. 16
      wire/wire.h

17
lightningd/utxo.c

@ -18,20 +18,3 @@ void fromwire_utxo(const u8 **ptr, size_t *max, struct utxo *utxo)
utxo->keyindex = fromwire_u32(ptr, max); utxo->keyindex = fromwire_u32(ptr, max);
utxo->is_p2sh = fromwire_bool(ptr, max); utxo->is_p2sh = fromwire_bool(ptr, max);
} }
void fromwire_utxo_array(const u8 **ptr, size_t *max,
struct utxo *utxo, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
fromwire_utxo(ptr, max, &utxo[i]);
}
void towire_utxo_array(u8 **pptr, const struct utxo *utxo, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
towire_utxo(pptr, &utxo[i]);
}

5
lightningd/utxo.h

@ -16,9 +16,4 @@ struct utxo {
void towire_utxo(u8 **pptr, const struct utxo *utxo); void towire_utxo(u8 **pptr, const struct utxo *utxo);
void fromwire_utxo(const u8 **ptr, size_t *max, struct utxo *utxo); void fromwire_utxo(const u8 **ptr, size_t *max, struct utxo *utxo);
void fromwire_utxo_array(const u8 **ptr, size_t *max,
struct utxo *utxo, size_t num);
void towire_utxo_array(u8 **pptr, const struct utxo *utxo, size_t num);
#endif /* LIGHTNING_LIGHTNINGD_UTXO_H */ #endif /* LIGHTNING_LIGHTNINGD_UTXO_H */

46
tools/generate-wire.py

@ -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('\tfromwire_{}_array(&cursor, plen, {}, {});'
.format(basetype, name, num_elems))
else:
subcalls.append('\tfor (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\tfromwire_{}(&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('\tfromwire_pad(&cursor, plen, {});' subcalls.append('\tfromwire_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('\tfromwire_{}_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('\tfromwire_{}_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('\ttowire_{}_array(&p, {}, {});'
.format(basetype, f.name, num_elems))
else:
subcalls.append('\tfor (size_t i = 0; i < {}; i++)\n'
'\t\ttowire_{}(&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('\ttowire_pad(&p, {});' subcalls.append('\ttowire_pad(&p, {});'
.format(f.num_elems)) .format(f.num_elems))
elif f.is_array(): elif f.is_array():
subcalls.append('\ttowire_{}_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('\ttowire_{}_array(&p, {}, {});' self.print_towire_array(subcalls, basetype, f, f.lenvar)
.format(basetype, f.name, f.lenvar))
else: else:
subcalls.append('\ttowire_{}(&p, {});' subcalls.append('\ttowire_{}(&p, {});'
.format(basetype, f.name)) .format(basetype, f.name))

42
wire/fromwire.c

@ -160,53 +160,11 @@ void fromwire_u8_array(const u8 **cursor, size_t *max, u8 *arr, size_t num)
fromwire(cursor, max, arr, num); fromwire(cursor, max, arr, num);
} }
void fromwire_u32_array(const u8 **cursor, size_t *max, u32 *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
arr[i] = fromwire_u32(cursor, max);
}
void fromwire_u64_array(const u8 **cursor, size_t *max, u64 *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
arr[i] = fromwire_u64(cursor, max);
}
void fromwire_bool_array(const u8 **cursor, size_t *max, bool *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
arr[i] = fromwire_bool(cursor, max);
}
void fromwire_pad(const u8 **cursor, size_t *max, size_t num) void fromwire_pad(const u8 **cursor, size_t *max, size_t num)
{ {
fromwire(cursor, max, NULL, num); fromwire(cursor, max, NULL, num);
} }
void fromwire_secp256k1_ecdsa_signature_array(const u8 **cursor, size_t *max,
secp256k1_ecdsa_signature *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
fromwire_secp256k1_ecdsa_signature(cursor, max, arr + i);
}
void fromwire_sha256_double_array(const u8 **cursor, size_t *max,
struct sha256_double *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
fromwire_sha256_double(cursor, max, arr + i);
}
static char *fmt_short_channel_id(const tal_t *ctx, static char *fmt_short_channel_id(const tal_t *ctx,
const struct short_channel_id *id) const struct short_channel_id *id)
{ {

42
wire/towire.c

@ -104,30 +104,6 @@ void towire_u8_array(u8 **pptr, const u8 *arr, size_t num)
towire(pptr, arr, num); towire(pptr, arr, num);
} }
void towire_u32_array(u8 **pptr, const u32 *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
towire_u32(pptr, arr[i]);
}
void towire_u64_array(u8 **pptr, const u64 *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
towire_u64(pptr, arr[i]);
}
void towire_bool_array(u8 **pptr, const bool *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
towire_bool(pptr, arr[i]);
}
void towire_pad(u8 **pptr, size_t num) void towire_pad(u8 **pptr, size_t num)
{ {
/* Simply insert zeros. */ /* Simply insert zeros. */
@ -136,21 +112,3 @@ void towire_pad(u8 **pptr, size_t num)
tal_resize(pptr, oldsize + num); tal_resize(pptr, oldsize + num);
memset(*pptr + oldsize, 0, num); memset(*pptr + oldsize, 0, num);
} }
void towire_secp256k1_ecdsa_signature_array(u8 **pptr,
const secp256k1_ecdsa_signature *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
towire_secp256k1_ecdsa_signature(pptr, arr+i);
}
void towire_sha256_double_array(u8 **pptr,
const struct sha256_double *arr, size_t num)
{
size_t i;
for (i = 0; i < num; i++)
towire_sha256_double(pptr, arr+i);
}

16
wire/wire.h

@ -43,14 +43,6 @@ void towire_pad(u8 **pptr, size_t num);
void towire_bool(u8 **pptr, bool v); void towire_bool(u8 **pptr, bool v);
void towire_u8_array(u8 **pptr, const u8 *arr, size_t num); void towire_u8_array(u8 **pptr, const u8 *arr, size_t num);
void towire_u32_array(u8 **pptr, const u32 *arr, size_t num);
void towire_u64_array(u8 **pptr, const u64 *arr, size_t num);
void towire_bool_array(u8 **pptr, const bool *arr, size_t num);
void towire_secp256k1_ecdsa_signature_array(u8 **pptr,
const secp256k1_ecdsa_signature *arr, size_t num);
void towire_sha256_double_array(u8 **pptr,
const struct sha256_double *arr, size_t num);
const u8 *fromwire(const u8 **cursor, size_t *max, void *copy, size_t n); const u8 *fromwire(const u8 **cursor, size_t *max, void *copy, size_t n);
u8 fromwire_u8(const u8 **cursor, size_t *max); u8 fromwire_u8(const u8 **cursor, size_t *max);
@ -73,12 +65,4 @@ void fromwire_ipv6(const u8 **cursor, size_t *max, struct ipv6 *ipv6);
void fromwire_pad(const u8 **cursor, size_t *max, size_t num); void fromwire_pad(const u8 **cursor, size_t *max, size_t num);
void fromwire_u8_array(const u8 **cursor, size_t *max, u8 *arr, size_t num); void fromwire_u8_array(const u8 **cursor, size_t *max, u8 *arr, size_t num);
void fromwire_u32_array(const u8 **cursor, size_t *max, u32 *arr, size_t num);
void fromwire_u64_array(const u8 **cursor, size_t *max, u64 *arr, size_t num);
void fromwire_bool_array(const u8 **cursor, size_t *max, bool *arr, size_t num);
void fromwire_secp256k1_ecdsa_signature_array(const u8 **cursor, size_t *max,
secp256k1_ecdsa_signature *arr, size_t num);
void fromwire_sha256_double_array(const u8 **cursor, size_t *max,
struct sha256_double *arr, size_t num);
#endif /* LIGHTNING_WIRE_WIRE_H */ #endif /* LIGHTNING_WIRE_WIRE_H */

Loading…
Cancel
Save