diff options
author | Joshua Haberman <joshua@reverberate.org> | 2009-12-31 20:42:56 -0800 |
---|---|---|
committer | Joshua Haberman <joshua@reverberate.org> | 2009-12-31 20:42:56 -0800 |
commit | 2fdc9df97eab06f2b42c1a9a87bc01d5e9feedd7 (patch) | |
tree | 6b0d924889906be6fe8bc86faa60fcfbe7ae541e /src/upb_data.h | |
parent | 0e5b8e56b84087424760770e0f4c03acbeff0328 (diff) |
Other than a couple memory leaks, "make descriptorgen" works again!
Diffstat (limited to 'src/upb_data.h')
-rw-r--r-- | src/upb_data.h | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/upb_data.h b/src/upb_data.h index 872f237..2a7940e 100644 --- a/src/upb_data.h +++ b/src/upb_data.h @@ -130,8 +130,9 @@ typedef enum { // Attempts to increment the reference on d with the given type of ref. If // this is not possible, returns false. INLINE bool _upb_data_incref(upb_data *d, upb_reftype reftype) { - if((reftype == UPB_REF_FROZEN && !upb_data_hasflag(d, UPB_DATA_FROZEN)) || - (reftype == UPB_REF_MUTABLE && upb_data_hasflag(d, UPB_DATA_FROZEN)) || + bool frozen = upb_data_hasflag(d, UPB_DATA_FROZEN); + if((reftype == UPB_REF_FROZEN && !frozen) || + (reftype == UPB_REF_MUTABLE && frozen) || (upb_data_hasflag(d, UPB_DATA_HEAPALLOCATED) && !upb_data_hasflag(d, UPB_DATA_REFCOUNTED))) { return false; @@ -306,7 +307,7 @@ upb_string *upb_strreadfile(const char *filename); // must not dynamically allocate this type. typedef upb_string upb_static_string; #define UPB_STRLIT_LEN(str, len) {0 | UPB_DATA_FROZEN, len, str} -#define UPB_STRLIT(str) {{0 | UPB_DATA_FROZEN, sizeof(str), str}} +#define UPB_STRLIT(str) {{0 | UPB_DATA_FROZEN, sizeof(str)-1, str}} // Allows using upb_strings in printf, ie: // upb_string str = UPB_STRLIT("Hello, World!\n"); @@ -359,6 +360,11 @@ typedef struct type ## _array { \ // empty. Caller owns one ref on it. upb_array *upb_array_new(void); +// Returns the current number of elements in the array. +INLINE size_t upb_array_len(upb_array *a) { + return a->common.len; +} + // INTERNAL-ONLY: // Frees the given message and releases references on members. void _upb_array_free(upb_array *a, struct upb_fielddef *f); @@ -366,7 +372,8 @@ void _upb_array_free(upb_array *a, struct upb_fielddef *f); // INTERNAL-ONLY: // Returns a pointer to the given elem. INLINE union upb_value_ptr _upb_array_getptr(upb_array *a, - struct upb_fielddef *f, int elem) { + struct upb_fielddef *f, + upb_arraylen_t elem) { assert(elem < upb_array_len(a)); size_t type_size = upb_type_info[f->type].size; union upb_value_ptr p = {._void = &a->common.elements.uint8[elem * type_size]}; @@ -405,11 +412,6 @@ INLINE void upb_array_append_default(upb_array *a, struct upb_fielddef *f, union upb_value val); #endif -// Returns the current number of elements in the array. -INLINE size_t upb_array_len(upb_array *a) { - return a->common.len; -} - INLINE void upb_array_truncate(upb_array *a) { a->common.len = 0; } @@ -447,7 +449,7 @@ INLINE void upb_msg_unref(upb_msg *msg, struct upb_msgdef *md) { // Tests whether the given field is explicitly set, or whether it will return // a default. INLINE bool upb_msg_has(upb_msg *msg, struct upb_fielddef *f) { - return msg->data[f->field_index/8] % (1 << (f->field_index % 8)); + return (msg->data[f->field_index/8] & (1 << (f->field_index % 8))) != 0; } // Returns the current value if set, or the default value if not set, of the |