init_group_property(&prop->group, prop, child);
list_head_init(&prop->group.list);
+ update_bounds(&prop->group);
}
return prop;
}
children = add_child_property(parent, child);
if (!children)
return false;
- children->group.list.n.next = children->group.list.n.prev
- = &children->group.list.n;
+ list_head_init(&children->group.list);
/* Child links to itself. */
child->next = child;
freefn(t);
}
-void *tal_alloc_(const tal_t *ctx, size_t size, bool clear)
+void *tal_alloc_(const tal_t *ctx, size_t size, bool clear, const char *label)
{
struct tal_hdr *child, *parent = debug_tal(to_tal_hdr_or_null(ctx));
return NULL;
if (clear)
memset(from_tal_hdr(child), 0, size);
- child->prop = NULL;
+ child->prop = (void *)label;
if (!add_child(parent, child)) {
freefn(child);
return NULL;
tal_t *tal_parent(const tal_t *ctx)
{
struct group *group;
- struct tal_hdr *t = debug_tal(to_tal_hdr(ctx));
+ struct tal_hdr *t;
+
+ if (!ctx)
+ return NULL;
+
+ t = debug_tal(to_tal_hdr(ctx));
while (!(group = find_property(t, GROUP)))
t = t->next;
void *tal_memdup(const tal_t *ctx, const void *p, size_t n)
{
- void *ret = tal_arr(ctx, char, n);
+ void *ret;
+
+ if (ctx == TAL_TAKE)
+ return (void *)p;
+
+ ret = tal_arr(ctx, char, n);
if (ret)
memcpy(ret, p, n);
return ret;
char *tal_vasprintf(const tal_t *ctx, const char *fmt, va_list ap)
{
size_t max = strlen(fmt) * 2;
- char *buf = tal_arr(ctx, char, max);
+ char *buf;
int ret;
+ if (ctx == TAL_TAKE)
+ buf = tal_arr(tal_parent(fmt), char, max);
+ else
+ buf = tal_arr(ctx, char, max);
+
while (buf) {
va_list ap2;
break;
buf = tal_resize(buf, max *= 2);
}
+ if (ctx == TAL_TAKE)
+ tal_free(fmt);
return buf;
}
name = (struct name *)p;
break;
}
- if (p != &null_parent.c.hdr && !in_bounds(p))
+ if (p != &null_parent.c.hdr && p != &null_parent.c.group.hdr
+ && !in_bounds(p))
return check_err(t, errorstr,
"has bad property pointer");