generated_message_table_driven_lite.h 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. #ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__
  31. #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__
  32. #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
  33. #include <google/protobuf/extension_set.h>
  34. #include <google/protobuf/generated_message_table_driven.h>
  35. #include <google/protobuf/implicit_weak_message.h>
  36. #include <google/protobuf/inlined_string_field.h>
  37. #include <google/protobuf/repeated_field.h>
  38. #include <google/protobuf/wire_format_lite.h>
  39. #include <type_traits>
  40. #include <google/protobuf/port_def.inc>
  41. namespace google {
  42. namespace protobuf {
  43. namespace internal {
  44. enum StringType {
  45. StringType_STRING = 0,
  46. StringType_INLINED = 3
  47. };
  48. // Logically a superset of StringType, consisting of all field types that
  49. // require special initialization.
  50. enum ProcessingType {
  51. ProcessingType_STRING = 0,
  52. ProcessingType_CORD = 1,
  53. ProcessingType_STRING_PIECE = 2,
  54. ProcessingType_INLINED = 3,
  55. ProcessingType_MESSAGE = 4,
  56. };
  57. enum Cardinality {
  58. Cardinality_SINGULAR = 0,
  59. Cardinality_REPEATED = 1,
  60. Cardinality_ONEOF = 3
  61. };
  62. template <typename Type>
  63. inline Type* Raw(MessageLite* msg, int64_t offset) {
  64. return reinterpret_cast<Type*>(reinterpret_cast<uint8_t*>(msg) + offset);
  65. }
  66. template <typename Type>
  67. inline const Type* Raw(const MessageLite* msg, int64_t offset) {
  68. return reinterpret_cast<const Type*>(reinterpret_cast<const uint8_t*>(msg) +
  69. offset);
  70. }
  71. inline ExtensionSet* GetExtensionSet(MessageLite* msg,
  72. int64_t extension_offset) {
  73. if (extension_offset == -1) {
  74. return nullptr;
  75. }
  76. return Raw<ExtensionSet>(msg, extension_offset);
  77. }
  78. template <typename Type>
  79. inline Type* AddField(MessageLite* msg, int64_t offset) {
  80. static_assert(std::is_trivial<Type>::value ||
  81. std::is_same<Type, InlinedStringField>::value,
  82. "Do not assign");
  83. RepeatedField<Type>* repeated = Raw<RepeatedField<Type>>(msg, offset);
  84. return repeated->Add();
  85. }
  86. template <>
  87. inline std::string* AddField<std::string>(MessageLite* msg, int64_t offset) {
  88. RepeatedPtrField<std::string>* repeated =
  89. Raw<RepeatedPtrField<std::string>>(msg, offset);
  90. return repeated->Add();
  91. }
  92. template <typename Type>
  93. inline void AddField(MessageLite* msg, int64_t offset, Type value) {
  94. static_assert(std::is_trivial<Type>::value, "Do not assign");
  95. *AddField<Type>(msg, offset) = value;
  96. }
  97. inline void SetBit(uint32_t* has_bits, uint32_t has_bit_index) {
  98. GOOGLE_DCHECK(has_bits != nullptr);
  99. uint32_t mask = static_cast<uint32_t>(1u) << (has_bit_index % 32);
  100. has_bits[has_bit_index / 32u] |= mask;
  101. }
  102. template <typename Type>
  103. inline Type* MutableField(MessageLite* msg, uint32_t* has_bits,
  104. uint32_t has_bit_index, int64_t offset) {
  105. SetBit(has_bits, has_bit_index);
  106. return Raw<Type>(msg, offset);
  107. }
  108. template <typename Type>
  109. inline void SetField(MessageLite* msg, uint32_t* has_bits,
  110. uint32_t has_bit_index, int64_t offset, Type value) {
  111. static_assert(std::is_trivial<Type>::value, "Do not assign");
  112. *MutableField<Type>(msg, has_bits, has_bit_index, offset) = value;
  113. }
  114. template <typename Type>
  115. inline void SetOneofField(MessageLite* msg, uint32_t* oneof_case,
  116. uint32_t oneof_case_index, int64_t offset,
  117. int field_number, Type value) {
  118. oneof_case[oneof_case_index] = field_number;
  119. *Raw<Type>(msg, offset) = value;
  120. }
  121. // Clears a oneof field. The field argument should correspond to the particular
  122. // field that is currently set in the oneof.
  123. inline void ClearOneofField(const ParseTableField& field, Arena* arena,
  124. MessageLite* msg) {
  125. switch (field.processing_type & kTypeMask) {
  126. case WireFormatLite::TYPE_MESSAGE:
  127. if (arena == nullptr) {
  128. delete *Raw<MessageLite*>(msg, field.offset);
  129. }
  130. break;
  131. case WireFormatLite::TYPE_STRING:
  132. case WireFormatLite::TYPE_BYTES:
  133. Raw<ArenaStringPtr>(msg, field.offset)
  134. ->Destroy(ArenaStringPtr::EmptyDefault{}, arena);
  135. break;
  136. case TYPE_STRING_INLINED:
  137. case TYPE_BYTES_INLINED:
  138. Raw<InlinedStringField>(msg, field.offset)->DestroyNoArena(nullptr);
  139. break;
  140. default:
  141. // No cleanup needed.
  142. break;
  143. }
  144. }
  145. // Clears and reinitializes a oneof field as necessary, in preparation for
  146. // parsing a new value with type field_type and field number field_number.
  147. //
  148. // Note: the oneof_case argument should point directly to the _oneof_case_
  149. // element corresponding to this particular oneof, not to the beginning of the
  150. // _oneof_case_ array.
  151. template <ProcessingType field_type>
  152. inline void ResetOneofField(const ParseTable& table, int field_number,
  153. Arena* arena, MessageLite* msg,
  154. uint32_t* oneof_case, int64_t offset,
  155. const void* default_ptr) {
  156. if (static_cast<int64_t>(*oneof_case) == field_number) {
  157. // The oneof is already set to the right type, so there is no need to clear
  158. // it.
  159. return;
  160. }
  161. if (*oneof_case != 0) {
  162. ClearOneofField(table.fields[*oneof_case], arena, msg);
  163. }
  164. *oneof_case = field_number;
  165. switch (field_type) {
  166. case ProcessingType_STRING:
  167. Raw<ArenaStringPtr>(msg, offset)
  168. ->UnsafeSetDefault(static_cast<const std::string*>(default_ptr));
  169. break;
  170. case ProcessingType_INLINED:
  171. new (Raw<InlinedStringField>(msg, offset))
  172. InlinedStringField(*static_cast<const std::string*>(default_ptr));
  173. break;
  174. case ProcessingType_MESSAGE:
  175. MessageLite** submessage = Raw<MessageLite*>(msg, offset);
  176. const MessageLite* prototype =
  177. table.aux[field_number].messages.default_message();
  178. *submessage = prototype->New(arena);
  179. break;
  180. }
  181. }
  182. template <typename UnknownFieldHandler, Cardinality cardinality,
  183. bool is_string_type, StringType ctype>
  184. static inline bool HandleString(io::CodedInputStream* input, MessageLite* msg,
  185. Arena* arena, uint32_t* has_bits,
  186. uint32_t has_bit_index, int64_t offset,
  187. const void* default_ptr,
  188. const char* field_name) {
  189. StringPiece utf8_string_data;
  190. #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  191. constexpr bool kValidateUtf8 = is_string_type;
  192. #else
  193. constexpr bool kValidateUtf8 = false;
  194. #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  195. switch (ctype) {
  196. case StringType_INLINED: {
  197. std::string* value = nullptr;
  198. switch (cardinality) {
  199. case Cardinality_SINGULAR: {
  200. // TODO(ckennelly): Is this optimal?
  201. InlinedStringField* s = MutableField<InlinedStringField>(
  202. msg, has_bits, has_bit_index, offset);
  203. value = s->UnsafeMutablePointer();
  204. } break;
  205. case Cardinality_REPEATED: {
  206. value = AddField<std::string>(msg, offset);
  207. } break;
  208. case Cardinality_ONEOF: {
  209. InlinedStringField* s = Raw<InlinedStringField>(msg, offset);
  210. value = s->UnsafeMutablePointer();
  211. } break;
  212. }
  213. GOOGLE_DCHECK(value != nullptr);
  214. if (PROTOBUF_PREDICT_FALSE(!WireFormatLite::ReadString(input, value))) {
  215. return false;
  216. }
  217. utf8_string_data = *value;
  218. break;
  219. }
  220. case StringType_STRING: {
  221. switch (cardinality) {
  222. case Cardinality_SINGULAR: {
  223. ArenaStringPtr* field = MutableField<ArenaStringPtr>(
  224. msg, has_bits, has_bit_index, offset);
  225. std::string* value = field->MutableNoCopy(
  226. static_cast<const std::string*>(default_ptr), arena);
  227. if (PROTOBUF_PREDICT_FALSE(
  228. !WireFormatLite::ReadString(input, value))) {
  229. return false;
  230. }
  231. utf8_string_data = field->Get();
  232. } break;
  233. case Cardinality_REPEATED: {
  234. std::string* value = AddField<std::string>(msg, offset);
  235. if (PROTOBUF_PREDICT_FALSE(
  236. !WireFormatLite::ReadString(input, value))) {
  237. return false;
  238. }
  239. utf8_string_data = *value;
  240. } break;
  241. case Cardinality_ONEOF: {
  242. ArenaStringPtr* field = Raw<ArenaStringPtr>(msg, offset);
  243. std::string* value = field->MutableNoCopy(
  244. static_cast<const std::string*>(default_ptr), arena);
  245. if (PROTOBUF_PREDICT_FALSE(
  246. !WireFormatLite::ReadString(input, value))) {
  247. return false;
  248. }
  249. utf8_string_data = field->Get();
  250. } break;
  251. default:
  252. PROTOBUF_ASSUME(false);
  253. }
  254. break;
  255. }
  256. default:
  257. PROTOBUF_ASSUME(false);
  258. }
  259. if (kValidateUtf8) {
  260. // TODO(b/118759213): fail if proto3
  261. WireFormatLite::VerifyUtf8String(utf8_string_data.data(),
  262. utf8_string_data.length(),
  263. WireFormatLite::PARSE, field_name);
  264. }
  265. return true;
  266. }
  267. template <typename UnknownFieldHandler, Cardinality cardinality>
  268. inline bool HandleEnum(const ParseTable& table, io::CodedInputStream* input,
  269. MessageLite* msg, uint32_t* presence,
  270. uint32_t presence_index, int64_t offset, uint32_t tag,
  271. int field_number) {
  272. int value;
  273. if (PROTOBUF_PREDICT_FALSE(
  274. (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
  275. input, &value)))) {
  276. return false;
  277. }
  278. AuxiliaryParseTableField::EnumValidator validator =
  279. table.aux[field_number].enums.validator;
  280. if (validator == nullptr || validator(value)) {
  281. switch (cardinality) {
  282. case Cardinality_SINGULAR:
  283. SetField(msg, presence, presence_index, offset, value);
  284. break;
  285. case Cardinality_REPEATED:
  286. AddField(msg, offset, value);
  287. break;
  288. case Cardinality_ONEOF:
  289. ClearOneofField(table.fields[presence[presence_index]], msg->GetArena(),
  290. msg);
  291. SetOneofField(msg, presence, presence_index, offset, field_number,
  292. value);
  293. break;
  294. default:
  295. PROTOBUF_ASSUME(false);
  296. }
  297. } else {
  298. UnknownFieldHandler::Varint(msg, table, tag, value);
  299. }
  300. return true;
  301. }
  302. // RepeatedMessageTypeHandler allows us to operate on RepeatedPtrField fields
  303. // without instantiating the specific template.
  304. class RepeatedMessageTypeHandler {
  305. public:
  306. typedef MessageLite Type;
  307. typedef MessageLite WeakType;
  308. static Arena* GetArena(Type* t) { return t->GetArena(); }
  309. static inline Type* NewFromPrototype(const Type* prototype,
  310. Arena* arena = nullptr) {
  311. return prototype->New(arena);
  312. }
  313. static void Delete(Type* t, Arena* arena = nullptr) {
  314. if (arena == nullptr) {
  315. delete t;
  316. }
  317. }
  318. };
  319. class MergePartialFromCodedStreamHelper {
  320. public:
  321. static MessageLite* Add(RepeatedPtrFieldBase* field,
  322. const MessageLite* prototype) {
  323. return field->Add<RepeatedMessageTypeHandler>(
  324. const_cast<MessageLite*>(prototype));
  325. }
  326. };
  327. template <typename UnknownFieldHandler, uint32_t kMaxTag>
  328. bool MergePartialFromCodedStreamInlined(MessageLite* msg,
  329. const ParseTable& table,
  330. io::CodedInputStream* input) {
  331. // We require that has_bits are present, as to avoid having to check for them
  332. // for every field.
  333. //
  334. // TODO(ckennelly): Make this a compile-time parameter with templates.
  335. GOOGLE_DCHECK_GE(table.has_bits_offset, 0);
  336. uint32_t* has_bits = Raw<uint32_t>(msg, table.has_bits_offset);
  337. GOOGLE_DCHECK(has_bits != nullptr);
  338. while (true) {
  339. uint32_t tag = input->ReadTagWithCutoffNoLastTag(kMaxTag).first;
  340. const WireFormatLite::WireType wire_type =
  341. WireFormatLite::GetTagWireType(tag);
  342. const int field_number = WireFormatLite::GetTagFieldNumber(tag);
  343. if (PROTOBUF_PREDICT_FALSE(field_number > table.max_field_number)) {
  344. // check for possible extensions
  345. if (UnknownFieldHandler::ParseExtension(msg, table, input, tag)) {
  346. // successfully parsed
  347. continue;
  348. }
  349. if (PROTOBUF_PREDICT_FALSE(
  350. !UnknownFieldHandler::Skip(msg, table, input, tag))) {
  351. return false;
  352. }
  353. continue;
  354. }
  355. // We implicitly verify that data points to a valid field as we check the
  356. // wire types. Entries in table.fields[i] that do not correspond to valid
  357. // field numbers have their normal_wiretype and packed_wiretype fields set
  358. // with the kInvalidMask value. As wire_type cannot take on that value, we
  359. // will never match.
  360. const ParseTableField* data = table.fields + field_number;
  361. // TODO(ckennelly): Avoid sign extension
  362. const int64_t presence_index = data->presence_index;
  363. const int64_t offset = data->offset;
  364. const unsigned char processing_type = data->processing_type;
  365. if (data->normal_wiretype == static_cast<unsigned char>(wire_type)) {
  366. switch (processing_type) {
  367. #define HANDLE_TYPE(TYPE, CPPTYPE) \
  368. case (WireFormatLite::TYPE_##TYPE): { \
  369. CPPTYPE value; \
  370. if (PROTOBUF_PREDICT_FALSE( \
  371. (!WireFormatLite::ReadPrimitive< \
  372. CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) { \
  373. return false; \
  374. } \
  375. SetField(msg, has_bits, presence_index, offset, value); \
  376. break; \
  377. } \
  378. case (WireFormatLite::TYPE_##TYPE) | kRepeatedMask: { \
  379. RepeatedField<CPPTYPE>* values = Raw<RepeatedField<CPPTYPE>>(msg, offset); \
  380. if (PROTOBUF_PREDICT_FALSE((!WireFormatLite::ReadRepeatedPrimitive< \
  381. CPPTYPE, WireFormatLite::TYPE_##TYPE>( \
  382. data->tag_size, tag, input, values)))) { \
  383. return false; \
  384. } \
  385. break; \
  386. } \
  387. case (WireFormatLite::TYPE_##TYPE) | kOneofMask: { \
  388. uint32_t* oneof_case = Raw<uint32_t>(msg, table.oneof_case_offset); \
  389. CPPTYPE value; \
  390. if (PROTOBUF_PREDICT_FALSE( \
  391. (!WireFormatLite::ReadPrimitive< \
  392. CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) { \
  393. return false; \
  394. } \
  395. ClearOneofField(table.fields[oneof_case[presence_index]], msg->GetArena(), \
  396. msg); \
  397. SetOneofField(msg, oneof_case, presence_index, offset, field_number, \
  398. value); \
  399. break; \
  400. }
  401. HANDLE_TYPE(INT32, int32_t)
  402. HANDLE_TYPE(INT64, int64_t)
  403. HANDLE_TYPE(SINT32, int32_t)
  404. HANDLE_TYPE(SINT64, int64_t)
  405. HANDLE_TYPE(UINT32, uint32_t)
  406. HANDLE_TYPE(UINT64, uint64_t)
  407. HANDLE_TYPE(FIXED32, uint32_t)
  408. HANDLE_TYPE(FIXED64, uint64_t)
  409. HANDLE_TYPE(SFIXED32, int32_t)
  410. HANDLE_TYPE(SFIXED64, int64_t)
  411. HANDLE_TYPE(FLOAT, float)
  412. HANDLE_TYPE(DOUBLE, double)
  413. HANDLE_TYPE(BOOL, bool)
  414. #undef HANDLE_TYPE
  415. case WireFormatLite::TYPE_BYTES:
  416. #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  417. case WireFormatLite::TYPE_STRING:
  418. #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  419. {
  420. Arena* const arena = msg->GetArena();
  421. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  422. if (PROTOBUF_PREDICT_FALSE(
  423. (!HandleString<UnknownFieldHandler, Cardinality_SINGULAR,
  424. false, StringType_STRING>(
  425. input, msg, arena, has_bits, presence_index, offset,
  426. default_ptr, nullptr)))) {
  427. return false;
  428. }
  429. break;
  430. }
  431. case TYPE_BYTES_INLINED:
  432. #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  433. case TYPE_STRING_INLINED:
  434. #endif // !GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  435. {
  436. Arena* const arena = msg->GetArena();
  437. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  438. if (PROTOBUF_PREDICT_FALSE(
  439. (!HandleString<UnknownFieldHandler, Cardinality_SINGULAR,
  440. false, StringType_INLINED>(
  441. input, msg, arena, has_bits, presence_index, offset,
  442. default_ptr, nullptr)))) {
  443. return false;
  444. }
  445. break;
  446. }
  447. case WireFormatLite::TYPE_BYTES | kOneofMask:
  448. #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  449. case WireFormatLite::TYPE_STRING | kOneofMask:
  450. #endif // !GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  451. {
  452. Arena* const arena = msg->GetArena();
  453. uint32_t* oneof_case = Raw<uint32_t>(msg, table.oneof_case_offset);
  454. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  455. ResetOneofField<ProcessingType_STRING>(
  456. table, field_number, arena, msg, oneof_case + presence_index,
  457. offset, default_ptr);
  458. if (PROTOBUF_PREDICT_FALSE(
  459. (!HandleString<UnknownFieldHandler, Cardinality_ONEOF, false,
  460. StringType_STRING>(input, msg, arena, has_bits,
  461. presence_index, offset,
  462. default_ptr, nullptr)))) {
  463. return false;
  464. }
  465. break;
  466. }
  467. case (WireFormatLite::TYPE_BYTES) | kRepeatedMask:
  468. case TYPE_BYTES_INLINED | kRepeatedMask:
  469. #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  470. case (WireFormatLite::TYPE_STRING) | kRepeatedMask:
  471. case TYPE_STRING_INLINED | kRepeatedMask:
  472. #endif // !GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  473. {
  474. Arena* const arena = msg->GetArena();
  475. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  476. if (PROTOBUF_PREDICT_FALSE(
  477. (!HandleString<UnknownFieldHandler, Cardinality_REPEATED,
  478. false, StringType_STRING>(
  479. input, msg, arena, has_bits, presence_index, offset,
  480. default_ptr, nullptr)))) {
  481. return false;
  482. }
  483. break;
  484. }
  485. #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  486. case (WireFormatLite::TYPE_STRING): {
  487. Arena* const arena = msg->GetArena();
  488. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  489. const char* field_name = table.aux[field_number].strings.field_name;
  490. if (PROTOBUF_PREDICT_FALSE(
  491. (!HandleString<UnknownFieldHandler, Cardinality_SINGULAR,
  492. true, StringType_STRING>(
  493. input, msg, arena, has_bits, presence_index, offset,
  494. default_ptr, field_name)))) {
  495. return false;
  496. }
  497. break;
  498. }
  499. case TYPE_STRING_INLINED | kRepeatedMask:
  500. case (WireFormatLite::TYPE_STRING) | kRepeatedMask: {
  501. Arena* const arena = msg->GetArena();
  502. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  503. const char* field_name = table.aux[field_number].strings.field_name;
  504. if (PROTOBUF_PREDICT_FALSE(
  505. (!HandleString<UnknownFieldHandler, Cardinality_REPEATED,
  506. true, StringType_STRING>(
  507. input, msg, arena, has_bits, presence_index, offset,
  508. default_ptr, field_name)))) {
  509. return false;
  510. }
  511. break;
  512. }
  513. case (WireFormatLite::TYPE_STRING) | kOneofMask: {
  514. Arena* const arena = msg->GetArena();
  515. uint32_t* oneof_case = Raw<uint32_t>(msg, table.oneof_case_offset);
  516. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  517. const char* field_name = table.aux[field_number].strings.field_name;
  518. ResetOneofField<ProcessingType_STRING>(
  519. table, field_number, arena, msg, oneof_case + presence_index,
  520. offset, default_ptr);
  521. if (PROTOBUF_PREDICT_FALSE(
  522. (!HandleString<UnknownFieldHandler, Cardinality_ONEOF, true,
  523. StringType_STRING>(
  524. input, msg, arena, has_bits, presence_index, offset,
  525. default_ptr, field_name)))) {
  526. return false;
  527. }
  528. break;
  529. }
  530. #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  531. case WireFormatLite::TYPE_ENUM: {
  532. if (PROTOBUF_PREDICT_FALSE(
  533. (!HandleEnum<UnknownFieldHandler, Cardinality_SINGULAR>(
  534. table, input, msg, has_bits, presence_index, offset, tag,
  535. field_number)))) {
  536. return false;
  537. }
  538. break;
  539. }
  540. case WireFormatLite::TYPE_ENUM | kRepeatedMask: {
  541. if (PROTOBUF_PREDICT_FALSE(
  542. (!HandleEnum<UnknownFieldHandler, Cardinality_REPEATED>(
  543. table, input, msg, has_bits, presence_index, offset, tag,
  544. field_number)))) {
  545. return false;
  546. }
  547. break;
  548. }
  549. case WireFormatLite::TYPE_ENUM | kOneofMask: {
  550. uint32_t* oneof_case = Raw<uint32_t>(msg, table.oneof_case_offset);
  551. if (PROTOBUF_PREDICT_FALSE(
  552. (!HandleEnum<UnknownFieldHandler, Cardinality_ONEOF>(
  553. table, input, msg, oneof_case, presence_index, offset,
  554. tag, field_number)))) {
  555. return false;
  556. }
  557. break;
  558. }
  559. case WireFormatLite::TYPE_GROUP: {
  560. MessageLite** submsg_holder =
  561. MutableField<MessageLite*>(msg, has_bits, presence_index, offset);
  562. MessageLite* submsg = *submsg_holder;
  563. if (submsg == nullptr) {
  564. Arena* const arena = msg->GetArena();
  565. const MessageLite* prototype =
  566. table.aux[field_number].messages.default_message();
  567. submsg = prototype->New(arena);
  568. *submsg_holder = submsg;
  569. }
  570. if (PROTOBUF_PREDICT_FALSE(
  571. !WireFormatLite::ReadGroup(field_number, input, submsg))) {
  572. return false;
  573. }
  574. break;
  575. }
  576. case WireFormatLite::TYPE_GROUP | kRepeatedMask: {
  577. RepeatedPtrFieldBase* field = Raw<RepeatedPtrFieldBase>(msg, offset);
  578. const MessageLite* prototype =
  579. table.aux[field_number].messages.default_message();
  580. GOOGLE_DCHECK(prototype != nullptr);
  581. MessageLite* submsg =
  582. MergePartialFromCodedStreamHelper::Add(field, prototype);
  583. if (PROTOBUF_PREDICT_FALSE(
  584. !WireFormatLite::ReadGroup(field_number, input, submsg))) {
  585. return false;
  586. }
  587. break;
  588. }
  589. case WireFormatLite::TYPE_MESSAGE: {
  590. MessageLite** submsg_holder =
  591. MutableField<MessageLite*>(msg, has_bits, presence_index, offset);
  592. MessageLite* submsg = *submsg_holder;
  593. if (submsg == nullptr) {
  594. Arena* const arena = msg->GetArena();
  595. const MessageLite* prototype =
  596. table.aux[field_number].messages.default_message();
  597. if (prototype == nullptr) {
  598. prototype = ImplicitWeakMessage::default_instance();
  599. }
  600. submsg = prototype->New(arena);
  601. *submsg_holder = submsg;
  602. }
  603. if (PROTOBUF_PREDICT_FALSE(
  604. !WireFormatLite::ReadMessage(input, submsg))) {
  605. return false;
  606. }
  607. break;
  608. }
  609. // TODO(ckennelly): Adapt ReadMessageNoVirtualNoRecursionDepth and
  610. // manage input->IncrementRecursionDepth() here.
  611. case WireFormatLite::TYPE_MESSAGE | kRepeatedMask: {
  612. RepeatedPtrFieldBase* field = Raw<RepeatedPtrFieldBase>(msg, offset);
  613. const MessageLite* prototype =
  614. table.aux[field_number].messages.default_message();
  615. if (prototype == nullptr) {
  616. prototype = ImplicitWeakMessage::default_instance();
  617. }
  618. MessageLite* submsg =
  619. MergePartialFromCodedStreamHelper::Add(field, prototype);
  620. if (PROTOBUF_PREDICT_FALSE(
  621. !WireFormatLite::ReadMessage(input, submsg))) {
  622. return false;
  623. }
  624. break;
  625. }
  626. case WireFormatLite::TYPE_MESSAGE | kOneofMask: {
  627. Arena* const arena = msg->GetArena();
  628. uint32_t* oneof_case = Raw<uint32_t>(msg, table.oneof_case_offset);
  629. MessageLite** submsg_holder = Raw<MessageLite*>(msg, offset);
  630. ResetOneofField<ProcessingType_MESSAGE>(
  631. table, field_number, arena, msg, oneof_case + presence_index,
  632. offset, nullptr);
  633. MessageLite* submsg = *submsg_holder;
  634. if (PROTOBUF_PREDICT_FALSE(
  635. !WireFormatLite::ReadMessage(input, submsg))) {
  636. return false;
  637. }
  638. break;
  639. }
  640. #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  641. case TYPE_STRING_INLINED: {
  642. Arena* const arena = msg->GetArena();
  643. const void* default_ptr = table.aux[field_number].strings.default_ptr;
  644. const char* field_name = table.aux[field_number].strings.field_name;
  645. if (PROTOBUF_PREDICT_FALSE(
  646. (!HandleString<UnknownFieldHandler, Cardinality_SINGULAR,
  647. true, StringType_INLINED>(
  648. input, msg, arena, has_bits, presence_index, offset,
  649. default_ptr, field_name)))) {
  650. return false;
  651. }
  652. break;
  653. }
  654. #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
  655. case TYPE_MAP: {
  656. if (PROTOBUF_PREDICT_FALSE(!(*table.aux[field_number].maps.parse_map)(
  657. input, Raw<void>(msg, offset)))) {
  658. return false;
  659. }
  660. break;
  661. }
  662. case 0: {
  663. // Done.
  664. input->SetLastTag(tag);
  665. return true;
  666. }
  667. default:
  668. PROTOBUF_ASSUME(false);
  669. }
  670. } else if (data->packed_wiretype == static_cast<unsigned char>(wire_type)) {
  671. // Non-packable fields have their packed_wiretype masked with
  672. // kNotPackedMask, which is impossible to match here.
  673. GOOGLE_DCHECK(processing_type & kRepeatedMask);
  674. GOOGLE_DCHECK_NE(processing_type, kRepeatedMask);
  675. GOOGLE_DCHECK_EQ(0, processing_type & kOneofMask);
  676. GOOGLE_DCHECK_NE(TYPE_BYTES_INLINED | kRepeatedMask, processing_type);
  677. GOOGLE_DCHECK_NE(TYPE_STRING_INLINED | kRepeatedMask, processing_type);
  678. // Mask out kRepeatedMask bit, allowing the jump table to be smaller.
  679. switch (static_cast<WireFormatLite::FieldType>(processing_type ^
  680. kRepeatedMask)) {
  681. #define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \
  682. case WireFormatLite::TYPE_##TYPE: { \
  683. RepeatedField<CPPTYPE>* values = Raw<RepeatedField<CPPTYPE>>(msg, offset); \
  684. if (PROTOBUF_PREDICT_FALSE( \
  685. (!WireFormatLite::ReadPackedPrimitive< \
  686. CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, values)))) { \
  687. return false; \
  688. } \
  689. break; \
  690. }
  691. HANDLE_PACKED_TYPE(INT32, int32_t, Int32)
  692. HANDLE_PACKED_TYPE(INT64, int64_t, Int64)
  693. HANDLE_PACKED_TYPE(SINT32, int32_t, Int32)
  694. HANDLE_PACKED_TYPE(SINT64, int64_t, Int64)
  695. HANDLE_PACKED_TYPE(UINT32, uint32_t, UInt32)
  696. HANDLE_PACKED_TYPE(UINT64, uint64_t, UInt64)
  697. HANDLE_PACKED_TYPE(FIXED32, uint32_t, UInt32)
  698. HANDLE_PACKED_TYPE(FIXED64, uint64_t, UInt64)
  699. HANDLE_PACKED_TYPE(SFIXED32, int32_t, Int32)
  700. HANDLE_PACKED_TYPE(SFIXED64, int64_t, Int64)
  701. HANDLE_PACKED_TYPE(FLOAT, float, Float)
  702. HANDLE_PACKED_TYPE(DOUBLE, double, Double)
  703. HANDLE_PACKED_TYPE(BOOL, bool, Bool)
  704. #undef HANDLE_PACKED_TYPE
  705. case WireFormatLite::TYPE_ENUM: {
  706. // To avoid unnecessarily calling MutableUnknownFields (which mutates
  707. // InternalMetadata) when all inputs in the repeated series
  708. // are valid, we implement our own parser rather than call
  709. // WireFormat::ReadPackedEnumPreserveUnknowns.
  710. uint32_t length;
  711. if (PROTOBUF_PREDICT_FALSE(!input->ReadVarint32(&length))) {
  712. return false;
  713. }
  714. AuxiliaryParseTableField::EnumValidator validator =
  715. table.aux[field_number].enums.validator;
  716. RepeatedField<int>* values = Raw<RepeatedField<int>>(msg, offset);
  717. io::CodedInputStream::Limit limit = input->PushLimit(length);
  718. while (input->BytesUntilLimit() > 0) {
  719. int value;
  720. if (PROTOBUF_PREDICT_FALSE(
  721. (!WireFormatLite::ReadPrimitive<
  722. int, WireFormatLite::TYPE_ENUM>(input, &value)))) {
  723. return false;
  724. }
  725. if (validator == nullptr || validator(value)) {
  726. values->Add(value);
  727. } else {
  728. // TODO(ckennelly): Consider caching here.
  729. UnknownFieldHandler::Varint(msg, table, tag, value);
  730. }
  731. }
  732. input->PopLimit(limit);
  733. break;
  734. }
  735. case WireFormatLite::TYPE_STRING:
  736. case WireFormatLite::TYPE_GROUP:
  737. case WireFormatLite::TYPE_MESSAGE:
  738. case WireFormatLite::TYPE_BYTES:
  739. GOOGLE_DCHECK(false);
  740. return false;
  741. default:
  742. PROTOBUF_ASSUME(false);
  743. }
  744. } else {
  745. if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) {
  746. // Must be the end of the message.
  747. input->SetLastTag(tag);
  748. return true;
  749. }
  750. // check for possible extensions
  751. if (UnknownFieldHandler::ParseExtension(msg, table, input, tag)) {
  752. // successfully parsed
  753. continue;
  754. }
  755. // process unknown field.
  756. if (PROTOBUF_PREDICT_FALSE(
  757. !UnknownFieldHandler::Skip(msg, table, input, tag))) {
  758. return false;
  759. }
  760. }
  761. }
  762. } // NOLINT(readability/fn_size)
  763. template <typename UnknownFieldHandler>
  764. bool MergePartialFromCodedStreamImpl(MessageLite* msg, const ParseTable& table,
  765. io::CodedInputStream* input) {
  766. // The main beneficial cutoff values are 1 and 2 byte tags.
  767. // Instantiate calls with the appropriate upper tag range
  768. if (table.max_field_number <= (0x7F >> 3)) {
  769. return MergePartialFromCodedStreamInlined<UnknownFieldHandler, 0x7F>(
  770. msg, table, input);
  771. } else if (table.max_field_number <= (0x3FFF >> 3)) {
  772. return MergePartialFromCodedStreamInlined<UnknownFieldHandler, 0x3FFF>(
  773. msg, table, input);
  774. } else {
  775. return MergePartialFromCodedStreamInlined<
  776. UnknownFieldHandler, std::numeric_limits<uint32_t>::max()>(msg, table,
  777. input);
  778. }
  779. }
  780. } // namespace internal
  781. } // namespace protobuf
  782. } // namespace google
  783. #include <google/protobuf/port_undef.inc>
  784. #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__