Auto-generate files after cl/914653834
diff --git a/php/ext/google/protobuf/php-upb.c b/php/ext/google/protobuf/php-upb.c index db78aa6..3e8b4c6 100644 --- a/php/ext/google/protobuf/php-upb.c +++ b/php/ext/google/protobuf/php-upb.c
@@ -16510,6 +16510,20 @@ return ptr; } +UPB_FORCEINLINE upb_AddUnknownMode +_upb_Decoder_GetAddUnknownMode(upb_Decoder* d, const char* data) { + if (d->options & kUpb_DecodeOption_AliasString) { + if (data != d->input.buffer_start) { + // If the data is not from the beginning of the input buffer, then we can + // safely attempt to coalesce this region with the previous one. + return kUpb_AddUnknown_AliasAllowMerge; + } else { + return kUpb_AddUnknown_Alias; + } + } + return kUpb_AddUnknown_Copy; +} + static void _upb_Decoder_MungeInt32(wireval* val) { if (!upb_IsLittleEndian()) { /* The next stage will memcpy(dst, &val, 4) */ @@ -17369,19 +17383,9 @@ upb_StringView sv; upb_EpsCopyInputStream_EndCapture(&d->input, ptr, &sv); - upb_AddUnknownMode mode = kUpb_AddUnknown_Copy; - if (d->options & kUpb_DecodeOption_AliasString) { - if (sv.data != d->input.buffer_start) { - // If the data is not from the beginning of the input buffer, then we can - // safely attempt to coalesce this region with the previous one. - mode = kUpb_AddUnknown_AliasAllowMerge; - } else { - mode = kUpb_AddUnknown_Alias; - } - } - - if (!UPB_PRIVATE(_upb_Message_AddUnknown)(msg, sv.data, sv.size, &d->arena, - mode)) { + if (!UPB_PRIVATE(_upb_Message_AddUnknown)( + msg, sv.data, sv.size, &d->arena, + _upb_Decoder_GetAddUnknownMode(d, sv.data))) { upb_ErrorHandler_ThrowError(d->err, kUpb_DecodeStatus_OutOfMemory); } @@ -17511,12 +17515,50 @@ } UPB_NOINLINE +static const char* _upb_Decoder_DecodeEmptyMessage(upb_Decoder* d, + const char* ptr, + upb_Message* msg) { + if (upb_EpsCopyInputStream_IsDone(EPS(d), &ptr)) { + return ptr; + } + + const char* start = ptr; + upb_EpsCopyInputStream_StartCapture(&d->input, start); + while (!upb_EpsCopyInputStream_IsDone(EPS(d), &ptr)) { + uint32_t tag; + ptr = upb_WireReader_ReadTag(ptr, &tag, EPS(d)); + if ((tag & 7) == kUpb_WireType_EndGroup) { + d->end_group = tag >> 3; + break; + } + ptr = _upb_WireReader_SkipValue(ptr, tag, d->depth, &d->input); + } + upb_StringView sv; + upb_EpsCopyInputStream_EndCapture(&d->input, ptr, &sv); + + if (sv.size > 0) { + if (!UPB_PRIVATE(_upb_Message_AddUnknown)( + msg, sv.data, sv.size, &d->arena, + _upb_Decoder_GetAddUnknownMode(d, sv.data))) { + upb_ErrorHandler_ThrowError(d->err, kUpb_DecodeStatus_OutOfMemory); + } + } + return ptr; +} + +UPB_NOINLINE const char* _upb_Decoder_DecodeMessage(upb_Decoder* d, const char* ptr, upb_Message* msg, const upb_MiniTable* mt) { UPB_ASSERT(mt); UPB_ASSERT(d->message_is_done == false); + if (UPB_UNLIKELY(upb_MiniTable_FieldCount(mt) == 0 && + UPB_PRIVATE(_upb_MiniTable_ExtModeBase)(mt) == + kUpb_ExtMode_NonExtendable)) { + return _upb_Decoder_DecodeEmptyMessage(d, ptr, msg); + } + do { ptr = _upb_Decoder_DecodeField(d, ptr, msg, mt, 0, 0); } while (!d->message_is_done);
diff --git a/ruby/ext/google/protobuf_c/ruby-upb.c b/ruby/ext/google/protobuf_c/ruby-upb.c index c034045..b4cca63 100644 --- a/ruby/ext/google/protobuf_c/ruby-upb.c +++ b/ruby/ext/google/protobuf_c/ruby-upb.c
@@ -16019,6 +16019,20 @@ return ptr; } +UPB_FORCEINLINE upb_AddUnknownMode +_upb_Decoder_GetAddUnknownMode(upb_Decoder* d, const char* data) { + if (d->options & kUpb_DecodeOption_AliasString) { + if (data != d->input.buffer_start) { + // If the data is not from the beginning of the input buffer, then we can + // safely attempt to coalesce this region with the previous one. + return kUpb_AddUnknown_AliasAllowMerge; + } else { + return kUpb_AddUnknown_Alias; + } + } + return kUpb_AddUnknown_Copy; +} + static void _upb_Decoder_MungeInt32(wireval* val) { if (!upb_IsLittleEndian()) { /* The next stage will memcpy(dst, &val, 4) */ @@ -16878,19 +16892,9 @@ upb_StringView sv; upb_EpsCopyInputStream_EndCapture(&d->input, ptr, &sv); - upb_AddUnknownMode mode = kUpb_AddUnknown_Copy; - if (d->options & kUpb_DecodeOption_AliasString) { - if (sv.data != d->input.buffer_start) { - // If the data is not from the beginning of the input buffer, then we can - // safely attempt to coalesce this region with the previous one. - mode = kUpb_AddUnknown_AliasAllowMerge; - } else { - mode = kUpb_AddUnknown_Alias; - } - } - - if (!UPB_PRIVATE(_upb_Message_AddUnknown)(msg, sv.data, sv.size, &d->arena, - mode)) { + if (!UPB_PRIVATE(_upb_Message_AddUnknown)( + msg, sv.data, sv.size, &d->arena, + _upb_Decoder_GetAddUnknownMode(d, sv.data))) { upb_ErrorHandler_ThrowError(d->err, kUpb_DecodeStatus_OutOfMemory); } @@ -17020,12 +17024,50 @@ } UPB_NOINLINE +static const char* _upb_Decoder_DecodeEmptyMessage(upb_Decoder* d, + const char* ptr, + upb_Message* msg) { + if (upb_EpsCopyInputStream_IsDone(EPS(d), &ptr)) { + return ptr; + } + + const char* start = ptr; + upb_EpsCopyInputStream_StartCapture(&d->input, start); + while (!upb_EpsCopyInputStream_IsDone(EPS(d), &ptr)) { + uint32_t tag; + ptr = upb_WireReader_ReadTag(ptr, &tag, EPS(d)); + if ((tag & 7) == kUpb_WireType_EndGroup) { + d->end_group = tag >> 3; + break; + } + ptr = _upb_WireReader_SkipValue(ptr, tag, d->depth, &d->input); + } + upb_StringView sv; + upb_EpsCopyInputStream_EndCapture(&d->input, ptr, &sv); + + if (sv.size > 0) { + if (!UPB_PRIVATE(_upb_Message_AddUnknown)( + msg, sv.data, sv.size, &d->arena, + _upb_Decoder_GetAddUnknownMode(d, sv.data))) { + upb_ErrorHandler_ThrowError(d->err, kUpb_DecodeStatus_OutOfMemory); + } + } + return ptr; +} + +UPB_NOINLINE const char* _upb_Decoder_DecodeMessage(upb_Decoder* d, const char* ptr, upb_Message* msg, const upb_MiniTable* mt) { UPB_ASSERT(mt); UPB_ASSERT(d->message_is_done == false); + if (UPB_UNLIKELY(upb_MiniTable_FieldCount(mt) == 0 && + UPB_PRIVATE(_upb_MiniTable_ExtModeBase)(mt) == + kUpb_ExtMode_NonExtendable)) { + return _upb_Decoder_DecodeEmptyMessage(d, ptr, msg); + } + do { ptr = _upb_Decoder_DecodeField(d, ptr, msg, mt, 0, 0); } while (!d->message_is_done);