| // 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/decode_fast/data.h" | |
| #include "upb/wire/internal/decoder.h" | |
| #include "upb/wire/internal/eps_copy_input_stream.h" | |
| // Must be last. | |
| #include "upb/port/def.inc" | |
| UPB_NOINLINE UPB_PRESERVE_NONE upb_FastDecoder_Return | |
| upb_DecodeFast_MessageIsDoneFallback(UPB_PARSE_PARAMS) { | |
| int overrun; | |
| switch (UPB_PRIVATE(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); | |
| return (upb_FastDecoder_Return){ | |
| .ptr = UPB_UNLIKELY(table->UPB_PRIVATE(required_count)) | |
| ? _upb_Decoder_CheckRequired(d, ptr, msg, table) | |
| : ptr}; | |
| } | |
| case kUpb_IsDoneStatus_NeedFallback: | |
| // We've reached end-of-buffer. Refresh the buffer. | |
| ptr = UPB_PRIVATE(upb_EpsCopyInputStream_IsDoneFallback)(EPS(d), ptr, | |
| overrun); | |
| // We successfully refreshed the buffer (otherwise the function above | |
| // would have thrown an error with longjmp()). So continue with the | |
| // fast decoder. | |
| uint16_t tag = _upb_FastDecoder_LoadTag(ptr); | |
| _upb_Decoder_Trace(d, 'r'); | |
| data2 = upb_DecodeFastData2_PackOriginalTag(data2, tag); | |
| UPB_MUSTTAIL return _upb_FastDecoder_TagDispatch(UPB_PARSE_ARGS); | |
| case kUpb_IsDoneStatus_NotDone: // Handled by caller. | |
| default: | |
| UPB_UNREACHABLE(); | |
| } | |
| } | |
| upb_FastDecoder_Return _upb_FastDecoder_ErrorJmp2(upb_Decoder* d) { | |
| UPB_LONGJMP(d->err->buf, 1); | |
| return (upb_FastDecoder_Return){.ptr = NULL}; | |
| } |