@@ -2297,44 +2297,35 @@ PROTOBUF_NOINLINE const char* TcParser::MpMessage(PROTOBUF_TC_PARAM_DECL) {
2297
2297
const uint16_t type_card = entry.type_card ;
2298
2298
const uint16_t card = type_card & field_layout::kFcMask ;
2299
2299
2300
+ const uint32_t decoded_tag = data.tag ();
2301
+ const uint32_t decoded_wiretype = decoded_tag & 7 ;
2302
+
2300
2303
// Check for repeated parsing:
2301
2304
if (card == field_layout::kFcRepeated ) {
2302
- const uint16_t rep = type_card & field_layout::kRepMask ;
2303
- switch (rep) {
2304
- case field_layout::kRepMessage :
2305
+ switch (decoded_wiretype) {
2306
+ case WireFormatLite::WIRETYPE_LENGTH_DELIMITED:
2305
2307
PROTOBUF_MUSTTAIL return MpRepeatedMessageOrGroup<is_split, false >(
2306
2308
PROTOBUF_TC_PARAM_PASS);
2307
- case field_layout:: kRepGroup :
2309
+ case WireFormatLite::WIRETYPE_START_GROUP :
2308
2310
PROTOBUF_MUSTTAIL return MpRepeatedMessageOrGroup<is_split, true >(
2309
2311
PROTOBUF_TC_PARAM_PASS);
2310
2312
default :
2311
2313
PROTOBUF_MUSTTAIL return table->fallback (PROTOBUF_TC_PARAM_PASS);
2312
2314
}
2313
2315
}
2314
-
2315
- const uint32_t decoded_tag = data.tag ();
2316
- const uint32_t decoded_wiretype = decoded_tag & 7 ;
2317
2316
const uint16_t rep = type_card & field_layout::kRepMask ;
2318
- const bool is_group = rep == field_layout::kRepGroup ;
2319
-
2320
- // Validate wiretype:
2321
- switch (rep) {
2322
- case field_layout::kRepMessage :
2323
- if (decoded_wiretype != WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
2324
- goto fallback;
2325
- }
2326
- break ;
2327
- case field_layout::kRepGroup :
2328
- if (decoded_wiretype != WireFormatLite::WIRETYPE_START_GROUP) {
2329
- goto fallback;
2330
- }
2331
- break ;
2332
- default : {
2333
- fallback:
2334
- PROTOBUF_MUSTTAIL return table->fallback (PROTOBUF_TC_PARAM_PASS);
2335
- }
2317
+ // note that we solely rely on wiretype for parsing messages (schema ignored)
2318
+ const bool is_group =
2319
+ decoded_wiretype == WireFormatLite::WIRETYPE_START_GROUP;
2320
+
2321
+ // If we don't see a wiretype of START_GROUP or DELIM even though we're in the
2322
+ // entry point for MpMessage, something is wrong. Bail out!
2323
+ if (decoded_wiretype != WireFormatLite::WIRETYPE_START_GROUP &&
2324
+ decoded_wiretype != WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
2325
+ PROTOBUF_MUSTTAIL return table->fallback (PROTOBUF_TC_PARAM_PASS);
2336
2326
}
2337
2327
2328
+
2338
2329
const bool is_oneof = card == field_layout::kFcOneof ;
2339
2330
bool need_init = false ;
2340
2331
if (card == field_layout::kFcOptional ) {
@@ -2386,14 +2377,10 @@ const char* TcParser::MpRepeatedMessageOrGroup(PROTOBUF_TC_PARAM_DECL) {
2386
2377
2387
2378
// Validate wiretype:
2388
2379
if (!is_group) {
2389
- ABSL_DCHECK_EQ (type_card & field_layout::kRepMask ,
2390
- static_cast <uint16_t >(field_layout::kRepMessage ));
2391
2380
if (decoded_wiretype != WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
2392
2381
PROTOBUF_MUSTTAIL return table->fallback (PROTOBUF_TC_PARAM_PASS);
2393
2382
}
2394
2383
} else {
2395
- ABSL_DCHECK_EQ (type_card & field_layout::kRepMask ,
2396
- static_cast <uint16_t >(field_layout::kRepGroup ));
2397
2384
if (decoded_wiretype != WireFormatLite::WIRETYPE_START_GROUP) {
2398
2385
PROTOBUF_MUSTTAIL return table->fallback (PROTOBUF_TC_PARAM_PASS);
2399
2386
}
0 commit comments