static upb_pbdecodermethod *newmethod(const upb_handlers *dest_handlers, mgroup *group) { static const struct upb_refcounted_vtbl vtbl = {visitmethod, freemethod}; upb_pbdecodermethod *ret = malloc(sizeof(*ret)); upb_refcounted_init(UPB_UPCAST(ret), &vtbl, &ret); upb_byteshandler_init(&ret->input_handler_); // The method references the group and vice-versa, in a circular reference. upb_ref2(ret, group); upb_ref2(group, ret); upb_inttable_insertptr(&group->methods, dest_handlers, upb_value_ptr(ret)); upb_refcounted_unref(UPB_UPCAST(ret), &ret); ret->group = UPB_UPCAST(group); ret->dest_handlers_ = dest_handlers; ret->is_native_ = false; // If we JIT, it will update this later. upb_inttable_init(&ret->dispatch, UPB_CTYPE_UINT64); if (ret->dest_handlers_) { upb_handlers_ref(ret->dest_handlers_, ret); } return ret; }
void upb_pbdecodermethod_unref(const upb_pbdecodermethod *m, const void *owner) { upb_refcounted_unref(UPB_UPCAST(m), owner); }
void upb_def_unref(const upb_def *def, const void *owner) { upb_refcounted_unref(upb_upcast(def), owner); }
void upb_handlers_unref(const upb_handlers *h, const void *owner) { upb_refcounted_unref(UPB_UPCAST(h), owner); }
void upb_def_unref(const upb_def *def, const void *owner) { upb_refcounted_unref(UPB_UPCAST(def), owner); }