summaryrefslogtreecommitdiff
path: root/upb
diff options
context:
space:
mode:
Diffstat (limited to 'upb')
-rw-r--r--upb/def.h2
-rw-r--r--upb/msg.c13
-rw-r--r--upb/pb/glue.c30
-rw-r--r--upb/pb/glue.h3
4 files changed, 37 insertions, 11 deletions
diff --git a/upb/def.h b/upb/def.h
index 66d3c70..86f84ce 100644
--- a/upb/def.h
+++ b/upb/def.h
@@ -93,6 +93,8 @@ typedef struct _upb_fielddef {
upb_value defaultval; // Only meaningful for non-repeated scalars and strings.
upb_value fval;
struct _upb_accessor_vtbl *accessor;
+ const void *default_ptr;
+ const void *prototype;
} upb_fielddef;
upb_fielddef *upb_fielddef_new(void);
diff --git a/upb/msg.c b/upb/msg.c
index 0a9948a..de7607c 100644
--- a/upb/msg.c
+++ b/upb/msg.c
@@ -11,11 +11,13 @@
#include "upb/msg.h"
void upb_msg_clear(void *msg, upb_msgdef *md) {
+ assert(msg != NULL);
memset(msg, 0, md->hasbit_bytes);
// TODO: set primitive fields to defaults?
}
void *upb_stdarray_append(upb_stdarray *a, size_t type_size) {
+ assert(a != NULL);
assert(a->len <= a->size);
if (a->len == a->size) {
size_t old_size = a->size;
@@ -81,12 +83,14 @@ void upb_msg_runhandlers(upb_msg *msg, upb_msgdef *md, upb_handlers *h,
/* Standard writers. **********************************************************/
void upb_stdmsg_sethas(void *_m, upb_value fval) {
+ assert(_m != NULL);
char *m = _m;
upb_fielddef *f = upb_value_getfielddef(fval);
if (f->hasbit >= 0) m[f->hasbit / 8] |= (1 << (f->hasbit % 8));
}
bool upb_stdmsg_has(void *_m, upb_value fval) {
+ assert(_m != NULL);
char *m = _m;
upb_fielddef *f = upb_value_getfielddef(fval);
return f->hasbit < 0 || (m[f->hasbit / 8] & (1 << (f->hasbit % 8)));
@@ -95,6 +99,7 @@ bool upb_stdmsg_has(void *_m, upb_value fval) {
#define UPB_ACCESSORS(type, ctype) \
upb_flow_t upb_stdmsg_set ## type (void *_m, upb_value fval, \
upb_value val) { \
+ assert(_m != NULL); \
upb_fielddef *f = upb_value_getfielddef(fval); \
uint8_t *m = _m; \
upb_stdmsg_sethas(_m, fval); \
@@ -105,12 +110,14 @@ bool upb_stdmsg_has(void *_m, upb_value fval) {
upb_flow_t upb_stdmsg_set ## type ## _r(void *a, upb_value _fval, \
upb_value val) { \
(void)_fval; \
+ assert(a != NULL); \
ctype *p = upb_stdarray_append((upb_stdarray*)a, sizeof(ctype)); \
*p = upb_value_get ## type(val); \
return UPB_CONTINUE; \
} \
\
upb_value upb_stdmsg_get ## type(void *_m, upb_value fval) { \
+ assert(_m != NULL); \
uint8_t *m = _m; \
upb_fielddef *f = upb_value_getfielddef(fval); \
upb_value ret; \
@@ -118,6 +125,7 @@ bool upb_stdmsg_has(void *_m, upb_value fval) {
return ret; \
} \
upb_value upb_stdmsg_seqget ## type(void *i) { \
+ assert(i != NULL); \
upb_value val; \
upb_value_set ## type(&val, *(ctype*)i); \
return val; \
@@ -153,6 +161,7 @@ static void _upb_stdmsg_setstr(void *_dst, upb_value src) {
}
upb_flow_t upb_stdmsg_setstr(void *_m, upb_value fval, upb_value val) {
+ assert(_m != NULL);
char *m = _m;
upb_fielddef *f = upb_value_getfielddef(fval);
upb_stdmsg_sethas(_m, fval);
@@ -161,16 +170,19 @@ upb_flow_t upb_stdmsg_setstr(void *_m, upb_value fval, upb_value val) {
}
upb_flow_t upb_stdmsg_setstr_r(void *a, upb_value fval, upb_value val) {
+ assert(a != NULL);
(void)fval;
_upb_stdmsg_setstr(upb_stdarray_append((upb_stdarray*)a, sizeof(void*)), val);
return UPB_CONTINUE;
}
upb_value upb_stdmsg_getstr(void *m, upb_value fval) {
+ assert(m != NULL);
return upb_stdmsg_getptr(m, fval);
}
upb_value upb_stdmsg_seqgetstr(void *i) {
+ assert(i != NULL);
return upb_stdmsg_seqgetptr(i);
}
@@ -244,6 +256,7 @@ void upb_stdmsg_recycle(void **m, upb_msgdef *md) {
}
upb_sflow_t upb_stdmsg_startsubmsg(void *_m, upb_value fval) {
+ assert(_m != NULL);
char *m = _m;
upb_fielddef *f = upb_value_getfielddef(fval);
void **subm = (void*)&m[f->offset];
diff --git a/upb/pb/glue.c b/upb/pb/glue.c
index 6b52435..e13db3e 100644
--- a/upb/pb/glue.c
+++ b/upb/pb/glue.c
@@ -53,8 +53,8 @@ void upb_msgtotext(upb_string *str, upb_msg *msg, upb_msgdef *md,
#endif
// TODO: read->load.
-void upb_read_descriptor(upb_symtab *symtab, const char *str, size_t len,
- upb_status *status) {
+upb_def **upb_load_descriptor(const char *str, size_t len, int *n,
+ upb_status *status) {
upb_stringsrc strsrc;
upb_stringsrc_init(&strsrc);
upb_stringsrc_reset(&strsrc, str, len);
@@ -70,12 +70,17 @@ void upb_read_descriptor(upb_symtab *symtab, const char *str, size_t len,
upb_decoder_reset(&d, upb_stringsrc_bytesrc(&strsrc), 0, UINT64_MAX, &r);
upb_decoder_decode(&d, status);
- int n;
- upb_def **defs = upb_descreader_getdefs(&r, &n);
+ upb_def **defs = upb_descreader_getdefs(&r, n);
+ upb_def **defscopy = malloc(sizeof(upb_def*) * (*n));
+ memcpy(defscopy, defs, sizeof(upb_def*) * (*n));
+
+ upb_descreader_uninit(&r);
+ upb_stringsrc_uninit(&strsrc);
+ upb_decoder_uninit(&d);
// Set default accessors and layouts on all messages.
- for(int i = 0; i < n; i++) {
- upb_def *def = defs[i];
+ for(int i = 0; i < *n; i++) {
+ upb_def *def = defscopy[i];
upb_msgdef *md = upb_dyncast_msgdef(def);
if (!md) continue;
// For field in msgdef:
@@ -87,13 +92,16 @@ void upb_read_descriptor(upb_symtab *symtab, const char *str, size_t len,
upb_msgdef_layout(md);
}
- if (upb_ok(status)) upb_symtab_add(symtab, defs, n, status);
+ return defscopy;
+}
+void upb_read_descriptor(upb_symtab *s, const char *str, size_t len,
+ upb_status *status) {
+ int n;
+ upb_def **defs = upb_load_descriptor(str, len, &n, status);
+ if (upb_ok(status)) upb_symtab_add(s, defs, n, status);
for(int i = 0; i < n; i++) upb_def_unref(defs[i]);
-
- upb_descreader_uninit(&r);
- upb_stringsrc_uninit(&strsrc);
- upb_decoder_uninit(&d);
+ free(defs);
}
char *upb_readfile(const char *filename, size_t *len) {
diff --git a/upb/pb/glue.h b/upb/pb/glue.h
index 5359120..a2a478c 100644
--- a/upb/pb/glue.h
+++ b/upb/pb/glue.h
@@ -47,6 +47,9 @@ void upb_strtomsg(const char *str, size_t len, void *msg,
//void upb_msgtotext(struct _upb_string *str, void *msg,
// struct _upb_msgdef *md, bool single_line);
+upb_def **upb_load_descriptor(const char *str, size_t len, int *n,
+ upb_status *status);
+
void upb_read_descriptor(struct _upb_symtab *symtab, const char *str, size_t len,
upb_status *status);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback