| // Protocol Buffers - Google's data interchange format | |
| // Copyright 2026 Google LLC. All rights reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file or at | |
| // https://developers.google.com/open-source/licenses/bsd | |
| #include "upb/wire/encode_extension.h" | |
| #include <setjmp.h> | |
| #include <stddef.h> | |
| #include "upb/base/string_view.h" | |
| #include "upb/mem/internal/arena.h" | |
| #include "upb/message/internal/extension.h" | |
| #include "upb/mini_table/extension.h" | |
| #include "upb/mini_table/message.h" | |
| #include "upb/wire/encode.h" | |
| #include "upb/wire/internal/back_alloc.h" | |
| #include "upb/wire/internal/encoder.h" | |
| // Must be last. | |
| #include "upb/port/def.inc" | |
| static upb_EncodeStatus upb_DoEncodeExtension(upb_encstate* encoder, char* ptr, | |
| const struct upb_Extension* ext, | |
| bool is_message_set, | |
| upb_StringView* view, | |
| int encode_options) { | |
| if (UPB_SETJMP(*encoder->err) == 0) { | |
| char* buf = ptr; | |
| size_t size = 0; | |
| UPB_PRIVATE(_upb_Encode_Extension)( | |
| encoder, upb_Extension_MiniTableExtension(ext), | |
| upb_Extension_GetValue(ext), is_message_set, &buf, &size, | |
| encode_options); | |
| view->data = buf; | |
| view->size = size; | |
| } else { | |
| UPB_ASSERT(encoder->status != kUpb_EncodeStatus_Ok); | |
| upb_BackAlloc_Abort(&encoder->alloc); | |
| view->data = NULL; | |
| view->size = 0; | |
| } | |
| UPB_PRIVATE(_upb_encstate_destroy)(encoder); | |
| return encoder->status; | |
| } | |
| upb_EncodeStatus upb_EncodeExtension(const struct upb_Extension* ext, | |
| struct upb_Arena* arena, | |
| upb_StringView* view, int encode_options) { | |
| const upb_MiniTable* extendee = | |
| upb_MiniTableExtension_Extendee(upb_Extension_MiniTableExtension(ext)); | |
| bool is_message_set = | |
| extendee != NULL && upb_MiniTable_IsMessageSet(extendee); | |
| upb_encstate e; | |
| jmp_buf err; | |
| char* ptr = UPB_PRIVATE(_upb_encstate_init)(&e, &err, arena); | |
| return upb_DoEncodeExtension(&e, ptr, ext, is_message_set, view, | |
| encode_options); | |
| } |