diff options
Diffstat (limited to 'upb')
-rw-r--r-- | upb/def.h | 2 | ||||
-rw-r--r-- | upb/msg.c | 13 | ||||
-rw-r--r-- | upb/pb/glue.c | 30 | ||||
-rw-r--r-- | upb/pb/glue.h | 3 |
4 files changed, 37 insertions, 11 deletions
@@ -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); @@ -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); |