Skip to content

Commit d814902

Browse files
honglookercopybara-github
authored andcommitted
Allow messages to be parsed length-prefix or by groups in cpp
PiperOrigin-RevId: 617275654
1 parent 61a079f commit d814902

File tree

1 file changed

+25
-29
lines changed

1 file changed

+25
-29
lines changed

src/google/protobuf/generated_message_tctable_lite.cc

+25-29
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,13 @@ PROTOBUF_NOINLINE const char* TcParser::FastEndG2(PROTOBUF_TC_PARAM_DECL) {
383383
template <typename TagType, bool group_coding, bool aux_is_table>
384384
inline PROTOBUF_ALWAYS_INLINE const char* TcParser::SingularParseMessageAuxImpl(
385385
PROTOBUF_TC_PARAM_DECL) {
386+
/*
387+
const uint32_t decoded_tag = data.tag();
388+
const uint32_t decoded_wiretype = decoded_tag & 7;
389+
if (decoded_wiretype == WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
390+
PROTOBUF_MUSTTAIL return MpPackedFixed(PROTOBUF_TC_PARAM_PASS);
391+
}*/
392+
386393
if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
387394
PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_NO_DATA_PASS);
388395
}
@@ -2326,44 +2333,37 @@ PROTOBUF_NOINLINE const char* TcParser::MpMessage(PROTOBUF_TC_PARAM_DECL) {
23262333
const uint16_t type_card = entry.type_card;
23272334
const uint16_t card = type_card & field_layout::kFcMask;
23282335

2336+
const uint32_t decoded_tag = data.tag();
2337+
const uint32_t decoded_wiretype = decoded_tag & 7;
2338+
23292339
// Check for repeated parsing:
23302340
if (card == field_layout::kFcRepeated) {
2331-
const uint16_t rep = type_card & field_layout::kRepMask;
2332-
switch (rep) {
2333-
case field_layout::kRepMessage:
2341+
switch (decoded_wiretype) {
2342+
case WireFormatLite::WIRETYPE_LENGTH_DELIMITED:
23342343
PROTOBUF_MUSTTAIL return MpRepeatedMessageOrGroup<is_split, false>(
23352344
PROTOBUF_TC_PARAM_PASS);
2336-
case field_layout::kRepGroup:
2345+
case WireFormatLite::WIRETYPE_START_GROUP:
23372346
PROTOBUF_MUSTTAIL return MpRepeatedMessageOrGroup<is_split, true>(
23382347
PROTOBUF_TC_PARAM_PASS);
23392348
default:
23402349
PROTOBUF_MUSTTAIL return table->fallback(PROTOBUF_TC_PARAM_PASS);
23412350
}
23422351
}
2343-
2344-
const uint32_t decoded_tag = data.tag();
2345-
const uint32_t decoded_wiretype = decoded_tag & 7;
23462352
const uint16_t rep = type_card & field_layout::kRepMask;
2347-
const bool is_group = rep == field_layout::kRepGroup;
2348-
2349-
// Validate wiretype:
2350-
switch (rep) {
2351-
case field_layout::kRepMessage:
2352-
if (decoded_wiretype != WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
2353-
goto fallback;
2354-
}
2355-
break;
2356-
case field_layout::kRepGroup:
2357-
if (decoded_wiretype != WireFormatLite::WIRETYPE_START_GROUP) {
2358-
goto fallback;
2359-
}
2360-
break;
2361-
default: {
2362-
fallback:
2363-
PROTOBUF_MUSTTAIL return table->fallback(PROTOBUF_TC_PARAM_PASS);
2364-
}
2353+
// note that we solely rely on wiretype for parsing messages (schema ignored)
2354+
const bool is_group =
2355+
decoded_wiretype == WireFormatLite::WIRETYPE_START_GROUP;
2356+
// handle the aberrant case where we just have a sole EGROUP
2357+
if (decoded_wiretype == WireFormatLite::WIRETYPE_END_GROUP) {
2358+
PROTOBUF_MUSTTAIL return table->fallback(PROTOBUF_TC_PARAM_PASS);
23652359
}
23662360

2361+
// only validate schema for lazy fields
2362+
2363+
// remark: initially tried invoking FastGdS1 upon seeing wiretype_group but
2364+
// got unit test failures
2365+
// PROTOBUF_MUSTTAIL return FastGdS1(PROTOBUF_TC_PARAM_PASS);
2366+
23672367
const bool is_oneof = card == field_layout::kFcOneof;
23682368
bool need_init = false;
23692369
if (card == field_layout::kFcOptional) {
@@ -2415,14 +2415,10 @@ const char* TcParser::MpRepeatedMessageOrGroup(PROTOBUF_TC_PARAM_DECL) {
24152415

24162416
// Validate wiretype:
24172417
if (!is_group) {
2418-
ABSL_DCHECK_EQ(type_card & field_layout::kRepMask,
2419-
static_cast<uint16_t>(field_layout::kRepMessage));
24202418
if (decoded_wiretype != WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
24212419
PROTOBUF_MUSTTAIL return table->fallback(PROTOBUF_TC_PARAM_PASS);
24222420
}
24232421
} else {
2424-
ABSL_DCHECK_EQ(type_card & field_layout::kRepMask,
2425-
static_cast<uint16_t>(field_layout::kRepGroup));
24262422
if (decoded_wiretype != WireFormatLite::WIRETYPE_START_GROUP) {
24272423
PROTOBUF_MUSTTAIL return table->fallback(PROTOBUF_TC_PARAM_PASS);
24282424
}

0 commit comments

Comments
 (0)