blob: bac147cd674f9a27ceafebb5c7d32d059f81812e [file] [log] [blame]
// Protocol Buffers - Google's data interchange format
// Copyright 2025 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/decode_fast/dispatch.h"
#include <stdint.h>
#include "upb/mini_table/message.h"
#include "upb/wire/eps_copy_input_stream.h"
#include "upb/wire/internal/decoder.h"
// Must be last.
#include "upb/port/def.inc"
UPB_NOINLINE UPB_PRESERVE_NONE const char* upb_DecodeFast_MessageIsDoneFallback(
UPB_PARSE_PARAMS) {
int overrun;
switch (upb_EpsCopyInputStream_IsDoneStatus(&d->input, ptr, &overrun)) {
case kUpb_IsDoneStatus_Done: {
// We've reach end-of-message. Sync hasbits and maybe check required
// fields.
d->message_is_done = true;
upb_DecodeFast_SetHasbits(msg, hasbits);
const upb_MiniTable* m = decode_totablep(table);
return UPB_UNLIKELY(m->UPB_PRIVATE(required_count))
? _upb_Decoder_CheckRequired(d, ptr, msg, m)
: ptr;
}
case kUpb_IsDoneStatus_NeedFallback:
// We've reached end-of-buffer. Refresh the buffer.
ptr = _upb_EpsCopyInputStream_IsDoneFallbackInline(
&d->input, ptr, overrun, _upb_Decoder_BufferFlipCallback);
// We successfully refreshed the buffer (otherwise the function above
// would have thrown an error with longjmp()). So continue with the
// fast decoder.
data = _upb_FastDecoder_LoadTag(ptr);
UPB_MUSTTAIL return _upb_FastDecoder_TagDispatch(UPB_PARSE_ARGS);
case kUpb_IsDoneStatus_NotDone: // Handled by caller.
default:
UPB_UNREACHABLE();
}
}
const char* _upb_FastDecoder_ErrorJmp2(upb_Decoder* d) {
UPB_LONGJMP(d->err, 1);
return NULL;
}