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->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 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 */

46
tools/generate-wire.py

@ -31,6 +31,10 @@ class FieldType(object):
def is_assignable(self):
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
@staticmethod
def _typesize(typename):
@ -127,6 +131,9 @@ class Field(object):
return False
return self.fieldtype.is_assignable()
def has_array_helper(self):
return self.fieldtype.has_array_helper()
# Returns FieldType
@staticmethod
def _guess_type(message, fieldname, base_size):
@ -209,6 +216,20 @@ class Message(object):
self.has_variable_fields = True
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):
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, {});'
.format(f.num_elems))
elif f.is_array():
subcalls.append("\t//1th case {name}".format(name=f.name))
subcalls.append('\tfromwire_{}_array(&cursor, plen, {}, {});'
.format(basetype, f.name, f.num_elems))
self.print_fromwire_array(subcalls, basetype, f, f.name,
f.num_elems)
elif f.is_variable_size():
subcalls.append("\t//2th case {name}".format(name=f.name))
subcalls.append('\t*{} = tal_arr(ctx, {}, {});'
.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():
subcalls.append("\t//3th case {name}".format(name=f.name))
if f.is_len_var:
@ -271,6 +292,15 @@ class Message(object):
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):
template = towire_header_templ if is_header else towire_impl_templ
args = []
@ -304,11 +334,9 @@ class Message(object):
subcalls.append('\ttowire_pad(&p, {});'
.format(f.num_elems))
elif f.is_array():
subcalls.append('\ttowire_{}_array(&p, {}, {});'
.format(basetype, f.name, f.num_elems))
self.print_towire_array(subcalls, basetype, f, f.num_elems)
elif f.is_variable_size():
subcalls.append('\ttowire_{}_array(&p, {}, {});'
.format(basetype, f.name, f.lenvar))
self.print_towire_array(subcalls, basetype, f, f.lenvar)
else:
subcalls.append('\ttowire_{}(&p, {});'
.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);
}
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)
{
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,
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);
}
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)
{
/* Simply insert zeros. */
@ -136,21 +112,3 @@ void towire_pad(u8 **pptr, size_t num)
tal_resize(pptr, oldsize + 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_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);
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_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 */

Loading…
Cancel
Save