diff --git a/capn-test.cpp b/capn-test.cpp index d35b877..aee722f 100644 --- a/capn-test.cpp +++ b/capn-test.cpp @@ -46,7 +46,7 @@ TEST(WireFormat, SimpleRawDataStruct) { EXPECT_EQ(1, ctx.segnum); EXPECT_EQ(0, seg.id); - struct capn_ptr ptr = capn_get_root(&ctx); + struct capn_ptr ptr = capn_getp(capn_root(&ctx), 0); EXPECT_EQ(CAPN_STRUCT, ptr.type); EXPECT_EQ(8, ptr.datasz); EXPECT_EQ(0, ptr.ptrsz); @@ -68,7 +68,7 @@ static const AlignedData<2> STRUCTLIST_ELEMENT_SUBSTRUCT_DEFAULT = {{0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,0}}; static void setupStruct(struct capn *ctx) { - struct capn_ptr root = capn_new_root(ctx); + struct capn_ptr root = capn_root(ctx); ASSERT_EQ(CAPN_PTR_LIST, root.type); ASSERT_EQ(1, root.len); @@ -143,16 +143,16 @@ static void setupStruct(struct capn *ctx) { } } - capn_ptr recurse = capn_new_struct(ptr.seg, 0, 1); + capn_ptr recurse = capn_new_struct(ptr.seg, 0, 2); EXPECT_EQ(CAPN_STRUCT, recurse.type); EXPECT_EQ(0, recurse.datasz); - EXPECT_EQ(8, recurse.ptrsz); + EXPECT_EQ(16, recurse.ptrsz); EXPECT_EQ(0, capn_setp(recurse, 0, recurse)); EXPECT_EQ(0, capn_setp(ptr, 4, recurse)); } static void checkStruct(struct capn *ctx) { - capn_ptr ptr = capn_get_root(ctx); + capn_ptr ptr = capn_getp(capn_root(ctx), 0); EXPECT_EQ(CAPN_STRUCT, ptr.type); EXPECT_EQ(16, ptr.datasz); EXPECT_EQ(40, ptr.ptrsz); @@ -434,8 +434,8 @@ TEST(WireFormat, CopyStruct) { setupStruct(&ctx1.capn); checkStruct(&ctx1.capn); - capn_ptr root = capn_new_root(&ctx2.capn); - EXPECT_EQ(0, capn_setp(root, 0, capn_get_root(&ctx1.capn))); + capn_ptr root = capn_root(&ctx2.capn); + EXPECT_EQ(0, capn_setp(root, 0, capn_getp(capn_root(&ctx1.capn), 0))); checkStruct(&ctx2.capn); } diff --git a/capn.c b/capn.c index fb74442..11e4f67 100644 --- a/capn.c +++ b/capn.c @@ -938,29 +938,19 @@ static void new_object(capn_ptr *p, int bytes) { } } -capn_ptr capn_get_root(struct capn* c) { - struct capn_segment* s = lookup_segment(c, NULL, 0); - if (s->len < 8) { - capn_ptr ret = {CAPN_NULL}; - return ret; - } else { - return read_ptr(s, s->data); - } -} +capn_ptr capn_root(struct capn *c) { + capn_ptr r = {CAPN_PTR_LIST}; + r.seg = lookup_segment(c, NULL, 0); + r.data = r.seg ? r.seg->data : new_data(c, 8, &r.seg); + r.len = 1; -capn_ptr capn_new_root(struct capn *c) { - capn_ptr p = {CAPN_NULL}; - struct capn_segment *s = lookup_segment(c, NULL, 0); - - /* don't use new_object as we don't want the tag */ - if ((s || new_data(c, 8, &s) != NULL) && s->len >= 8) { - p.seg = s; - p.data = p.seg->data; - p.len = 1; - p.type = CAPN_PTR_LIST; + if (!r.seg || r.seg->cap < 8) { + memset(&r, 0, sizeof(r)); + } else if (r.seg->len < 8) { + r.seg->len = 8; } - return p; + return r; } capn_ptr capn_new_struct(struct capn_segment *seg, int datasz, int ptrs) { diff --git a/capn.h b/capn.h index e2487fa..77c33cf 100644 --- a/capn.h +++ b/capn.h @@ -120,7 +120,7 @@ typedef struct {capn_ptr p;} capn_list64; /* capn_append_segment appends a segment to a session */ void capn_append_segment(struct capn*, struct capn_segment*); -capn_ptr capn_get_root(struct capn*); +capn_ptr capn_root(struct capn *c); /* capn_getp|setp functions get/set ptrs in list/structs * off is the list index or pointer index in a struct @@ -175,7 +175,6 @@ int capn_setv64(capn_list64 p, int off, const uint64_t *data, int sz); * datasz is in bytes, ptrs is # of pointers, sz is # of elements in the list * On an error a CAPN_NULL pointer is returned */ -capn_ptr capn_new_root(struct capn*); capn_ptr capn_new_struct(struct capn_segment *seg, int datasz, int ptrs); capn_ptr capn_new_list(struct capn_segment *seg, int sz, int datasz, int ptrs); capn_list1 capn_new_list1(struct capn_segment *seg, int sz); diff --git a/compiler/capnpc-c.c b/compiler/capnpc-c.c index 6d5b2d3..547d980 100644 --- a/compiler/capnpc-c.c +++ b/compiler/capnpc-c.c @@ -617,7 +617,7 @@ int main() { return -1; } - root.p = capn_get_root(&capn); + root.p = capn_getp(capn_root(&capn), 0); read_CodeGeneratorRequest(&req, root); for (i = 0; i < req.nodes.p.len; i++) { diff --git a/compiler/schema-test.cpp b/compiler/schema-test.cpp index a36642f..5fbabad 100644 --- a/compiler/schema-test.cpp +++ b/compiler/schema-test.cpp @@ -184,7 +184,7 @@ TEST(Schema, ReadSimple) { struct capn ctx; ASSERT_EQ(0, capn_init_mem(&ctx, simple_schema, sizeof(simple_schema), 0)); - CodeGeneratorRequest_ptr root = {capn_get_root(&ctx)}; + CodeGeneratorRequest_ptr root = {capn_getp(capn_root(&ctx), 0)}; EXPECT_EQ(CAPN_STRUCT, root.p.type); struct CodeGeneratorRequest req;