static void upb_enumdef_free(upb_enumdef *e) { upb_enum_iter i; for(i = upb_enum_begin(e); !upb_enum_done(i); i = upb_enum_next(e, i)) { // Frees the ref taken when the string was parsed. free(upb_enum_iter_name(i)); } upb_strtable_free(&e->ntoi); upb_inttable_free(&e->iton); upb_def_uninit(&e->base); free(e); }
upb_enumdef *upb_enumdef_dup(const upb_enumdef *e, const void *owner) { upb_enumdef *new_e = upb_enumdef_new(owner); if (!new_e) return NULL; upb_enum_iter i; for(upb_enum_begin(&i, e); !upb_enum_done(&i); upb_enum_next(&i)) { bool success = upb_enumdef_addval( new_e, upb_enum_iter_name(&i),upb_enum_iter_number(&i), NULL); if (!success) { upb_enumdef_unref(new_e, owner); return NULL; } } return new_e; }
/* * call-seq: * EnumDescriptor.each(&block) * * Iterates over key => value mappings in this enum's definition, yielding to * the block with (key, value) arguments for each one. */ VALUE EnumDescriptor_each(VALUE _self) { DEFINE_SELF(EnumDescriptor, self, _self); upb_enum_iter it; for (upb_enum_begin(&it, self->enumdef); !upb_enum_done(&it); upb_enum_next(&it)) { VALUE key = ID2SYM(rb_intern(upb_enum_iter_name(&it))); VALUE number = INT2NUM(upb_enum_iter_number(&it)); rb_yield_values(2, key, number); } return Qnil; }