blob: b1fae4fd37a595316f63705f80f58ebfe287c61e [file]
// 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, ext->ext, ext->data,
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(ext->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);
}