Go to the documentation of this file.
31 #ifndef GOOGLE_PROTOBUF_PARSE_CONTEXT_H__
32 #define GOOGLE_PROTOBUF_PARSE_CONTEXT_H__
38 #include <google/protobuf/io/coded_stream.h>
39 #include <google/protobuf/io/zero_copy_stream.h>
40 #include <google/protobuf/arena.h>
41 #include <google/protobuf/arenastring.h>
42 #include <google/protobuf/implicit_weak_message.h>
43 #include <google/protobuf/inlined_string_field.h>
44 #include <google/protobuf/metadata_lite.h>
45 #include <google/protobuf/port.h>
46 #include <google/protobuf/repeated_field.h>
47 #include <google/protobuf/wire_format_lite.h>
48 #include <google/protobuf/stubs/strutil.h>
50 #include <google/protobuf/port_def.inc>
109 class PROTOBUF_EXPORT EpsCopyInputStream {
111 enum { kSlopBytes = 16, kMaxCordBytesToCopy = 512 };
114 : aliasing_(enable_aliasing ? kOnPatch : kNoAliasing) {}
120 count =
static_cast<int>(buffer_end_ + kSlopBytes -
ptr);
132 limit +=
static_cast<int>(
ptr - buffer_end_);
133 limit_end_ = buffer_end_ + (
std::min)(0, limit);
134 auto old_limit = limit_;
136 return old_limit - limit;
140 if (PROTOBUF_PREDICT_FALSE(!EndedAtLimit()))
return false;
141 limit_ = limit_ + delta;
144 limit_end_ = buffer_end_ + (
std::min)(0, limit_);
149 if (
size <= buffer_end_ + kSlopBytes -
ptr) {
152 return SkipFallback(
ptr,
size);
156 if (
size <= buffer_end_ + kSlopBytes -
ptr) {
160 return ReadStringFallback(
ptr,
size, s);
164 if (
size <= buffer_end_ + kSlopBytes -
ptr) {
168 return AppendStringFallback(
ptr,
size, s);
171 PROTOBUF_NODISCARD
const char* ReadArenaString(
const char*
ptr,
175 template <
typename Tag,
typename T>
176 PROTOBUF_NODISCARD
const char* ReadRepeatedFixed(
const char*
ptr,
180 template <
typename T>
181 PROTOBUF_NODISCARD
const char* ReadPackedFixed(
const char*
ptr,
int size,
183 template <
typename Add>
184 PROTOBUF_NODISCARD
const char* ReadPackedVarint(
const char*
ptr,
Add add);
188 bool res = last_tag_minus_1_ == start_tag;
189 last_tag_minus_1_ = 0;
197 return ptr > limit_end_ &&
198 (next_chunk_ ==
nullptr ||
ptr - buffer_end_ > limit_);
201 return limit_ +
static_cast<int>(buffer_end_ -
ptr);
213 if (PROTOBUF_PREDICT_TRUE(*
ptr < limit_end_))
return false;
214 int overrun =
static_cast<int>(*
ptr - buffer_end_);
220 if (overrun > 0 && next_chunk_ ==
nullptr) *
ptr =
nullptr;
223 auto res = DoneFallback(overrun, d);
230 if (flat.
size() > kSlopBytes) {
232 limit_end_ = buffer_end_ = flat.
data() + flat.
size() - kSlopBytes;
234 if (aliasing_ == kOnPatch) aliasing_ = kNoDelta;
240 next_chunk_ =
nullptr;
241 if (aliasing_ == kOnPatch) {
252 if (limit == -1)
return InitFrom(zcis);
253 overall_limit_ = limit;
254 auto res = InitFrom(zcis);
255 limit_ = limit -
static_cast<int>(buffer_end_ - res);
256 limit_end_ = buffer_end_ + (
std::min)(0, limit_);
261 const char* limit_end_;
262 const char* buffer_end_;
263 const char* next_chunk_;
267 char buffer_[2 * kSlopBytes] = {};
268 enum { kNoAliasing = 0, kOnPatch = 1, kNoDelta = 2 };
284 int overall_limit_ = INT_MAX;
287 enum { kSafeStringSize = 50000000 };
296 std::pair<const char*, bool> DoneFallback(
int overrun,
int depth);
308 inline const char* NextBuffer(
int overrun,
int depth);
309 const char* SkipFallback(
const char*
ptr,
int size);
314 if (res) overall_limit_ -=
size_;
319 overall_limit_ +=
count;
322 template <
typename A>
324 int chunk_size = buffer_end_ + kSlopBytes -
ptr;
327 if (next_chunk_ ==
nullptr)
return nullptr;
328 append(
ptr, chunk_size);
334 if (limit_ <= kSlopBytes)
return nullptr;
336 if (
ptr ==
nullptr)
return nullptr;
338 chunk_size = buffer_end_ + kSlopBytes -
ptr;
339 }
while (
size > chunk_size);
349 template <
typename A>
351 if (
ptr - buffer_end_ > limit_)
return nullptr;
352 while (limit_ > kSlopBytes) {
353 size_t chunk_size = buffer_end_ + kSlopBytes -
ptr;
354 append(
ptr, chunk_size);
356 if (
ptr ==
nullptr)
return limit_end_;
359 auto end = buffer_end_ + limit_;
367 return AppendUntilEnd(
368 ptr, [
str](
const char* p, ptrdiff_t s) {
str->append(p, s); });
377 class PROTOBUF_EXPORT ParseContext :
public EpsCopyInputStream {
385 template <
typename...
T>
388 *
start = InitFrom(std::forward<T>(
args)...);
393 bool Done(
const char**
ptr) {
return DoneWithCheck(
ptr, group_depth_); }
405 template <
typename T,
410 template <
typename T>
411 PROTOBUF_NODISCARD PROTOBUF_NDEBUG_INLINE
const char*
ParseGroup(
413 if (--
depth_ < 0)
return nullptr;
418 if (PROTOBUF_PREDICT_FALSE(!ConsumeEndGroup(
tag)))
return nullptr;
431 PROTOBUF_NODISCARD
const char* ReadSizeAndPushLimitAndDepth(
const char*
ptr,
442 int group_depth_ = INT_MIN;
446 template <u
int32_t tag>
449 return *
ptr ==
static_cast<char>(
tag);
451 static_assert(
tag < 128 * 128,
"We only expect tags for 1 or 2 bytes");
452 char buf[2] = {
static_cast<char>(
tag | 0x80),
static_cast<char>(
tag >> 7)};
453 return std::memcmp(
ptr,
buf, 2) == 0;
461 struct EndianHelper<1> {
466 struct EndianHelper<2> {
470 #ifndef PROTOBUF_LITTLE_ENDIAN
478 struct EndianHelper<4> {
482 #ifndef PROTOBUF_LITTLE_ENDIAN
490 struct EndianHelper<8> {
494 #ifndef PROTOBUF_LITTLE_ENDIAN
501 template <
typename T>
503 auto tmp = EndianHelper<
sizeof(
T)>::Load(p);
526 template <
typename T>
528 auto ptr =
reinterpret_cast<const uint8_t*
>(p);
535 res += (
byte - 1) << 7;
536 if (!(
byte & 0x80)) {
659 template <
typename T,
typename std::enable_if<
671 template <
typename Tag,
typename T>
676 out->Add(UnalignedLoad<T>(
ptr));
679 }
while (UnalignedLoad<Tag>(
ptr) == expected_tag && (
ptr +=
sizeof(
Tag)));
685 #define GOOGLE_PROTOBUF_ASSERT_RETURN(predicate, ret) \
686 if (!(predicate)) { \
692 #define GOOGLE_PROTOBUF_PARSER_ASSERT(predicate) \
693 GOOGLE_PROTOBUF_ASSERT_RETURN(predicate, nullptr)
695 template <
typename T>
700 while (
size > nbytes) {
701 int num = nbytes /
sizeof(
T);
702 int old_entries =
out->size();
703 out->Reserve(old_entries +
num);
704 int block_size =
num *
sizeof(
T);
705 auto dst =
out->AddNAlreadyReserved(
num);
706 #ifdef PROTOBUF_LITTLE_ENDIAN
709 for (
int i = 0;
i <
num;
i++)
710 dst[
i] = UnalignedLoad<T>(
ptr +
i *
sizeof(
T));
715 if (
ptr ==
nullptr)
return nullptr;
720 int old_entries =
out->size();
721 out->Reserve(old_entries +
num);
722 int block_size =
num *
sizeof(
T);
723 auto dst =
out->AddNAlreadyReserved(
num);
724 #ifdef PROTOBUF_LITTLE_ENDIAN
727 for (
int i = 0; i < num; i++) dst[i] = UnalignedLoad<T>(
ptr +
i *
sizeof(
T));
730 if (
size != block_size)
return nullptr;
734 template <
typename Add>
739 if (
ptr ==
nullptr)
return nullptr;
745 template <
typename Add>
750 while (
size > chunk_size) {
752 if (
ptr ==
nullptr)
return nullptr;
764 if (res ==
nullptr || res !=
end)
return nullptr;
767 size -= overrun + chunk_size;
772 if (
ptr ==
nullptr)
return nullptr;
783 bool VerifyUTF8(StringPiece s,
const char* field_name);
794 template <
typename T>
840 template <
typename T>
844 while (!
ctx->Done(&
ptr)) {
848 if (
tag == 0 || (
tag & 7) == 4) {
863 void*
object,
const char*
ptr, ParseContext*
ctx);
865 void*
object,
const char*
ptr, ParseContext*
ctx);
867 void*
object,
const char*
ptr, ParseContext*
ctx);
869 void*
object,
const char*
ptr, ParseContext*
ctx);
871 void*
object,
const char*
ptr, ParseContext*
ctx);
873 void*
object,
const char*
ptr, ParseContext*
ctx);
875 void*
object,
const char*
ptr, ParseContext*
ctx);
877 template <
typename T>
880 bool (*is_valid)(
int),
883 return ctx->ReadPackedVarint(
893 template <
typename T>
896 bool (*is_valid)(
const void*,
int),
const void*
data,
898 return ctx->ReadPackedVarint(
900 if (is_valid(
data, val)) {
909 void*
object,
const char*
ptr, ParseContext*
ctx);
911 void*
object,
const char*
ptr, ParseContext*
ctx);
913 void*
object,
const char*
ptr, ParseContext*
ctx);
915 void*
object,
const char*
ptr, ParseContext*
ctx);
917 void*
object,
const char*
ptr, ParseContext*
ctx);
919 void*
object,
const char*
ptr, ParseContext*
ctx);
921 void*
object,
const char*
ptr, ParseContext*
ctx);
936 #include <google/protobuf/port_undef.inc>
938 #endif // GOOGLE_PROTOBUF_PARSE_CONTEXT_H__
int64 ReadVarintZigZag64(const char **p)
const char * ReadTag(const char *p, uint32 *out, uint32 max_tag=0)
const PROTOBUF_NODISCARD char * ReadSizeAndPushLimitAndDepth(const char *ptr, int *old_limit)
std::pair< const char *, uint32 > VarintParseSlow32(const char *p, uint32 res)
const char * VarintParseSlow(const char *p, uint32 res, uint32 *out)
const Descriptor::ReservedRange value
uint32 ReadSize(const char **pp)
std::pair< const char *, uint64 > VarintParseSlow64(const char *p, uint32 res32)
const PROTOBUF_MUST_USE_RESULT char * ParseMessage(T *msg, const char *ptr)
const char * data() const
static uint16 bswap_16(uint16 x)
PROTOBUF_NODISCARD const PROTOBUF_NDEBUG_INLINE char * ParseGroup(T *msg, const char *ptr, uint32_t tag)
const char * UnknownGroupLiteParse(std::string *unknown, const char *ptr, ParseContext *ctx)
const char * UnknownFieldParse(uint32 tag, std::string *unknown, const char *ptr, ParseContext *ctx)
const char * PackedBoolParser(void *object, const char *ptr, ParseContext *ctx)
static PyObject * Add(PyObject *self, PyObject *file_descriptor_proto)
static PyObject * UnknownFieldSet(CMessage *self)
static AllocList * Next(int i, AllocList *prev, LowLevelAlloc::Arena *arena)
#define T(upbtypeconst, upbtype, ctype, default_value)
grpc_core::ScopedArenaPtr arena
const char * ReadPackedVarintArray(const char *ptr, const char *end, Add add)
const char * PackedFixed64Parser(void *object, const char *ptr, ParseContext *ctx)
static uint8 buffer_[kBufferSize]
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
const char * ParseBigVarint(const char *p, uint64 *out)
#define GOOGLE_PROTOBUF_PARSER_ASSERT(predicate)
const char * PackedEnumParser(void *object, const char *ptr, ParseContext *ctx)
static void * tag(intptr_t t)
bool Done(const char **ptr)
ParseContext(int depth, bool aliasing, const char **start, T &&... args)
const char * PackedEnumParserArg(void *object, const char *ptr, ParseContext *ctx, bool(*is_valid)(const void *, int), const void *data, InternalMetadataWithArenaLite *metadata, int field_num)
const PROTOBUF_MUST_USE_RESULT char * VarintParse(const char *p, T *out)
void WriteLengthDelimited(uint32 num, StringPiece val, std::string *s)
unsigned __int64 uint64_t
const char * PackedUInt64Parser(void *object, const char *ptr, ParseContext *ctx)
static uint64_t Load(const void *p)
def ParseMessage(descriptor, byte_str)
bool ExpectTag(const char *ptr)
uint32 DecodeTwoBytes(const char **ptr)
static uint32_t Load(const void *p)
const char * PackedSFixed32Parser(void *object, const char *ptr, ParseContext *ctx)
_W64 unsigned int uintptr_t
const char * InlineGreedyStringParser(std::string *s, const char *ptr, ParseContext *ctx)
bool VerifyUTF8(StringPiece str, const char *field_name)
T UnalignedLoad(const char *p)
const PROTOBUF_MUST_USE_RESULT char * FieldParser(uint64 tag, T &field_parser, const char *ptr, ParseContext *ctx)
const char * PackedInt64Parser(void *object, const char *ptr, ParseContext *ctx)
static uint16_t Load(const void *p)
static void add(const char *beg, const char *end, char ***ss, size_t *ns)
const char * PackedSFixed64Parser(void *object, const char *ptr, ParseContext *ctx)
const char * PackedFloatParser(void *object, const char *ptr, ParseContext *ctx)
const char * PackedInt32Parser(void *object, const char *ptr, ParseContext *ctx)
uint32_t ReadVarint32(const char **p)
std::pair< const char *, uint32 > ReadTagFallback(const char *p, uint32 res)
void TrackCorrectEnding()
static uint32 bswap_32(uint32 x)
std::pair< const char *, int32 > ReadSizeFallback(const char *p, uint32 res)
const char * PackedUInt32Parser(void *object, const char *ptr, ParseContext *ctx)
const char * PackedSInt64Parser(void *object, const char *ptr, ParseContext *ctx)
static uint8_t Load(const void *p)
const char * PackedSInt32Parser(void *object, const char *ptr, ParseContext *ctx)
int32 ReadVarintZigZag32(const char **p)
InternalDescriptorPool * pool
const Data & data() const
const char * PackedFixed32Parser(void *object, const char *ptr, ParseContext *ctx)
void WriteVarint(uint64 val, std::string *s)
stringpiece_ssize_type size() const
#define GOOGLE_LOG(LEVEL)
static uint64 bswap_64(uint64 x)
const PROTOBUF_MUST_USE_RESULT char * WireFormatParser(T &field_parser, const char *ptr, ParseContext *ctx)
const char * PackedDoubleParser(void *object, const char *ptr, ParseContext *ctx)
#define GOOGLE_CHECK_LE(A, B)
uint64_t ReadVarint64(const char **p)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:39