_ZN11addressbook6Person25internal_default_instanceEv:
  322|      2|  static inline const Person* internal_default_instance() {
  323|      2|    return reinterpret_cast<const Person*>(
  324|      2|               &_Person_default_instance_);
  325|      2|  }
_ZN11addressbook6Person16default_instanceEv:
  319|      2|  static const Person& default_instance() {
  320|      2|    return *internal_default_instance();
  321|      2|  }

_Z44descriptor_table_addressbook1_2eproto_getterv:
  212|      1|PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_addressbook1_2eproto_getter() {
  213|      1|  return &descriptor_table_addressbook1_2eproto;
  214|      1|}
_ZN3ExtC2EPN6google8protobuf5ArenaEb:
  263|    798|  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
  264|    798|  SharedCtor(arena, is_message_owned);
  265|       |  // @@protoc_insertion_point(arena_constructor:Ext)
  266|    798|}
_ZN3ExtD2Ev:
  309|    798|Ext::~Ext() {
  310|       |  // @@protoc_insertion_point(destructor:Ext)
  311|    798|  if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) {
  ------------------
  |  Branch (311:13): [True: 0, False: 798]
  ------------------
  312|      0|  (void)arena;
  313|      0|    return;
  314|      0|  }
  315|    798|  SharedDtor();
  316|    798|}
_ZNK3Ext11GetMetadataEv:
  529|  2.83k|::PROTOBUF_NAMESPACE_ID::Metadata Ext::GetMetadata() const {
  530|  2.83k|  return ::_pbi::AssignDescriptors(
  531|  2.83k|      &descriptor_table_addressbook1_2eproto_getter, &descriptor_table_addressbook1_2eproto_once,
  532|  2.83k|      file_level_metadata_addressbook1_2eproto[0]);
  533|  2.83k|}
_ZN7ContentC2EPN6google8protobuf5ArenaEb:
  561|  3.26k|  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
  562|  3.26k|  SharedCtor(arena, is_message_owned);
  563|       |  // @@protoc_insertion_point(arena_constructor:Content)
  564|  3.26k|}
_ZN7ContentD2Ev:
  608|  3.26k|Content::~Content() {
  609|       |  // @@protoc_insertion_point(destructor:Content)
  610|  3.26k|  if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) {
  ------------------
  |  Branch (610:13): [True: 0, False: 3.26k]
  ------------------
  611|      0|  (void)arena;
  612|      0|    return;
  613|      0|  }
  614|  3.26k|  SharedDtor();
  615|  3.26k|}
_ZNK7Content11GetMetadataEv:
  843|  11.6k|::PROTOBUF_NAMESPACE_ID::Metadata Content::GetMetadata() const {
  844|  11.6k|  return ::_pbi::AssignDescriptors(
  845|  11.6k|      &descriptor_table_addressbook1_2eproto_getter, &descriptor_table_addressbook1_2eproto_once,
  846|  11.6k|      file_level_metadata_addressbook1_2eproto[1]);
  847|  11.6k|}
_ZN15JsonContextBodyC2EPN6google8protobuf5ArenaEb:
  873|  4.09k|  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
  874|  4.09k|  SharedCtor(arena, is_message_owned);
  875|       |  // @@protoc_insertion_point(arena_constructor:JsonContextBody)
  876|  4.09k|}
_ZN15JsonContextBodyD2Ev:
  915|  4.09k|JsonContextBody::~JsonContextBody() {
  916|       |  // @@protoc_insertion_point(destructor:JsonContextBody)
  917|  4.09k|  if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) {
  ------------------
  |  Branch (917:13): [True: 0, False: 4.09k]
  ------------------
  918|      0|  (void)arena;
  919|      0|    return;
  920|      0|  }
  921|  4.09k|  SharedDtor();
  922|  4.09k|}
_ZNK15JsonContextBody11GetMetadataEv:
 1268|  10.1k|::PROTOBUF_NAMESPACE_ID::Metadata JsonContextBody::GetMetadata() const {
 1269|  10.1k|  return ::_pbi::AssignDescriptors(
 1270|  10.1k|      &descriptor_table_addressbook1_2eproto_getter, &descriptor_table_addressbook1_2eproto_once,
 1271|  10.1k|      file_level_metadata_addressbook1_2eproto[2]);
 1272|  10.1k|}
_ZN6google8protobuf5Arena18CreateMaybeMessageI3ExtJEEEPT_PS1_DpOT0_:
 1775|    798|Arena::CreateMaybeMessage< ::Ext >(Arena* arena) {
 1776|    798|  return Arena::CreateMessageInternal< ::Ext >(arena);
 1777|    798|}
_ZN6google8protobuf5Arena18CreateMaybeMessageI7ContentJEEEPT_PS1_DpOT0_:
 1779|  3.26k|Arena::CreateMaybeMessage< ::Content >(Arena* arena) {
 1780|  3.26k|  return Arena::CreateMessageInternal< ::Content >(arena);
 1781|  3.26k|}
_ZN3Ext10SharedCtorEPN6google8protobuf5ArenaEb:
  293|    798|    ::_pb::Arena* arena, bool is_message_owned) {
  294|    798|  (void)arena;
  295|    798|  (void)is_message_owned;
  296|    798|  new (&_impl_) Impl_{
  297|    798|      decltype(_impl_._has_bits_){}
  298|    798|    , /*decltype(_impl_._cached_size_)*/{}
  299|    798|    , decltype(_impl_.databyte_){}
  300|    798|    , decltype(_impl_.age_){0u}
  301|    798|    , decltype(_impl_.enumtype_){1}
  302|    798|  };
  303|    798|  _impl_.databyte_.InitDefault();
  304|       |  #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
  305|       |    _impl_.databyte_.Set("", GetArenaForAllocation());
  306|       |  #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
  307|    798|}
_ZN3Ext10SharedDtorEv:
  318|    798|inline void Ext::SharedDtor() {
  319|       |  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
  ------------------
  |  Branch (319:3): [True: 0, False: 0]
  |  Branch (319:3): [Folded, False: 798]
  ------------------
  320|    798|  _impl_.databyte_.Destroy();
  321|    798|}
_ZN7Content10SharedCtorEPN6google8protobuf5ArenaEb:
  592|  3.26k|    ::_pb::Arena* arena, bool is_message_owned) {
  593|  3.26k|  (void)arena;
  594|  3.26k|  (void)is_message_owned;
  595|  3.26k|  new (&_impl_) Impl_{
  596|  3.26k|      decltype(_impl_._has_bits_){}
  597|  3.26k|    , /*decltype(_impl_._cached_size_)*/{}
  598|  3.26k|    , decltype(_impl_.uid_){}
  599|  3.26k|    , decltype(_impl_.ext_){nullptr}
  600|  3.26k|    , decltype(_impl_.distance_){0}
  601|  3.26k|  };
  602|  3.26k|  _impl_.uid_.InitDefault();
  603|       |  #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
  604|       |    _impl_.uid_.Set("", GetArenaForAllocation());
  605|       |  #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
  606|  3.26k|}
_ZN7Content10SharedDtorEv:
  617|  3.26k|inline void Content::SharedDtor() {
  618|  3.26k|  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
  ------------------
  |  Branch (618:3): [True: 0, False: 0]
  |  Branch (618:3): [Folded, False: 3.26k]
  ------------------
  619|  3.26k|  _impl_.uid_.Destroy();
  620|  3.26k|  if (this != internal_default_instance()) delete _impl_.ext_;
  ------------------
  |  Branch (620:7): [True: 3.26k, False: 0]
  ------------------
  621|  3.26k|}
_ZN15JsonContextBody10SharedCtorEPN6google8protobuf5ArenaEb:
  899|  4.09k|    ::_pb::Arena* arena, bool is_message_owned) {
  900|  4.09k|  (void)arena;
  901|  4.09k|  (void)is_message_owned;
  902|  4.09k|  new (&_impl_) Impl_{
  903|  4.09k|      decltype(_impl_._has_bits_){}
  904|  4.09k|    , /*decltype(_impl_._cached_size_)*/{}
  905|  4.09k|    , decltype(_impl_.content_){arena}
  906|  4.09k|    , decltype(_impl_.data_){arena}
  907|  4.09k|    , decltype(_impl_.info_){arena}
  908|  4.09k|    , decltype(_impl_.type_){int64_t{0}}
  909|  4.09k|    , decltype(_impl_.spur_){0}
  910|  4.09k|    , decltype(_impl_.judge_){false}
  911|  4.09k|    , decltype(_impl_.text_){0}
  912|  4.09k|  };
  913|  4.09k|}
_ZN15JsonContextBody10SharedDtorEv:
  924|  4.09k|inline void JsonContextBody::SharedDtor() {
  925|       |  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
  ------------------
  |  Branch (925:3): [True: 0, False: 0]
  |  Branch (925:3): [Folded, False: 4.09k]
  ------------------
  926|  4.09k|  _impl_.content_.~RepeatedPtrField();
  927|  4.09k|  _impl_.data_.~RepeatedField();
  928|  4.09k|  _impl_.info_.~RepeatedPtrField();
  929|  4.09k|}

_ZN15JsonContextBodyC2Ev:
  527|  4.09k|  inline JsonContextBody() : JsonContextBody(nullptr) {}
_ZNK3Ext3NewEPN6google8protobuf5ArenaE:
  178|    798|  Ext* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
  179|    798|    return CreateMaybeMessage<Ext>(arena);
  180|    798|  }
_ZN7Content25internal_default_instanceEv:
  374|  3.26k|  static inline const Content* internal_default_instance() {
  375|  3.26k|    return reinterpret_cast<const Content*>(
  376|  3.26k|               &_Content_default_instance_);
  377|  3.26k|  }
_ZNK7Content3NewEPN6google8protobuf5ArenaE:
  405|  3.26k|  Content* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
  406|  3.26k|    return CreateMaybeMessage<Content>(arena);
  407|  3.26k|  }

_ZN7bthread11EpollThreadC2Ev:
  119|      2|        : _epfd(-1)
  120|      2|        , _stop(false)
  121|      2|        , _tid(0) {
  122|      2|    }
_ZN7bthread9LazyArrayIPN5butil6atomicIiEELm262144ELm256EEC2Ev:
   56|      2|    LazyArray() {
   57|      2|        memset(static_cast<void*>(_blocks), 0, sizeof(butil::atomic<Block*>) * NBLOCK);
   58|      2|    }

key.cpp:_ZN7bthreadL13get_key_countEPv:
  435|      2|static int get_key_count(void*) {
  436|      2|    BAIDU_SCOPED_LOCK(bthread::s_key_mutex);
  ------------------
  |  |   47|      2|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      2|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      2|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      2|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  437|      2|    return (int)nkey - (int)nfreekey;
  438|      2|}
key.cpp:_ZN7bthreadL18get_keytable_countEPv:
  439|      2|static size_t get_keytable_count(void*) {
  440|      2|    return nkeytable.load(butil::memory_order_relaxed);
  441|      2|}
key.cpp:_ZN7bthreadL19get_keytable_memoryEPv:
  442|      2|static size_t get_keytable_memory(void*) {
  443|      2|    const size_t n = nkeytable.load(butil::memory_order_relaxed);
  444|      2|    const size_t nsub = nsubkeytable.load(butil::memory_order_relaxed);
  445|      2|    return n * sizeof(KeyTable) + nsub * sizeof(SubKeyTable);
  446|      2|}

_ZN7bthread28first_sys_pthread_mutex_lockEP15pthread_mutex_t:
  496|      2|int first_sys_pthread_mutex_lock(pthread_mutex_t* mutex) {
  497|      2|    pthread_once(&init_sys_mutex_lock_once, init_sys_mutex_lock);
  498|      2|    return sys_pthread_mutex_lock(mutex);
  499|      2|}
pthread_mutex_init:
 1309|    190|                       const pthread_mutexattr_t* __restrict mutexattr) {
 1310|    190|    INIT_MUTEX_OWNER_MAP_ENTRY(mutex, mutexattr);
  ------------------
  |  |  795|    190|#define INIT_MUTEX_OWNER_MAP_ENTRY(mutex, mutexattr) ((void)0)
  ------------------
 1311|    190|    return bthread::sys_pthread_mutex_init(mutex, mutexattr);
 1312|    190|}
pthread_mutex_lock:
 1319|    727|int pthread_mutex_lock(pthread_mutex_t* mutex) {
 1320|    727|    return bthread::pthread_mutex_lock_impl(mutex);
 1321|    727|}
pthread_mutex_unlock:
 1334|    727|int pthread_mutex_unlock(pthread_mutex_t* mutex) {
 1335|    727|    return bthread::pthread_mutex_unlock_impl(mutex);
 1336|    727|}
mutex.cpp:_ZN7bthreadL19init_sys_mutex_lockEv:
  439|      2|static void init_sys_mutex_lock() {
  440|       |// When bRPC library is linked as a shared library, need to make sure bRPC
  441|       |// shared library is loaded before the pthread shared library. Otherwise,
  442|       |// it may cause runtime error: undefined symbol: pthread_mutex_xxx.
  443|       |// Alternatively, static linking can also avoid this problem.
  444|      2|#if defined(OS_LINUX)
  445|       |    // TODO: may need dlvsym when GLIBC has multiple versions of a same symbol.
  446|       |    // http://blog.fesnel.com/blog/2009/08/25/preloading-with-multiple-symbol-versions
  447|      2|    if (_dl_sym) {
  ------------------
  |  Branch (447:9): [True: 0, False: 2]
  ------------------
  448|      0|        sys_pthread_mutex_init = (MutexInitOp)_dl_sym(
  449|      0|            RTLD_NEXT, "pthread_mutex_init", (void*)init_sys_mutex_lock);
  450|      0|        sys_pthread_mutex_destroy = (MutexOp)_dl_sym(
  451|      0|            RTLD_NEXT, "pthread_mutex_destroy", (void*)init_sys_mutex_lock);
  452|      0|        sys_pthread_mutex_lock = (MutexOp)_dl_sym(
  453|      0|            RTLD_NEXT, "pthread_mutex_lock", (void*)init_sys_mutex_lock);
  454|      0|        sys_pthread_mutex_unlock = (MutexOp)_dl_sym(
  455|      0|            RTLD_NEXT, "pthread_mutex_unlock", (void*)init_sys_mutex_lock);
  456|      0|        sys_pthread_mutex_trylock = (MutexOp)_dl_sym(
  457|      0|            RTLD_NEXT, "pthread_mutex_trylock", (void*)init_sys_mutex_lock);
  458|      0|#if HAS_PTHREAD_MUTEX_TIMEDLOCK
  459|      0|        sys_pthread_mutex_timedlock = (TimedMutexOp)_dl_sym(
  460|      0|            RTLD_NEXT, "pthread_mutex_timedlock", (void*)init_sys_mutex_lock);
  461|      0|#endif // HAS_PTHREAD_MUTEX_TIMEDLOCK
  462|      2|    } else {
  463|       |        // _dl_sym may be undefined reference in some system, fallback to dlsym
  464|      2|        sys_pthread_mutex_init = (MutexInitOp)dlsym(RTLD_NEXT, "pthread_mutex_init");
  465|      2|        sys_pthread_mutex_destroy = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_destroy");
  466|      2|        sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_lock");
  467|      2|        sys_pthread_mutex_unlock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_unlock");
  468|      2|        sys_pthread_mutex_trylock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_trylock");
  469|      2|#if HAS_PTHREAD_MUTEX_TIMEDLOCK
  470|      2|        sys_pthread_mutex_timedlock = (TimedMutexOp)dlsym(RTLD_NEXT, "pthread_mutex_timedlock");
  471|      2|#endif // HAS_PTHREAD_MUTEX_TIMEDLOCK
  472|      2|    }
  473|       |#elif defined(OS_MACOSX)
  474|       |    // TODO: look workaround for dlsym on mac
  475|       |    sys_pthread_mutex_init = (MutexInitOp)dlsym(RTLD_NEXT, "pthread_mutex_init");
  476|       |    sys_pthread_mutex_destroy = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_destroy");
  477|       |    sys_pthread_mutex_lock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_lock");
  478|       |    sys_pthread_mutex_trylock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_trylock");
  479|       |    sys_pthread_mutex_unlock = (MutexOp)dlsym(RTLD_NEXT, "pthread_mutex_unlock");
  480|       |#endif
  481|      2|}
_ZN7bthread22AddTlsPthreadLockCountEv:
  560|    727|inline void AddTlsPthreadLockCount() {}
_ZN7bthread22SubTlsPthreadLockCountEv:
  561|    727|inline void SubTlsPthreadLockCount() {}
_ZN7bthread23pthread_mutex_lock_implEP15pthread_mutex_t:
  983|    727|BUTIL_FORCE_INLINE int pthread_mutex_lock_impl(pthread_mutex_t* mutex) {
  984|       |    return internal::pthread_mutex_lock_impl(mutex, NULL);
  985|    727|}
_ZN7bthread8internal23pthread_mutex_lock_implI15pthread_mutex_tEEiPT_PK8timespec:
  878|    727|BUTIL_FORCE_INLINE int pthread_mutex_lock_impl(Mutex* mutex, const struct timespec* abstime) {
  879|       |    // Don't change behavior of lock when profiler is off.
  880|    727|    if (!g_cp ||
  ------------------
  |  Branch (880:9): [True: 727, False: 0]
  ------------------
  881|       |        // collecting code including backtrace() and submit() may call
  882|       |        // pthread_mutex_lock and cause deadlock. Don't sample.
  883|    727|        BAIDU_GET_VOLATILE_THREAD_LOCAL(tls_inside_lock)) {
  ------------------
  |  |   69|      0|#define BAIDU_GET_VOLATILE_THREAD_LOCAL(var_name) get_##var_name()
  |  |  ------------------
  |  |  |  Branch (69:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  884|    727|        return pthread_mutex_lock_internal(mutex, abstime);
  885|    727|    }
  886|       |    // Don't slow down non-contended locks.
  887|      0|    int rc = pthread_mutex_trylock_internal(mutex);
  888|      0|    if (rc != EBUSY) {
  ------------------
  |  Branch (888:9): [True: 0, False: 0]
  ------------------
  889|      0|        return rc;
  890|      0|    }
  891|       |    // Ask bvar::Collector if this (contended) locking should be sampled
  892|      0|    const size_t sampling_range = bvar::is_collectable(&g_cp_sl);
  893|       |
  894|      0|    bthread_contention_site_t* csite = NULL;
  895|      0|#ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
  896|      0|    TLSPthreadContentionSites& fast_alt =
  897|      0|        *BAIDU_GET_PTR_VOLATILE_THREAD_LOCAL(tls_csites);
  ------------------
  |  |   70|      0|#define BAIDU_GET_PTR_VOLATILE_THREAD_LOCAL(var_name) get_ptr_##var_name()
  ------------------
  898|      0|    if (fast_alt.cp_version != g_cp_version) {
  ------------------
  |  Branch (898:9): [True: 0, False: 0]
  ------------------
  899|      0|        fast_alt.cp_version = g_cp_version;
  900|      0|        fast_alt.count = 0;
  901|      0|    }
  902|      0|    if (fast_alt.count < TLS_MAX_COUNT) {
  ------------------
  |  Branch (902:9): [True: 0, False: 0]
  ------------------
  903|      0|        MutexAndContentionSite& entry = fast_alt.list[fast_alt.count++];
  904|      0|        entry.mutex = mutex;
  905|      0|        csite = &entry.csite;
  906|      0|        if (!bvar::is_sampling_range_valid(sampling_range)) {
  ------------------
  |  Branch (906:13): [True: 0, False: 0]
  ------------------
  907|      0|            make_contention_site_invalid(&entry.csite);
  908|      0|            return pthread_mutex_lock_internal(mutex, abstime);
  909|      0|        }
  910|      0|    }
  911|      0|#endif
  912|      0|    if (!bvar::is_sampling_range_valid(sampling_range)) {  // don't sample
  ------------------
  |  Branch (912:9): [True: 0, False: 0]
  ------------------
  913|      0|        return pthread_mutex_lock_internal(mutex, abstime);
  914|      0|    }
  915|       |    // Lock and monitor the waiting time.
  916|      0|    const int64_t start_ns = butil::cpuwide_time_ns();
  917|      0|    rc = pthread_mutex_lock_internal(mutex, abstime);
  918|      0|    if (!rc) { // Inside lock
  ------------------
  |  Branch (918:9): [True: 0, False: 0]
  ------------------
  919|      0|        if (!csite) {
  ------------------
  |  Branch (919:13): [True: 0, False: 0]
  ------------------
  920|      0|            csite = add_pthread_contention_site(mutex);
  921|      0|            if (csite == NULL) {
  ------------------
  |  Branch (921:17): [True: 0, False: 0]
  ------------------
  922|      0|                return rc;
  923|      0|            }
  924|      0|        }
  925|      0|        csite->duration_ns = butil::cpuwide_time_ns() - start_ns;
  926|      0|        csite->sampling_range = sampling_range;
  927|      0|    } // else rare
  928|      0|    return rc;
  929|      0|}
_ZN7bthread8internal27pthread_mutex_lock_internalEP15pthread_mutex_tPK8timespec:
  806|    727|                                                   const struct timespec* abstime) {
  807|    727|    int rc = 0;
  808|    727|    if (NULL == abstime) {
  ------------------
  |  Branch (808:9): [True: 727, False: 0]
  ------------------
  809|    727|        FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex);
  ------------------
  |  |  797|    727|#define FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex) ((void)0)
  ------------------
  810|    727|        SYS_PTHREAD_MUTEX_CHECK_OWNER;
  ------------------
  |  |  798|    727|#define SYS_PTHREAD_MUTEX_CHECK_OWNER ((void)0)
  ------------------
  811|    727|        rc = sys_pthread_mutex_lock(mutex);
  812|    727|        if (0 == rc) {
  ------------------
  |  Branch (812:13): [True: 727, False: 0]
  ------------------
  813|    727|            SYS_PTHREAD_MUTEX_SET_OWNER;
  ------------------
  |  |  799|    727|#define SYS_PTHREAD_MUTEX_SET_OWNER ((void)0)
  ------------------
  814|    727|        }
  815|    727|    } else {
  816|      0|        rc = sys_pthread_mutex_timedlock(mutex, abstime);
  817|      0|        if (0 == rc) {
  ------------------
  |  Branch (817:13): [True: 0, False: 0]
  ------------------
  818|      0|            FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex);
  ------------------
  |  |  797|      0|#define FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex) ((void)0)
  ------------------
  819|      0|            SYS_PTHREAD_MUTEX_SET_OWNER;
  ------------------
  |  |  799|      0|#define SYS_PTHREAD_MUTEX_SET_OWNER ((void)0)
  ------------------
  820|      0|        }
  821|      0|    }
  822|    727|    if (0 == rc) {
  ------------------
  |  Branch (822:9): [True: 727, False: 0]
  ------------------
  823|    727|        AddTlsPthreadLockCount();
  824|    727|    }
  825|    727|    return rc;
  826|    727|}
_ZN7bthread25pthread_mutex_unlock_implEP15pthread_mutex_t:
  998|    727|BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(pthread_mutex_t* mutex) {
  999|    727|    return internal::pthread_mutex_unlock_impl(mutex);
 1000|    727|}
_ZN7bthread8internal25pthread_mutex_unlock_implI15pthread_mutex_tEEiPT_:
  937|    727|BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(Mutex* mutex) {
  938|       |    // Don't change behavior of unlock when profiler is off.
  939|    727|    if (!g_cp || BAIDU_GET_VOLATILE_THREAD_LOCAL(tls_inside_lock)) {
  ------------------
  |  |   69|      0|#define BAIDU_GET_VOLATILE_THREAD_LOCAL(var_name) get_##var_name()
  |  |  ------------------
  |  |  |  Branch (69:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (939:9): [True: 727, False: 0]
  ------------------
  940|       |        // This branch brings an issue that an entry created by
  941|       |        // add_pthread_contention_site may not be cleared. Thus we add a
  942|       |        // 16-bit rolling version in the entry to find out such entry.
  943|    727|        return pthread_mutex_unlock_internal(mutex);
  944|    727|    }
  945|      0|    int64_t unlock_start_ns = 0;
  946|      0|    bool miss_in_tls = true;
  947|      0|    bthread_contention_site_t saved_csite = {0,0};
  948|      0|#ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
  949|      0|    TLSPthreadContentionSites& fast_alt =
  950|      0|        *BAIDU_GET_PTR_VOLATILE_THREAD_LOCAL(tls_csites);
  ------------------
  |  |   70|      0|#define BAIDU_GET_PTR_VOLATILE_THREAD_LOCAL(var_name) get_ptr_##var_name()
  ------------------
  951|      0|    for (int i = fast_alt.count - 1; i >= 0; --i) {
  ------------------
  |  Branch (951:38): [True: 0, False: 0]
  ------------------
  952|      0|        if (fast_alt.list[i].mutex == mutex) {
  ------------------
  |  Branch (952:13): [True: 0, False: 0]
  ------------------
  953|      0|            if (is_contention_site_valid(fast_alt.list[i].csite)) {
  ------------------
  |  Branch (953:17): [True: 0, False: 0]
  ------------------
  954|      0|                saved_csite = fast_alt.list[i].csite;
  955|      0|                unlock_start_ns = butil::cpuwide_time_ns();
  956|      0|            }
  957|      0|            fast_alt.list[i] = fast_alt.list[--fast_alt.count];
  958|      0|            miss_in_tls = false;
  959|      0|            break;
  960|      0|        }
  961|      0|    }
  962|      0|#endif
  963|       |    // Check the map to see if the lock is sampled. Notice that we're still
  964|       |    // inside critical section.
  965|      0|    if (miss_in_tls) {
  ------------------
  |  Branch (965:9): [True: 0, False: 0]
  ------------------
  966|      0|        if (remove_pthread_contention_site(mutex, &saved_csite)) {
  ------------------
  |  Branch (966:13): [True: 0, False: 0]
  ------------------
  967|      0|            unlock_start_ns = butil::cpuwide_time_ns();
  968|      0|        }
  969|      0|    }
  970|      0|    const int rc = pthread_mutex_unlock_internal(mutex);
  971|       |    // [Outside lock]
  972|      0|    if (unlock_start_ns) {
  ------------------
  |  Branch (972:9): [True: 0, False: 0]
  ------------------
  973|      0|        const int64_t unlock_end_ns = butil::cpuwide_time_ns();
  974|      0|        saved_csite.duration_ns += unlock_end_ns - unlock_start_ns;
  975|      0|        submit_contention(saved_csite, unlock_end_ns);
  976|      0|    }
  977|      0|    return rc;
  978|    727|}
_ZN7bthread8internal29pthread_mutex_unlock_internalEP15pthread_mutex_t:
  851|    727|BUTIL_FORCE_INLINE int pthread_mutex_unlock_internal(pthread_mutex_t* mutex) {
  852|    727|    SYS_PTHREAD_MUTEX_RESET_OWNER(mutex);
  ------------------
  |  |  800|    727|#define SYS_PTHREAD_MUTEX_RESET_OWNER(mutex) ((void)0)
  ------------------
  853|    727|    SubTlsPthreadLockCount();
  854|    727|    return sys_pthread_mutex_unlock(mutex);
  855|    727|}

stack.cpp:_ZN7bthreadL15get_stack_countEPv:
   50|      2|static int64_t get_stack_count(void*) {
   51|      2|    return s_stack_count.load(butil::memory_order_relaxed);
   52|      2|}

_ZN5butil13static_atomicIlE4loadESt12memory_order:
  293|      2|    T load(memory_order o) { return ref().load(o); }
_ZN5butil13static_atomicIlE3refEv:
  316|      2|    atomic<T>& ref() {
  317|       |        // Suppress strict-alias warnings.
  318|      2|        atomic<T>* p = reinterpret_cast<atomic<T>*>(&val);
  319|      2|        return *p;
  320|      2|    }
_ZN5butil13static_atomicImE4loadESt12memory_order:
  293|      6|    T load(memory_order o) { return ref().load(o); }
_ZN5butil13static_atomicImE3refEv:
  316|      6|    atomic<T>& ref() {
  317|       |        // Suppress strict-alias warnings.
  318|      6|        atomic<T>* p = reinterpret_cast<atomic<T>*>(&val);
  319|      6|        return *p;
  320|      6|    }
_ZN5butil6atomicIPN7bthread9LazyArrayIPNS0_IiEELm262144ELm256EE5BlockEEC2Ev:
  234|   524k|    atomic() {}

atomicops_internals_x86_gcc.cc:_ZN12_GLOBAL__N_123AtomicOpsx86InitializerC2Ev:
   88|      2|  AtomicOpsx86Initializer() {
   89|      2|    AtomicOps_Internalx86CPUFeaturesInit();
   90|      2|  }
atomicops_internals_x86_gcc.cc:_ZN12_GLOBAL__N_136AtomicOps_Internalx86CPUFeaturesInitEv:
   48|      2|void AtomicOps_Internalx86CPUFeaturesInit() {
   49|      2|  uint32_t eax;
   50|      2|  uint32_t ebx;
   51|      2|  uint32_t ecx;
   52|      2|  uint32_t edx;
   53|       |
   54|       |  // Get vendor string (issue CPUID with eax = 0)
   55|      2|  cpuid(eax, ebx, ecx, edx, 0);
  ------------------
  |  |   30|      2|  asm("mov %%rbx, %%rdi\n"     \
  |  |   31|      2|      "cpuid\n"                \
  |  |   32|      2|      "xchg %%rdi, %%rbx\n"    \
  |  |   33|      2|      : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp))
  ------------------
   56|      2|  char vendor[13];
   57|      2|  memcpy(vendor, &ebx, 4);
   58|      2|  memcpy(vendor + 4, &edx, 4);
   59|      2|  memcpy(vendor + 8, &ecx, 4);
   60|      2|  vendor[12] = 0;
   61|       |
   62|       |  // get feature flags in ecx/edx, and family/model in eax
   63|      2|  cpuid(eax, ebx, ecx, edx, 1);
  ------------------
  |  |   30|      2|  asm("mov %%rbx, %%rdi\n"     \
  |  |   31|      2|      "cpuid\n"                \
  |  |   32|      2|      "xchg %%rdi, %%rbx\n"    \
  |  |   33|      2|      : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp))
  ------------------
   64|       |
   65|      2|  int family = (eax >> 8) & 0xf;        // family and model fields
   66|      2|  int model = (eax >> 4) & 0xf;
   67|      2|  if (family == 0xf) {                  // use extended family and model fields
  ------------------
  |  Branch (67:7): [True: 2, False: 0]
  ------------------
   68|      2|    family += (eax >> 20) & 0xff;
   69|      2|    model += ((eax >> 16) & 0xf) << 4;
   70|      2|  }
   71|       |
   72|       |  // Opteron Rev E has a bug in which on very rare occasions a locked
   73|       |  // instruction doesn't act as a read-acquire barrier if followed by a
   74|       |  // non-locked read-modify-write instruction.  Rev F has this bug in
   75|       |  // pre-release versions, but not in versions released to customers,
   76|       |  // so we test only for Rev E, which is family 15, model 32..63 inclusive.
   77|      2|  if (strcmp(vendor, "AuthenticAMD") == 0 &&       // AMD
  ------------------
  |  Branch (77:7): [True: 2, False: 0]
  ------------------
   78|      2|      family == 15 &&
  ------------------
  |  Branch (78:7): [True: 0, False: 2]
  ------------------
   79|      0|      32 <= model && model <= 63) {
  ------------------
  |  Branch (79:7): [True: 0, False: 0]
  |  Branch (79:22): [True: 0, False: 0]
  ------------------
   80|      0|    AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug = true;
   81|      2|  } else {
   82|      2|    AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug = false;
   83|      2|  }
   84|      2|}

_ZN5butil6subtle13Release_StoreEPVll:
  181|      2|inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
  182|      2|  ATOMICOPS_COMPILER_BARRIER();
  ------------------
  |  |   24|      2|#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory")
  ------------------
  183|       |
  184|      2|  *ptr = value; // An x86 store acts as a release barrier
  185|       |                // for current AMD/Intel chips as of Jan 2008.
  186|       |                // See also Acquire_Load(), below.
  187|       |
  188|       |  // When new chips come out, check:
  189|       |  //  IA-32 Intel Architecture Software Developer's Manual, Volume 3:
  190|       |  //  System Programming Guide, Chatper 7: Multiple-processor management,
  191|       |  //  Section 7.2, Memory Ordering.
  192|       |  // Last seen at:
  193|       |  //   http://developer.intel.com/design/pentium4/manuals/index_new.htm
  194|       |  //
  195|       |  // x86 stores/loads fail to act as barriers for a few instructions (clflush
  196|       |  // maskmovdqu maskmovq movntdq movnti movntpd movntps movntq) but these are
  197|       |  // not generated by the compiler, and are rare.  Users of these instructions
  198|       |  // need to know about cache behaviour in any case since all of these involve
  199|       |  // either flushing cache lines or non-temporal cache hints.
  200|      2|}
_ZN5butil6subtle12Acquire_LoadEPVKl:
  206|      8|inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
  207|      8|  Atomic64 value = *ptr; // An x86 load acts as a acquire barrier,
  208|       |                         // for current AMD/Intel chips as of Jan 2008.
  209|       |                         // See also Release_Store(), above.
  210|      8|  ATOMICOPS_COMPILER_BARRIER();
  ------------------
  |  |   24|      8|#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory")
  ------------------
  211|      8|  return value;
  212|      8|}

_ZN5butil12Base64DecodeERKNS_16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPS6_:
   22|    757|bool Base64Decode(const StringPiece& input, std::string* output) {
   23|    757|  std::string temp;
   24|    757|  temp.resize(modp_b64_decode_len(input.size()));
  ------------------
  |  |  108|    757|#define modp_b64_decode_len(A) (A / 4 * 3 + 2)
  ------------------
   25|       |
   26|       |  // does not null terminate result since result is binary data!
   27|    757|  size_t input_size = input.size();
   28|    757|  size_t output_size = modp_b64_decode(&(temp[0]), input.data(), input_size);
   29|    757|  if (output_size == MODP_B64_ERROR)
  ------------------
  |  |  135|    757|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (29:7): [True: 57, False: 700]
  ------------------
   30|     57|    return false;
   31|       |
   32|    700|  temp.resize(output_size);
   33|    700|  output->swap(temp);
   34|    700|  return true;
   35|    757|}

_ZN5butil8demangleB5cxx11EPKc:
   30|     50|std::string demangle(const char* name) {
   31|       |    // mangled_name
   32|       |    //   A NULL-terminated character string containing the name to
   33|       |    //   be demangled.
   34|       |    // output_buffer:
   35|       |    //   A region of memory, allocated with malloc, of *length bytes,
   36|       |    //   into which the demangled name is stored. If output_buffer is
   37|       |    //   not long enough, it is expanded using realloc. output_buffer
   38|       |    //   may instead be NULL; in that case, the demangled name is placed
   39|       |    //   in a region of memory allocated with malloc.
   40|       |    // length
   41|       |    //   If length is non-NULL, the length of the buffer containing the
   42|       |    //   demangled name is placed in *length.
   43|       |    // status
   44|       |    //   *status is set to one of the following values:
   45|       |    //    0: The demangling operation succeeded.
   46|       |    //   -1: A memory allocation failure occurred.
   47|       |    //   -2: mangled_name is not a valid name under the C++ ABI
   48|       |    //       mangling rules.
   49|       |    //   -3: One of the arguments is invalid.
   50|     50|    int status = 0;
   51|     50|    char* buf = abi::__cxa_demangle(name, NULL, NULL, &status);
   52|     50|    if (status == 0 && buf) {
  ------------------
  |  Branch (52:9): [True: 50, False: 0]
  |  Branch (52:24): [True: 50, False: 0]
  ------------------
   53|     50|        std::string s(buf);
   54|     50|        free(buf);
   55|     50|        return s;
   56|     50|    }
   57|      0|    return std::string(name);
   58|     50|}

_ZNK5butil13DefaultHasherINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEclERKS6_:
  562|     16|    std::size_t operator()(const std::string& s) const {
  563|     16|        std::size_t result = 0;
  564|    340|        for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) {
  ------------------
  |  Branch (564:57): [True: 324, False: 16]
  ------------------
  565|    324|            result = result * 101 + *i;
  566|    324|        }
  567|     16|        return result;        
  568|     16|    }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE6BucketC2Ev:
  283|  1.08k|        Bucket() : next((Bucket*)-1UL) {}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE26init_buckets_and_thumbnailEPNSE_6BucketEPmm:
  369|    128|                                           size_t nbucket) {
  370|  66.6k|        for (size_t i = 0; i < nbucket; ++i) {
  ------------------
  |  Branch (370:28): [True: 66.5k, False: 128]
  ------------------
  371|  66.5k|            buckets[i].set_invalid();
  372|  66.5k|        }
  373|    128|        buckets[nbucket].next = NULL;
  374|    128|        if (_Sparse) {
  ------------------
  |  Branch (374:13): [Folded, False: 128]
  ------------------
  375|      0|            bit_array_clear(thumbnail, nbucket);
  376|      0|        }
  377|    128|    }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE6Bucket11set_invalidEv:
  292|  66.5k|        void set_invalid() { next = (Bucket*)-1UL; }
_ZNK5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE5emptyEv:
  274|     64|    bool empty() const { return _size == 0; }
_ZNK5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE18is_default_bucketsEv:
  363|    128|    bool is_default_buckets() const {
  364|    128|        return _buckets == (Bucket*)(&_default_buckets);
  365|    128|    }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE16init_load_factorEj:
  355|     64|    void init_load_factor(u_int load_factor) {
  356|     64|        if (_is_default_load_factor) {
  ------------------
  |  Branch (356:13): [True: 64, False: 0]
  ------------------
  357|     64|            _is_default_load_factor = false;
  358|     64|            _load_factor = load_factor;
  359|     64|        }
  360|     64|    }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE14is_too_crowdedEmmj:
  351|     64|    static bool is_too_crowded(size_t size, size_t nbucket, u_int load_factor) {
  352|     64|        return size * 100 >= nbucket * load_factor;
  353|     64|    }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoC2EPNSE_6BucketEPmm:
  327|     64|            : buckets(b), thumbnail(t), nbucket(n) {}
_ZNK5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE6Bucket8is_validEv:
  291|  1.16k|        bool is_valid() const { return next != (const Bucket*)-1UL; }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE6BucketC2ERKS6_:
  284|      8|        explicit Bucket(const _K& k) : next(NULL) {
  285|      8|            element_space_.Init(k);
  286|      8|        }
_ZN5butil14FlatMapElementINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryEEC2ERKS6_:
  486|      8|    explicit FlatMapElement(const K& k) : _key(k), _value(T()) {}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE6Bucket7elementEv:
  294|      8|        Element& element() { return *element_space_; }
_ZN5butil14FlatMapElementINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryEE10second_refEv:
  496|      8|    T& second_ref() { return _value; }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE13get_allocatorEv:
  344|     64|    allocator_type& get_allocator() { return _pool.get_allocator(); }

_ZN5butil13flatmap_roundEm:
   61|     64|inline size_t flatmap_round(size_t nbucket) {
   62|       |#ifdef FLAT_MAP_ROUND_BUCKET_BY_USE_NEXT_PRIME    
   63|       |    return find_next_prime(nbucket);
   64|       |#else
   65|       |    // the lowerbound fixes the corner case of nbucket=0 which results in coredump during seeking the map.
   66|     64|    return nbucket <= 8 ? 8 : find_power2(nbucket);
  ------------------
  |  Branch (66:12): [True: 0, False: 64]
  ------------------
   67|     64|#endif
   68|     64|}
_ZN5butil11find_power2Em:
   45|     64|inline uint64_t find_power2(uint64_t b) {
   46|     64|    b -= 1;
   47|     64|    b |= (b >> 1);
   48|     64|    b |= (b >> 2);
   49|     64|    b |= (b >> 4);
   50|     64|    b |= (b >> 8);
   51|     64|    b |= (b >> 16);
   52|     64|    b |= (b >> 32);
   53|     64|    return b + 1;
   54|     64|}
_ZN5butil11flatmap_modEmm:
   70|     16|inline size_t flatmap_mod(size_t hash_code, size_t nbucket) {
   71|       |#ifdef FLAT_MAP_ROUND_BUCKET_BY_USE_NEXT_PRIME
   72|       |    return hash_code % nbucket;
   73|       |#else
   74|     16|    return hash_code & (nbucket - 1);
   75|     16|#endif
   76|     16|}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EEC2ERKSA_RKSC_RKSD_:
  221|     64|    : _size(0)
  222|     64|    , _nbucket(DEFAULT_NBUCKET)
  223|     64|    , _buckets((Bucket*)(&_default_buckets))
  224|     64|    , _thumbnail(_S ? _default_thumbnail : NULL)
  ------------------
  |  Branch (224:18): [Folded, False: 64]
  ------------------
  225|     64|    , _load_factor(80)
  226|     64|    , _is_default_load_factor(true)
  227|     64|    , _hashfn(hashfn)
  228|     64|    , _eql(eql)
  229|     64|    , _pool(alloc) {
  230|     64|    init_buckets_and_thumbnail(_buckets, _thumbnail, _nbucket);
  231|     64|}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE4initEmj:
  320|     64|int FlatMap<_K, _T, _H, _E, _S, _A, _M>::init(size_t nbucket, u_int load_factor) {
  321|     64|    if (nbucket <= _nbucket || load_factor < 10 || load_factor > 100 ||
  ------------------
  |  Branch (321:9): [True: 0, False: 64]
  |  Branch (321:32): [True: 0, False: 64]
  |  Branch (321:52): [True: 0, False: 64]
  ------------------
  322|     64|        !_is_default_load_factor || !empty() || !is_default_buckets()) {
  ------------------
  |  Branch (322:9): [True: 0, False: 64]
  |  Branch (322:37): [True: 0, False: 64]
  |  Branch (322:49): [True: 0, False: 64]
  ------------------
  323|      0|        return 0;
  324|      0|    }
  325|       |
  326|     64|    init_load_factor(load_factor);
  327|     64|    return resize(nbucket) ? 0 : -1;
  ------------------
  |  Branch (327:12): [True: 64, False: 0]
  ------------------
  328|     64|}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE6resizeEm:
  755|     64|bool FlatMap<_K, _T, _H, _E, _S, _A, _M>::resize(size_t nbucket) {
  756|     64|    optional<NewBucketsInfo> info = new_buckets_and_thumbnail(_size, nbucket);
  757|     64|    if (!info.has_value()) {
  ------------------
  |  Branch (757:9): [True: 0, False: 64]
  ------------------
  758|      0|        return false;
  759|      0|    }
  760|       |
  761|     64|    for (iterator it = begin(); it != end(); ++it) {
  ------------------
  |  Branch (761:33): [True: 0, False: 64]
  ------------------
  762|      0|        const key_type& key = Element::first_ref_from_value(*it);
  763|      0|        const size_t index = flatmap_mod(_hashfn(key), info->nbucket);
  764|      0|        Bucket& first_node = info->buckets[index];
  765|      0|        if (!first_node.is_valid()) {
  ------------------
  |  Branch (765:13): [True: 0, False: 0]
  ------------------
  766|      0|            if (_S) {
  ------------------
  |  Branch (766:17): [Folded, False: 0]
  ------------------
  767|      0|                bit_array_set(info->thumbnail, index);
  768|      0|            }
  769|      0|            new (&first_node) Bucket(key);
  770|      0|            first_node.element().second_ref() =
  771|      0|                Element::second_movable_ref_from_value(*it);
  772|      0|        } else {
  773|      0|            Bucket* newp = new (_pool.get()) Bucket(key);
  774|      0|            newp->element().second_ref() =
  775|      0|                Element::second_movable_ref_from_value(*it);
  776|      0|            newp->next = first_node.next;
  777|      0|            first_node.next = newp;
  778|      0|        }
  779|      0|    }
  780|     64|    size_t saved_size = _size;
  781|     64|    clear();
  782|     64|    if (!is_default_buckets()) {
  ------------------
  |  Branch (782:9): [True: 0, False: 64]
  ------------------
  783|      0|        get_allocator().Free(_buckets);
  784|      0|        if (_S) {
  ------------------
  |  Branch (784:13): [Folded, False: 0]
  ------------------
  785|      0|            bit_array_free(_thumbnail);
  786|      0|        }
  787|      0|    }
  788|     64|    _nbucket = info->nbucket;
  789|     64|    _buckets = info->buckets;
  790|     64|    _thumbnail = info->thumbnail;
  791|     64|    _size = saved_size;
  792|       |
  793|     64|    return true;
  794|     64|}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE25new_buckets_and_thumbnailEmm:
  716|     64|                                                               size_t new_nbucket) {
  717|     64|    size_t bump = 0;
  718|     64|    do {
  719|       |        // The first iteration uses 'new_nbucket + 0' ensures that when new_nbucket is a power
  720|       |        // of 2 and is already sufficient to accommodate `size`, it does not need to be doubled.
  721|       |        // Subsequent use of 'new_nbucket + 1' avoids an infinite loop.
  722|     64|        new_nbucket = flatmap_round(new_nbucket + bump);
  723|     64|        bump = 1;
  724|     64|    } while (is_too_crowded(size, new_nbucket, _load_factor));
  ------------------
  |  Branch (724:14): [True: 0, False: 64]
  ------------------
  725|     64|    if (_nbucket == new_nbucket) {
  ------------------
  |  Branch (725:9): [True: 0, False: 64]
  ------------------
  726|      0|        return nullopt;
  727|      0|    }
  728|       |    // Note: need an extra bucket to let iterator know where buckets end.
  729|     64|    auto buckets = (Bucket*)get_allocator().Alloc(
  730|     64|        sizeof(Bucket) * (new_nbucket + 1/*note*/));
  731|     64|    auto guard = MakeScopeGuard([buckets, this]() {
  732|     64|        get_allocator().Free(buckets);
  733|     64|    });
  734|     64|    if (NULL == buckets) {
  ------------------
  |  Branch (734:9): [True: 0, False: 64]
  ------------------
  735|      0|        LOG(FATAL) << "Fail to new Buckets";
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  736|      0|        return nullopt;
  737|      0|    }
  738|       |
  739|     64|    uint64_t* thumbnail = NULL;
  740|     64|    if (_S) {
  ------------------
  |  Branch (740:9): [Folded, False: 64]
  ------------------
  741|      0|        thumbnail = bit_array_malloc(new_nbucket);
  742|      0|        if (NULL == thumbnail) {
  ------------------
  |  Branch (742:13): [True: 0, False: 0]
  ------------------
  743|      0|            LOG(FATAL) << "Fail to new thumbnail";
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  744|      0|            return nullopt;
  745|      0|        }
  746|      0|    }
  747|       |
  748|     64|    guard.dismiss();
  749|     64|    init_buckets_and_thumbnail(buckets, thumbnail, new_nbucket);
  750|     64|    return NewBucketsInfo{buckets, thumbnail, new_nbucket};
  751|     64|}
_ZNK5butil15FlatMapIteratorINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EEESt4pairIKS7_S9_EEneERKSJ_:
  106|     64|    { return _node != rhs._node; }
_ZN5butil15FlatMapIteratorINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EEESt4pairIKS7_S9_EE23find_and_set_valid_nodeEv:
  137|    128|    void find_and_set_valid_node() {
  138|  1.15k|        for (; !_entry->is_valid(); ++_entry);
  ------------------
  |  Branch (138:16): [True: 1.02k, False: 128]
  ------------------
  139|    128|        _node = _entry;
  140|    128|    }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE5clearEv:
  512|     64|void FlatMap<_K, _T, _H, _E, _S, _A, _M>::clear() {
  513|     64|    if (0 == _size) {
  ------------------
  |  Branch (513:9): [True: 64, False: 0]
  ------------------
  514|     64|        return;
  515|     64|    }
  516|      0|    _size = 0;
  517|      0|    if (NULL != _buckets) {
  ------------------
  |  Branch (517:9): [True: 0, False: 0]
  ------------------
  518|      0|        for (size_t i = 0; i < _nbucket; ++i) {
  ------------------
  |  Branch (518:28): [True: 0, False: 0]
  ------------------
  519|      0|            Bucket& first_node = _buckets[i];
  520|      0|            if (first_node.is_valid()) {
  ------------------
  |  Branch (520:17): [True: 0, False: 0]
  ------------------
  521|      0|                first_node.destroy_element();
  522|      0|                Bucket* p = first_node.next;
  523|      0|                while (p) {
  ------------------
  |  Branch (523:24): [True: 0, False: 0]
  ------------------
  524|      0|                    Bucket* next_p = p->next;
  525|      0|                    p->destroy_element();
  526|      0|                    _pool.back(p);
  527|      0|                    p = next_p;
  528|      0|                }
  529|      0|                first_node.set_invalid();
  530|      0|            }
  531|      0|        }
  532|      0|    }
  533|      0|    if (NULL != _thumbnail) {
  ------------------
  |  Branch (533:9): [True: 0, False: 0]
  ------------------
  534|      0|        bit_array_clear(_thumbnail, _nbucket);
  535|      0|    }
  536|      0|}
_ZNK5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE4seekIS6_EEPS8_RKT_:
  548|      8|_T* FlatMap<_K, _T, _H, _E, _S, _A, _M>::seek(const K2& key) const {
  549|      8|    Bucket& first_node = _buckets[flatmap_mod(_hashfn(key), _nbucket)];
  550|      8|    if (!first_node.is_valid()) {
  ------------------
  |  Branch (550:9): [True: 8, False: 0]
  ------------------
  551|      8|        return NULL;
  552|      8|    }
  553|      0|    if (_eql(first_node.element().first_ref(), key)) {
  ------------------
  |  Branch (553:9): [True: 0, False: 0]
  ------------------
  554|      0|        return &first_node.element().second_ref();
  555|      0|    }
  556|      0|    Bucket *p = first_node.next;
  557|      0|    while (p) {
  ------------------
  |  Branch (557:12): [True: 0, False: 0]
  ------------------
  558|      0|        if (_eql(p->element().first_ref(), key)) {
  ------------------
  |  Branch (558:13): [True: 0, False: 0]
  ------------------
  559|      0|            return &p->element().second_ref();
  560|      0|        }
  561|      0|        p = p->next;
  562|      0|    }
  563|      0|    return NULL;
  564|      0|}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EEixILb0EEENSt9enable_ifIXntT_ERS8_E4typeERKS6_:
  592|      8|FlatMap<_K, _T, _H, _E, _S, _A, _M>::operator[](const key_type& key) {
  593|      8|    const size_t index = flatmap_mod(_hashfn(key), _nbucket);
  594|      8|    Bucket& first_node = _buckets[index];
  595|      8|    if (!first_node.is_valid()) {
  ------------------
  |  Branch (595:9): [True: 8, False: 0]
  ------------------
  596|      8|        ++_size;
  597|      8|        if (_S) {
  ------------------
  |  Branch (597:13): [Folded, False: 8]
  ------------------
  598|      0|            bit_array_set(_thumbnail, index);
  599|      0|        }
  600|      8|        new (&first_node) Bucket(key);
  601|      8|        return first_node.element().second_ref();
  602|      8|    }
  603|      0|    Bucket *p = &first_node;
  604|      0|    while (true) {
  ------------------
  |  Branch (604:12): [True: 0, Folded]
  ------------------
  605|      0|        if (_eql(p->element().first_ref(), key)) {
  ------------------
  |  Branch (605:13): [True: 0, False: 0]
  ------------------
  606|      0|            return p->element().second_ref();
  607|      0|        }
  608|      0|        if (NULL == p->next) {
  ------------------
  |  Branch (608:13): [True: 0, False: 0]
  ------------------
  609|      0|            if (is_too_crowded(_size) && resize(_nbucket + 1)) {
  ------------------
  |  Branch (609:17): [True: 0, False: 0]
  |  Branch (609:42): [True: 0, False: 0]
  ------------------
  610|      0|                return operator[](key);
  611|      0|            }
  612|       |            // Fail to resize is OK.
  613|      0|            ++_size;
  614|      0|            Bucket* newp = new (_pool.get()) Bucket(key);
  615|      0|            p->next = newp;
  616|      0|            return newp->element().second_ref();
  617|      0|        }
  618|      0|        p = p->next;
  619|      0|    }
  620|      0|}
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE5beginEv:
  820|     64|FlatMap<_K, _T, _H, _E, _S, _A, _M>::begin() {
  821|     64|    return iterator(this, 0);
  822|     64|}
_ZN5butil15FlatMapIteratorINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EEESt4pairIKS7_S9_EEC2EPKSF_m:
   92|    128|    FlatMapIterator(const Map* map, size_t pos) {
   93|    128|        _entry = map->_buckets + pos;
   94|    128|        find_and_set_valid_node();
   95|    128|    }
_ZN5butil7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS6_EENS_14DefaultEqualToIS6_EELb0ENS_11PtAllocatorELb0EE3endEv:
  827|     64|FlatMap<_K, _T, _H, _E, _S, _A, _M>::end() {
  828|     64|    return iterator(this, _nbucket);
  829|     64|}

_ZN5butil8LinkNodeIN4bvar6detail7SamplerEE18InsertBeforeAsListEPS4_:
  102|      8|  void InsertBeforeAsList(LinkNode<T>* e) {
  103|      8|    LinkNode<T>* prev = this->previous_;
  104|      8|    prev->next_ = e;
  105|      8|    this->previous_ = e->previous_;
  106|      8|    e->previous_->next_ = this;
  107|      8|    e->previous_ = prev;
  108|      8|  }
_ZN5butil10LinkedListIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEEC2Ev:
  167|      2|  LinkedList() {}
_ZN5butil8LinkNodeIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEEC2Ev:
   88|    106|  LinkNode() : previous_(this), next_(this) {}
_ZNK5butil10LinkedListIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEE4headEv:
  179|      2|  LinkNode<T>* head() const {
  180|      2|    return root_.next();
  181|      2|  }
_ZNK5butil10LinkedListIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEE3endEv:
  187|      4|  const LinkNode<T>* end() const {
  188|      4|    return &root_;
  189|      4|  }
_ZN5butil8LinkNodeIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEE5valueEv:
  150|      2|  T* value() {
  151|      2|    return static_cast<T*>(this);
  152|      2|  }
_ZNK5butil8LinkNodeIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEE4nextEv:
  141|      4|  LinkNode<T>* next() const {
  142|      4|    return next_;
  143|      4|  }
_ZN5butil8LinkNodeIN4bvar6detail7SamplerEEC2Ev:
   88|     10|  LinkNode() : previous_(this), next_(this) {}
_ZNK5butil8LinkNodeIN4bvar6detail7SamplerEE4nextEv:
  141|     10|  LinkNode<T>* next() const {
  142|     10|    return next_;
  143|     10|  }
_ZN5butil8LinkNodeIN4bvar6detail7SamplerEE5valueEv:
  150|      8|  T* value() {
  151|      8|    return static_cast<T*>(this);
  152|      8|  }
_ZN5butil10LinkedListIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEE6AppendEPNS_8LinkNodeIS8_EE:
  170|      2|  void Append(LinkNode<T>* e) {
  171|      2|    e->InsertBefore(&root_);
  172|      2|  }
_ZN5butil8LinkNodeIN4bvar6detail13AgentCombinerIPNS2_7SamplerES5_NS2_14CombineSamplerEE5AgentEE12InsertBeforeEPS9_:
   94|      2|  void InsertBefore(LinkNode<T>* e) {
   95|      2|    this->next_ = e;
   96|      2|    this->previous_ = e->previous_;
   97|      2|    e->previous_->next_ = this;
   98|      2|    e->previous_ = this;
   99|      2|  }

_ZN5butil5debug10StackTraceC2Eb:
  766|      2|StackTrace::StackTrace(bool exclude_self) {
  767|       |  // NOTE: This code MUST be async-signal safe (it's used by in-process
  768|       |  // stack dumping signal handler). NO malloc or stdio is allowed here.
  769|       |
  770|      2|  if (GetStackTrace) {
  ------------------
  |  Branch (770:7): [True: 0, False: 2]
  ------------------
  771|      0|    count_ = GetStackTrace(trace_, arraysize(trace_), exclude_self ? 1 : 0);
  ------------------
  |  |  122|      0|#define arraysize(array) (sizeof(::butil::ArraySizeHelper(array)))
  ------------------
  |  Branch (771:55): [True: 0, False: 0]
  ------------------
  772|      2|  } else {
  773|      2|#if !defined(__UCLIBC__)
  774|       |    // Though the backtrace API man page does not list any possible negative
  775|       |    // return values, we take no chance.
  776|      2|    count_ = butil::saturated_cast<size_t>(backtrace(trace_, arraysize(trace_)));
  ------------------
  |  |  122|      2|#define arraysize(array) (sizeof(::butil::ArraySizeHelper(array)))
  ------------------
  777|      2|    if (exclude_self && count_ > 1) {
  ------------------
  |  Branch (777:9): [True: 0, False: 2]
  |  Branch (777:25): [True: 0, False: 0]
  ------------------
  778|       |      // Skip the top frame.
  779|      0|      memmove(trace_, trace_ + 1, (count_ - 1) * sizeof(void*));
  780|      0|      count_--;
  781|      0|    }
  782|       |#else
  783|       |    count_ = 0;
  784|       |#endif
  785|      2|  }
  786|      2|}

_ZN5butil23DescribeCustomizedErrnoEiPKcS1_:
   40|      2|    int error_code, const char* error_name, const char* description) {
   41|      2|    BAIDU_SCOPED_LOCK(modify_desc_mutex);
  ------------------
  |  |   47|      2|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      2|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      2|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      2|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   42|      2|    if (error_code < ERRNO_BEGIN || error_code >= ERRNO_END) {
  ------------------
  |  Branch (42:9): [True: 0, False: 2]
  |  Branch (42:37): [True: 0, False: 2]
  ------------------
   43|       |        // error() is a non-portable GNU extension that should not be used.
   44|      0|        fprintf(stderr, "Fail to define %s(%d) which is out of range, abort.",
   45|      0|              error_name, error_code);
   46|      0|        _exit(1);
   47|      0|    }
   48|      2|    const char* desc = errno_desc[error_code - ERRNO_BEGIN];
   49|      2|    if (desc) {
  ------------------
  |  Branch (49:9): [True: 0, False: 2]
  ------------------
   50|      0|        if (strcmp(desc, description) == 0) {
  ------------------
  |  Branch (50:13): [True: 0, False: 0]
  ------------------
   51|      0|            fprintf(stderr, "WARNING: Detected shared library loading\n");
   52|      0|            return -1;
   53|      0|        }
   54|      2|    } else {
   55|       |#if defined(OS_MACOSX)
   56|       |        const int rc = strerror_r(error_code, tls_error_buf, ERROR_BUFSIZE);
   57|       |        if (rc != EINVAL)
   58|       |#else
   59|      2|        desc = strerror_r(error_code, tls_error_buf, ERROR_BUFSIZE);
   60|      2|        if (desc && strncmp(desc, "Unknown error", 13) != 0)
  ------------------
  |  Branch (60:13): [True: 2, False: 0]
  |  Branch (60:21): [True: 0, False: 2]
  ------------------
   61|      0|#endif
   62|      0|        {
   63|      0|            fprintf(stderr, "WARNING: Fail to define %s(%d) which is already defined as `%s'",
   64|      0|                    error_name, error_code, desc);
   65|      0|        }
   66|      2|    }
   67|      2|    errno_desc[error_code - ERRNO_BEGIN] = description;
   68|      2|    return 0;  // must
   69|      2|}

_ZN5butil13AlignedMemoryILm48ELm8EE9void_dataEv:
   71|     16|      void* void_data() { return static_cast<void*>(data_); }     \
_ZN5butil13AlignedMemoryILm48ELm8EE7data_asINS_14FlatMapElementINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryEEEEEPT_v:
   76|      8|      Type* data_as() { return static_cast<Type*>(void_data()); } \

_ZN5butil17ManualConstructorINS_14FlatMapElementINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryEEEE4InitIJRKS7_EEEvDpOT_:
   62|      8|    void Init(Args&&... args) {
   63|      8|        new (_space.void_data()) Type(std::forward<Args>(args)...);
   64|      8|    }
_ZN5butil17ManualConstructorINS_14FlatMapElementINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryEEEEdeEv:
   58|      8|    Type& operator*() { return *get(); }
_ZN5butil17ManualConstructorINS_14FlatMapElementINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryEEEE3getEv:
   47|      8|    Type* get() {
   48|      8|        return _space.template data_as<Type>();
   49|      8|    }

_ZN5butil14MakeScopeGuardIZNS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE25new_buckets_and_thumbnailEmmEUlvE_EENS_10ScopeGuardIT_St9enable_ifIXsr14is_result_voidISI_EE5valueEvEEEOSI_:
   76|     64|ScopeGuard<Callback> MakeScopeGuard(Callback&& callback) noexcept {
   77|     64|    return ScopeGuard<Callback>{ std::forward<Callback>(callback)};
   78|     64|}
_ZN5butil10ScopeGuardIZNS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE25new_buckets_and_thumbnailEmmEUlvE_St9enable_ifILb1EvEEC2EOSG_:
   64|     64|        :_callback(std::forward<Callback>(callback))
   65|     64|        , _dismiss(false) {}
_ZN5butil10ScopeGuardIZNS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE25new_buckets_and_thumbnailEmmEUlvE_St9enable_ifILb1EvEE7dismissEv:
   50|     64|    void dismiss() noexcept {
   51|     64|        _dismiss = true;
   52|     64|    }
_ZN5butil10ScopeGuardIZNS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE25new_buckets_and_thumbnailEmmEUlvE_St9enable_ifILb1EvEED2Ev:
   44|     64|    ~ScopeGuard() noexcept {
   45|     64|        if(!_dismiss) {
  ------------------
  |  Branch (45:12): [True: 0, False: 64]
  ------------------
   46|      0|            _callback();
   47|      0|        }
   48|     64|    }

_ZN5butil19get_leaky_singletonIN4bvar6detail16SamplerCollectorEEEPT_v:
   60|      8|inline T* get_leaky_singleton() {
   61|      8|    const butil::subtle::AtomicWord value = butil::subtle::Acquire_Load(
   62|      8|        &GetLeakySingleton<T>::g_leaky_singleton_untyped);
   63|      8|    if (value) {
  ------------------
  |  Branch (63:9): [True: 6, False: 2]
  ------------------
   64|      6|        return reinterpret_cast<T*>(value);
   65|      6|    }
   66|      2|    pthread_once(&GetLeakySingleton<T>::g_create_leaky_singleton_once,
   67|      2|                 GetLeakySingleton<T>::create_leaky_singleton);
   68|      2|    return reinterpret_cast<T*>(
   69|      2|        GetLeakySingleton<T>::g_leaky_singleton_untyped);
   70|      8|}
_ZN5butil17GetLeakySingletonIN4bvar6detail16SamplerCollectorEE22create_leaky_singletonEv:
   47|      2|void GetLeakySingleton<T>::create_leaky_singleton() {
   48|      2|    T* obj = create_leaky_singleton_obj<T>();
   49|      2|    butil::subtle::Release_Store(
   50|      2|        &g_leaky_singleton_untyped,
   51|      2|        reinterpret_cast<butil::subtle::AtomicWord>(obj));
   52|      2|}
_ZN5butil26create_leaky_singleton_objIN4bvar6detail16SamplerCollectorEEEPT_v:
   29|      2|T* create_leaky_singleton_obj() {
   30|      2|    return new T();
   31|      2|}

_ZN5butil14saturated_castImiEET_T0_:
   36|      2|inline Dst saturated_cast(Src value) {
   37|       |  // Optimization for floating point values, which already saturate.
   38|      2|  if (std::numeric_limits<Dst>::is_iec559)
  ------------------
  |  Branch (38:7): [Folded, False: 2]
  ------------------
   39|      0|    return static_cast<Dst>(value);
   40|       |
   41|      2|  switch (internal::DstRangeRelationToSrcRange<Dst>(value)) {
  ------------------
  |  Branch (41:11): [True: 2, False: 0]
  ------------------
   42|      2|    case internal::RANGE_VALID:
  ------------------
  |  Branch (42:5): [True: 2, False: 0]
  ------------------
   43|      2|      return static_cast<Dst>(value);
   44|       |
   45|      0|    case internal::RANGE_UNDERFLOW:
  ------------------
  |  Branch (45:5): [True: 0, False: 2]
  ------------------
   46|      0|      return std::numeric_limits<Dst>::min();
   47|       |
   48|      0|    case internal::RANGE_OVERFLOW:
  ------------------
  |  Branch (48:5): [True: 0, False: 2]
  ------------------
   49|      0|      return std::numeric_limits<Dst>::max();
   50|       |
   51|       |    // Should fail only on attempting to assign NaN to a saturated integer.
   52|      0|    case internal::RANGE_INVALID:
  ------------------
  |  Branch (52:5): [True: 0, False: 2]
  ------------------
   53|      0|      CHECK(false);
  ------------------
  |  |  617|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(FATAL).SetCheck(), !(condition))     \
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  618|      0|    << "Check failed: " #condition ". "
  ------------------
   54|      0|      return std::numeric_limits<Dst>::max();
   55|      2|  }
   56|       |
   57|      0|  NOTREACHED();
  ------------------
  |  | 1224|      2|#define NOTREACHED() DCHECK(false)
  |  |  ------------------
  |  |  |  |  846|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(DCHECK), DCHECK_IS_ON() && !(condition)) \
  |  |  |  |  ------------------
  |  |  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (472:7): [Folded, False: 0]
  |  |  |  |  |  |  |  Branch (472:7): [True: 0, Folded]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  847|      0|    << "Check failed: " #condition ". "
  |  |  ------------------
  ------------------
   58|      0|  return static_cast<Dst>(value);
   59|      2|}

_ZN5butil8internal26DstRangeRelationToSrcRangeImiEENS0_15RangeConstraintET0_:
  205|      2|inline RangeConstraint DstRangeRelationToSrcRange(Src value) {
  206|      2|  COMPILE_ASSERT(std::numeric_limits<Src>::is_specialized,
  ------------------
  |  |  241|      2|#define COMPILE_ASSERT(expr, msg)  BAIDU_CASSERT(expr, msg)
  |  |  ------------------
  |  |  |  |  196|      2|#define BAIDU_CASSERT(expr, msg) static_assert(expr, #msg)
  |  |  ------------------
  ------------------
  207|      2|                 argument_must_be_numeric);
  208|      2|  COMPILE_ASSERT(std::numeric_limits<Dst>::is_specialized,
  ------------------
  |  |  241|      2|#define COMPILE_ASSERT(expr, msg)  BAIDU_CASSERT(expr, msg)
  |  |  ------------------
  |  |  |  |  196|      2|#define BAIDU_CASSERT(expr, msg) static_assert(expr, #msg)
  |  |  ------------------
  ------------------
  209|      2|                 result_must_be_numeric);
  210|      2|  return DstRangeRelationToSrcRangeImpl<Dst, Src>::Check(value);
  211|      2|}
_ZN5butil8internal30DstRangeRelationToSrcRangeImplImiLNS0_21IntegerRepresentationE0ELS2_1ELNS0_26NumericRangeRepresentationE0EE5CheckEi:
  195|      2|  static RangeConstraint Check(Src value) {
  196|      2|    return (MaxExponent<Dst>::value >= MaxExponent<Src>::value)
  ------------------
  |  Branch (196:12): [True: 2, Folded]
  ------------------
  197|      2|               ? GetRangeConstraint(true, value >= static_cast<Src>(0))
  198|      2|               : GetRangeConstraint(
  199|      0|                     value <= static_cast<Src>(std::numeric_limits<Dst>::max()),
  200|      0|                     value >= static_cast<Src>(0));
  201|      2|  }
_ZN5butil8internal18GetRangeConstraintEbb:
  107|      2|                                   bool is_in_lower_bound) {
  108|      2|  return GetRangeConstraint((is_in_upper_bound ? 0 : RANGE_OVERFLOW) |
  ------------------
  |  Branch (108:30): [True: 2, False: 0]
  ------------------
  109|      2|                            (is_in_lower_bound ? 0 : RANGE_UNDERFLOW));
  ------------------
  |  Branch (109:30): [True: 2, False: 0]
  ------------------
  110|      2|}
_ZN5butil8internal18GetRangeConstraintEi:
   97|      2|inline RangeConstraint GetRangeConstraint(int integer_range_constraint) {
   98|      2|  DCHECK(integer_range_constraint >= RANGE_VALID &&
  ------------------
  |  |  846|      2|    BAIDU_LAZY_STREAM(LOG_STREAM(DCHECK), DCHECK_IS_ON() && !(condition)) \
  |  |  ------------------
  |  |  |  |  472|      2|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:7): [True: 0, False: 0]
  |  |  |  |  |  Branch (472:7): [True: 0, False: 0]
  |  |  |  |  |  Branch (472:7): [Folded, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  847|      0|    << "Check failed: " #condition ". "
  ------------------
   99|      2|         integer_range_constraint <= RANGE_INVALID);
  100|      2|  return static_cast<RangeConstraint>(integer_range_constraint);
  101|      2|}

_ZN5butil30RegisterFlagValidatorOrDieImplIbEEbPKT_PFbPKcS1_E:
   64|     18|    const T* flag, bool (*validate_fn)(const char*, T val)) {
   65|     18|    static_assert(!butil::is_same<std::string, T>::value,
   66|     18|                  "Not support string flags");
   67|     18|    if (::GFLAGS_NAMESPACE::RegisterFlagValidator(flag, validate_fn)) {
  ------------------
  |  Branch (67:9): [True: 18, False: 0]
  ------------------
   68|     18|        return true;
   69|     18|    }
   70|       |    // Error printed by gflags does not have newline. Add one to it.
   71|      0|    char newline = '\n';
   72|      0|    butil::ignore_result(write(2, &newline, 1));
   73|      0|    _exit(1);
   74|     18|}
_ZN5butil30RegisterFlagValidatorOrDieImplIiEEbPKT_PFbPKcS1_E:
   64|     26|    const T* flag, bool (*validate_fn)(const char*, T val)) {
   65|     26|    static_assert(!butil::is_same<std::string, T>::value,
   66|     26|                  "Not support string flags");
   67|     26|    if (::GFLAGS_NAMESPACE::RegisterFlagValidator(flag, validate_fn)) {
  ------------------
  |  Branch (67:9): [True: 26, False: 0]
  ------------------
   68|     26|        return true;
   69|     26|    }
   70|       |    // Error printed by gflags does not have newline. Add one to it.
   71|      0|    char newline = '\n';
   72|      0|    butil::ignore_result(write(2, &newline, 1));
   73|      0|    _exit(1);
   74|     26|}
_ZN5butil30RegisterFlagValidatorOrDieImplIjEEbPKT_PFbPKcS1_E:
   64|      2|    const T* flag, bool (*validate_fn)(const char*, T val)) {
   65|      2|    static_assert(!butil::is_same<std::string, T>::value,
   66|      2|                  "Not support string flags");
   67|      2|    if (::GFLAGS_NAMESPACE::RegisterFlagValidator(flag, validate_fn)) {
  ------------------
  |  Branch (67:9): [True: 2, False: 0]
  ------------------
   68|      2|        return true;
   69|      2|    }
   70|       |    // Error printed by gflags does not have newline. Add one to it.
   71|      0|    char newline = '\n';
   72|      0|    butil::ignore_result(write(2, &newline, 1));
   73|      0|    _exit(1);
   74|      2|}

_ZNSt10lock_guardI15pthread_mutex_tEC2ERS0_:
  155|     22|    explicit lock_guard(pthread_mutex_t & mutex) : _pmutex(&mutex) {
  156|       |#if !defined(NDEBUG)
  157|       |        const int rc = pthread_mutex_lock(_pmutex);
  158|       |        if (rc) {
  159|       |            LOG(FATAL) << "Fail to lock pthread_mutex_t=" << _pmutex << ", " << berror(rc);
  160|       |            _pmutex = NULL;
  161|       |        }
  162|       |#else
  163|     22|        pthread_mutex_lock(_pmutex);
  164|     22|#endif  // NDEBUG
  165|     22|    }
_ZNSt10lock_guardI15pthread_mutex_tED2Ev:
  167|     22|    ~lock_guard() {
  168|       |#ifndef NDEBUG
  169|       |        if (_pmutex) {
  170|       |            pthread_mutex_unlock(_pmutex);
  171|       |        }
  172|       |#else
  173|     22|        pthread_mutex_unlock(_pmutex);
  174|     22|#endif
  175|     22|    }

_ZN5butil11PtAllocator5AllocEm:
   35|     64|    void* Alloc(size_t n) { return malloc(n); }
_ZN5butil18SingleThreadedPoolILm56ELm1024ELm16ENS_11PtAllocatorEEC2ERKS1_:
   65|     64|        : _free_nodes(NULL), _blocks(NULL), _allocator(alloc) {}
_ZN5butil18SingleThreadedPoolILm56ELm1024ELm16ENS_11PtAllocatorEE13get_allocatorEv:
  136|     64|    Allocator& get_allocator() { return _allocator; }

_ZN5butil14string_appendfEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKcz:
  121|  8.97k|int string_appendf(std::string* output, const char* format, ...) {
  122|  8.97k|    va_list ap;
  123|  8.97k|    va_start(ap, format);
  124|  8.97k|    const int rc = string_vappendf(output, format, ap);
  125|       |    va_end(ap);
  126|  8.97k|    return rc;
  127|  8.97k|}
_ZN5butil15string_vappendfEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKcP13__va_list_tag:
  129|  8.97k|int string_vappendf(std::string* output, const char* format, va_list args) {
  130|  8.97k|    const size_t old_size = output->size();
  131|  8.97k|    const int rc = string_printf_impl(*output, format, args);
  132|  8.97k|    if (rc != 0) {
  ------------------
  |  Branch (132:9): [True: 0, False: 8.97k]
  ------------------
  133|      0|        output->resize(old_size);
  134|      0|    }
  135|  8.97k|    return rc;
  136|  8.97k|}
string_printf.cpp:_ZN5butil12_GLOBAL__N_118string_printf_implERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKcP13__va_list_tag:
   38|  8.97k|                              va_list args) {
   39|       |    // Tru to the space at the end of output for our output buffer.
   40|       |    // Find out write point then inflate its size temporarily to its
   41|       |    // capacity; we will later shrink it to the size needed to represent
   42|       |    // the formatted string.  If this buffer isn't large enough, we do a
   43|       |    // resize and try again.
   44|       |
   45|  8.97k|    const int write_point = output.size();
   46|  8.97k|    int remaining = output.capacity() - write_point;
   47|  8.97k|    output.resize(output.capacity());
   48|       |
   49|  8.97k|    va_list copied_args;
   50|  8.97k|    va_copy(copied_args, args);
   51|  8.97k|    int bytes_used = vsnprintf(&output[write_point], remaining, format,
   52|  8.97k|                               copied_args);
   53|  8.97k|    va_end(copied_args);
   54|  8.97k|    if (bytes_used < 0) {
  ------------------
  |  Branch (54:9): [True: 0, False: 8.97k]
  ------------------
   55|      0|        return -1;
   56|  8.97k|    } else if (bytes_used < remaining) {
  ------------------
  |  Branch (56:16): [True: 1.96k, False: 7.01k]
  ------------------
   57|       |        // There was enough room, just shrink and return.
   58|  1.96k|        output.resize(write_point + bytes_used);
   59|  7.01k|    } else {
   60|  7.01k|        output.resize(write_point + bytes_used + 1);
   61|  7.01k|        remaining = bytes_used + 1;
   62|  7.01k|        bytes_used = vsnprintf(&output[write_point], remaining, format, args);
   63|  7.01k|        if (bytes_used + 1 != remaining) {
  ------------------
  |  Branch (63:13): [True: 0, False: 7.01k]
  ------------------
   64|      0|            return -1;
   65|      0|        }
   66|  7.01k|        output.resize(write_point + bytes_used);
   67|  7.01k|    }
   68|  8.97k|    return 0;
   69|  8.97k|}

_ZN5butil13StringToInt64ERKNS_16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPl:
  412|    410|bool StringToInt64(const StringPiece& input, int64_t* output) {
  413|    410|  return StringToIntImpl(input, output);
  414|    410|}
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_117LocalIsWhitespaceIcEEbT_:
  130|    664|template<typename CHAR> bool LocalIsWhitespace(CHAR c) {
  131|    664|  return WhitespaceHelper<CHAR>::Invoke(c);
  132|    664|}
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_116WhitespaceHelperIcE6InvokeEc:
  118|    664|  static bool Invoke(char c) {
  119|    664|    return 0 != isspace(static_cast<unsigned char>(c));
  120|    664|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_111CharToDigitILi10EcEEbT0_Ph:
  105|  4.91k|template<int BASE, typename CHAR> bool CharToDigit(CHAR c, uint8_t* digit) {
  106|  4.91k|  return BaseCharToDigit<CHAR, BASE, BASE <= 10>::Convert(c, digit);
  107|  4.91k|}
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_115BaseCharToDigitIcLi10ELb1EE7ConvertEcPh:
   79|  4.91k|  static bool Convert(CHAR c, uint8_t* digit) {
   80|  4.91k|    if (c >= '0' && c < '0' + BASE) {
  ------------------
  |  Branch (80:9): [True: 4.85k, False: 58]
  |  Branch (80:21): [True: 4.82k, False: 27]
  ------------------
   81|  4.82k|      *digit = c - '0';
   82|  4.82k|      return true;
   83|  4.82k|    }
   84|     85|    return false;
   85|  4.91k|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_115StringToIntImplIlEEbRKNS_16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPT_:
  325|    410|bool StringToIntImpl(const StringPiece& input, VALUE* output) {
  326|    410|  return IteratorRangeToNumber<StringPieceToNumberTraits<VALUE, 10> >::Invoke(
  327|    410|      input.begin(), input.end(), output);
  328|    410|}
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE6InvokeEPKcS6_Pl:
  151|    410|                     value_type* output) {
  152|    410|    bool valid = true;
  153|       |
  154|    688|    while (begin != end && LocalIsWhitespace(*begin)) {
  ------------------
  |  Branch (154:12): [True: 664, False: 24]
  |  Branch (154:28): [True: 278, False: 386]
  ------------------
  155|    278|      valid = false;
  156|    278|      ++begin;
  157|    278|    }
  158|       |
  159|    410|    if (begin != end && *begin == '-') {
  ------------------
  |  Branch (159:9): [True: 386, False: 24]
  |  Branch (159:25): [True: 178, False: 208]
  ------------------
  160|    178|      if (!std::numeric_limits<value_type>::is_signed) {
  ------------------
  |  Branch (160:11): [Folded, False: 178]
  ------------------
  161|      0|        valid = false;
  162|    178|      } else if (!Negative::Invoke(begin + 1, end, output)) {
  ------------------
  |  Branch (162:18): [True: 97, False: 81]
  ------------------
  163|     97|        valid = false;
  164|     97|      }
  165|    232|    } else {
  166|    232|      if (begin != end && *begin == '+') {
  ------------------
  |  Branch (166:11): [True: 208, False: 24]
  |  Branch (166:27): [True: 1, False: 207]
  ------------------
  167|      1|        ++begin;
  168|      1|      }
  169|    232|      if (!Positive::Invoke(begin, end, output)) {
  ------------------
  |  Branch (169:11): [True: 87, False: 145]
  ------------------
  170|     87|        valid = false;
  171|     87|      }
  172|    232|    }
  173|       |
  174|    410|    return valid;
  175|    410|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE4BaseINS4_8NegativeEE6InvokeEPKcS9_Pl:
  187|    178|                       typename traits::value_type* output) {
  188|    178|      *output = 0;
  189|       |
  190|    178|      if (begin == end) {
  ------------------
  |  Branch (190:11): [True: 1, False: 177]
  ------------------
  191|      1|        return false;
  192|      1|      }
  193|       |
  194|       |      // Note: no performance difference was found when using template
  195|       |      // specialization to remove this check in bases other than 16
  196|    177|      if (traits::kBase == 16 && end - begin > 2 && *begin == '0' &&
  ------------------
  |  Branch (196:11): [Folded, False: 177]
  |  Branch (196:34): [True: 0, False: 0]
  |  Branch (196:53): [True: 0, False: 0]
  ------------------
  197|      0|          (*(begin + 1) == 'x' || *(begin + 1) == 'X')) {
  ------------------
  |  Branch (197:12): [True: 0, False: 0]
  |  Branch (197:35): [True: 0, False: 0]
  ------------------
  198|      0|        begin += 2;
  199|      0|      }
  200|       |
  201|  2.53k|      for (const_iterator current = begin; current != end; ++current) {
  ------------------
  |  Branch (201:44): [True: 2.44k, False: 81]
  ------------------
  202|  2.44k|        uint8_t new_digit = 0;
  203|       |
  204|  2.44k|        if (!CharToDigit<traits::kBase>(*current, &new_digit)) {
  ------------------
  |  Branch (204:13): [True: 30, False: 2.41k]
  ------------------
  205|     30|          return false;
  206|     30|        }
  207|       |
  208|  2.41k|        if (current != begin) {
  ------------------
  |  Branch (208:13): [True: 2.25k, False: 164]
  ------------------
  209|  2.25k|          if (!Sign::CheckBounds(output, new_digit)) {
  ------------------
  |  Branch (209:15): [True: 66, False: 2.18k]
  ------------------
  210|     66|            return false;
  211|     66|          }
  212|  2.18k|          *output *= traits::kBase;
  213|  2.18k|        }
  214|       |
  215|  2.35k|        Sign::Increment(new_digit, output);
  216|  2.35k|      }
  217|     81|      return true;
  218|    177|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Negative11CheckBoundsEPlh:
  239|  2.25k|    static bool CheckBounds(value_type* output, uint8_t new_digit) {
  240|  2.25k|      if (*output < traits::min() / traits::kBase ||
  ------------------
  |  Branch (240:11): [True: 65, False: 2.19k]
  ------------------
  241|  2.19k|          (*output == traits::min() / traits::kBase &&
  ------------------
  |  Branch (241:12): [True: 6, False: 2.18k]
  ------------------
  242|     66|           new_digit > 0 - traits::min() % traits::kBase)) {
  ------------------
  |  Branch (242:12): [True: 1, False: 5]
  ------------------
  243|     66|        *output = traits::min();
  244|     66|        return false;
  245|     66|      }
  246|  2.18k|      return true;
  247|  2.25k|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_131BaseIteratorRangeToNumberTraitsIPKclLi10EE3minEv:
  259|  4.51k|  static value_type min() {
  260|  4.51k|    return std::numeric_limits<value_type>::min();
  261|  4.51k|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Negative9IncrementEhPl:
  248|  2.35k|    static void Increment(uint8_t increment, value_type* output) {
  249|  2.35k|      *output -= increment;
  250|  2.35k|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE4BaseINS4_8PositiveEE6InvokeEPKcS9_Pl:
  187|    232|                       typename traits::value_type* output) {
  188|    232|      *output = 0;
  189|       |
  190|    232|      if (begin == end) {
  ------------------
  |  Branch (190:11): [True: 25, False: 207]
  ------------------
  191|     25|        return false;
  192|     25|      }
  193|       |
  194|       |      // Note: no performance difference was found when using template
  195|       |      // specialization to remove this check in bases other than 16
  196|    207|      if (traits::kBase == 16 && end - begin > 2 && *begin == '0' &&
  ------------------
  |  Branch (196:11): [Folded, False: 207]
  |  Branch (196:34): [True: 0, False: 0]
  |  Branch (196:53): [True: 0, False: 0]
  ------------------
  197|      0|          (*(begin + 1) == 'x' || *(begin + 1) == 'X')) {
  ------------------
  |  Branch (197:12): [True: 0, False: 0]
  |  Branch (197:35): [True: 0, False: 0]
  ------------------
  198|      0|        begin += 2;
  199|      0|      }
  200|       |
  201|  2.60k|      for (const_iterator current = begin; current != end; ++current) {
  ------------------
  |  Branch (201:44): [True: 2.46k, False: 145]
  ------------------
  202|  2.46k|        uint8_t new_digit = 0;
  203|       |
  204|  2.46k|        if (!CharToDigit<traits::kBase>(*current, &new_digit)) {
  ------------------
  |  Branch (204:13): [True: 55, False: 2.40k]
  ------------------
  205|     55|          return false;
  206|     55|        }
  207|       |
  208|  2.40k|        if (current != begin) {
  ------------------
  |  Branch (208:13): [True: 2.23k, False: 173]
  ------------------
  209|  2.23k|          if (!Sign::CheckBounds(output, new_digit)) {
  ------------------
  |  Branch (209:15): [True: 7, False: 2.22k]
  ------------------
  210|      7|            return false;
  211|      7|          }
  212|  2.22k|          *output *= traits::kBase;
  213|  2.22k|        }
  214|       |
  215|  2.40k|        Sign::Increment(new_digit, output);
  216|  2.40k|      }
  217|    145|      return true;
  218|    207|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Positive11CheckBoundsEPlh:
  223|  2.23k|    static bool CheckBounds(value_type* output, uint8_t new_digit) {
  224|  2.23k|      if (*output > static_cast<value_type>(traits::max() / traits::kBase) ||
  ------------------
  |  Branch (224:11): [True: 5, False: 2.22k]
  ------------------
  225|  2.22k|          (*output == static_cast<value_type>(traits::max() / traits::kBase) &&
  ------------------
  |  Branch (225:12): [True: 7, False: 2.22k]
  ------------------
  226|      7|           new_digit > traits::max() % traits::kBase)) {
  ------------------
  |  Branch (226:12): [True: 2, False: 5]
  ------------------
  227|      7|        *output = traits::max();
  228|      7|        return false;
  229|      7|      }
  230|  2.22k|      return true;
  231|  2.23k|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_131BaseIteratorRangeToNumberTraitsIPKclLi10EE3maxEv:
  262|  4.47k|  static value_type max() {
  263|  4.47k|    return std::numeric_limits<value_type>::max();
  264|  4.47k|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Positive9IncrementEhPl:
  232|  2.40k|    static void Increment(uint8_t increment, value_type* output) {
  233|  2.40k|      *output += increment;
  234|  2.40k|    }

_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2EPKc:
  192|      8|      : ptr_(str),
  193|      8|        length_((str == NULL) ? 0 : STRING_TYPE::traits_type::length(str)) {}
  ------------------
  |  Branch (193:17): [True: 0, False: 8]
  ------------------
_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2Ev:
  190|      8|  BasicStringPiece() : ptr_(NULL), length_(0) {}
_ZN5butil9back_charERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  479|     16|inline char back_char(const std::string& s) { return s[s.size() - 1]; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4dataEv:
  214|    935|  const value_type* data() const { return ptr_; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4sizeEv:
  215|  1.70k|  size_type size() const { return length_; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5beginEv:
  280|    410|  const_iterator begin() const { return ptr_; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3endEv:
  281|    410|  const_iterator end() const { return ptr_ + length_; }
_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2ERKS6_:
  200|    757|      : ptr_(str.data()), length_(str.size()) {}
_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2EPKcm:
  202|    410|      : ptr_(offset), length_(len) {}
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5emptyEv:
  217|     16|  bool empty() const { return length_ == 0; }

_ZN5butil12EnsureStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  263|  25.8k|inline std::string EnsureString(const std::string& s) {
  264|  25.8k|    return s;
  265|  25.8k|}

_ZN5butil5MutexC2Ev:
   50|    116|    Mutex() {
   51|       |#if defined(OS_WIN)
   52|       |    // The second parameter is the spin count, for short-held locks it avoid the
   53|       |    // contending thread from going to sleep which helps performance greatly.
   54|       |        ::InitializeCriticalSectionAndSpinCount(&_native_handle, 2000);
   55|       |#elif defined(OS_POSIX)
   56|       |        pthread_mutex_init(&_native_handle, NULL);
   57|    116|#endif
   58|    116|    }
_ZN5butil5Mutex4lockEv:
   70|     24|    void lock() {
   71|       |#if defined(OS_WIN)
   72|       |        ::EnterCriticalSection(&_native_handle);
   73|       |#elif defined(OS_POSIX)
   74|       |        pthread_mutex_lock(&_native_handle);
   75|     24|#endif
   76|     24|    }
_ZN5butil5Mutex6unlockEv:
   80|     24|    void unlock() {
   81|       |#if defined(OS_WIN)
   82|       |        ::LeaveCriticalSection(&_native_handle);
   83|       |#elif defined(OS_POSIX)
   84|       |        pthread_mutex_unlock(&_native_handle);
   85|     24|#endif
   86|     24|    }
_ZN5butil4LockC2Ev:
  126|    106|    Lock() {}
_ZN5butil4Lock7AcquireEv:
  128|     16|    void Acquire() { lock(); }
_ZN5butil4Lock7ReleaseEv:
  129|     16|    void Release() { unlock(); }
_ZNK5butil4Lock14AssertAcquiredEv:
  131|     16|    void AssertAcquired() const {}
_ZN5butil8AutoLockC2ERNS_4LockE:
  139|     16|    explicit AutoLock(Lock& lock) : lock_(lock) {
  140|     16|        lock_.Acquire();
  141|     16|    }
_ZN5butil8AutoLockD2Ev:
  147|     16|    ~AutoLock() {
  148|     16|        lock_.AssertAcquired();
  149|     16|        lock_.Release();
  150|     16|    }

modp_b64_decode:
  199|    757|{
  200|       |#if USE_RVV_BASE64
  201|       |    return rvv_modp_b64_decode(dest, src, len);
  202|       |#endif
  203|    757|    if (len == 0) return 0;
  ------------------
  |  Branch (203:9): [True: 463, False: 294]
  ------------------
  204|       |
  205|    294|#ifdef DOPAD
  206|       |    /*
  207|       |     * if padding is used, then the message must be at least
  208|       |     * 4 chars and be a multiple of 4
  209|       |     */
  210|    294|    if (len < 4 || (len % 4 != 0)) return MODP_B64_ERROR; /* error */
  ------------------
  |  |  135|     30|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (210:9): [True: 15, False: 279]
  |  Branch (210:20): [True: 15, False: 264]
  ------------------
  211|       |    /* there can be at most 2 pad chars at the end */
  212|    264|    if (src[len-1] == CHARPAD) {
  ------------------
  |  |    6|    264|#define CHARPAD '='
  ------------------
  |  Branch (212:9): [True: 149, False: 115]
  ------------------
  213|    149|        len--;
  214|    149|        if (src[len -1] == CHARPAD) {
  ------------------
  |  |    6|    149|#define CHARPAD '='
  ------------------
  |  Branch (214:13): [True: 47, False: 102]
  ------------------
  215|     47|            len--;
  216|     47|        }
  217|    149|    }
  218|    264|#endif
  219|       |
  220|    264|    size_t i;
  221|    264|    int leftover = len % 4;
  222|    264|    size_t chunks = (leftover == 0) ? len / 4 - 1 : len /4;
  ------------------
  |  Branch (222:21): [True: 115, False: 149]
  ------------------
  223|       |
  224|    264|    uint8_t* p = (uint8_t*)dest;
  225|    264|    uint32_t x = 0;
  226|    264|    uint32_t* destInt = (uint32_t*) p;
  227|    264|    uint32_t* srcInt = (uint32_t*) src;
  228|    264|    uint32_t y = *srcInt++;
  229|    988|    for (i = 0; i < chunks; ++i) {
  ------------------
  |  Branch (229:17): [True: 728, False: 260]
  ------------------
  230|    728|        x = d0[y & 0xff] |
  231|    728|            d1[(y >> 8) & 0xff] |
  232|    728|            d2[(y >> 16) & 0xff] |
  233|    728|            d3[(y >> 24) & 0xff];
  234|       |
  235|    728|        if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   67|    728|#define BADCHAR 0x01FFFFFF
  ------------------
                      if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  135|      4|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (235:13): [True: 4, False: 724]
  ------------------
  236|    724|        *destInt = x ;
  237|    724|        p += 3;
  238|    724|        destInt = (uint32_t*)p;
  239|    724|        y = *srcInt++;}
  240|       |
  241|       |
  242|    260|    switch (leftover) {
  243|    113|    case 0:
  ------------------
  |  Branch (243:5): [True: 113, False: 147]
  ------------------
  244|    113|        x = d0[y & 0xff] |
  245|    113|            d1[(y >> 8) & 0xff] |
  246|    113|            d2[(y >> 16) & 0xff] |
  247|    113|            d3[(y >> 24) & 0xff];
  248|       |
  249|    113|        if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   67|    113|#define BADCHAR 0x01FFFFFF
  ------------------
                      if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  135|     12|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (249:13): [True: 12, False: 101]
  ------------------
  250|    101|        *p++ =  ((uint8_t*)(&x))[0];
  251|    101|        *p++ =  ((uint8_t*)(&x))[1];
  252|    101|        *p =    ((uint8_t*)(&x))[2];
  253|    101|        return (chunks+1)*3;
  254|      0|        break;
  255|      0|    case 1:  /* with padding this is an impossible case */
  ------------------
  |  Branch (255:5): [True: 0, False: 260]
  ------------------
  256|      0|        x = d0[y & 0xff];
  257|      0|        *p = *((uint8_t*)(&x)); // i.e. first char/byte in int
  258|      0|        break;
  259|     46|    case 2: // * case 2, 1  output byte */
  ------------------
  |  Branch (259:5): [True: 46, False: 214]
  ------------------
  260|     46|        x = d0[y & 0xff] | d1[y >> 8 & 0xff];
  261|     46|        *p = *((uint8_t*)(&x)); // i.e. first char
  262|     46|        break;
  263|    101|    default: /* case 3, 2 output bytes */
  ------------------
  |  Branch (263:5): [True: 101, False: 159]
  ------------------
  264|    101|        x = d0[y & 0xff] |
  265|    101|            d1[y >> 8 & 0xff ] |
  266|    101|            d2[y >> 16 & 0xff];  /* 0x3c */
  267|    101|        *p++ =  ((uint8_t*)(&x))[0];
  268|    101|        *p =  ((uint8_t*)(&x))[1];
  269|    101|        break;
  270|    260|    }
  271|       |
  272|    147|    if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   67|    147|#define BADCHAR 0x01FFFFFF
  ------------------
                  if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  135|     11|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (272:9): [True: 11, False: 136]
  ------------------
  273|       |
  274|    136|    return 3*chunks + (6*leftover)/8;
  275|    147|}

_ZN5butil9rapidjson12CrtAllocator4FreeEPv:
   79|  13.9k|    static void Free(void *ptr) { std::free(ptr); }
_ZN5butil9rapidjson12CrtAllocator7ReallocEPvmm:
   71|  7.52k|    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {
   72|  7.52k|        (void)originalSize;
   73|  7.52k|        if (newSize == 0) {
  ------------------
  |  Branch (73:13): [True: 0, False: 7.52k]
  ------------------
   74|      0|            std::free(originalPtr);
   75|      0|            return NULL;
   76|      0|        }
   77|  7.52k|        return std::realloc(originalPtr, newSize);
   78|  7.52k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEE6MallocEm:
  176|  9.05k|    void* Malloc(size_t size) {
  177|  9.05k|        if (!size)
  ------------------
  |  Branch (177:13): [True: 0, False: 9.05k]
  ------------------
  178|      0|            return NULL;
  179|       |
  180|  9.05k|        size = RAPIDJSON_ALIGN(size);
  ------------------
  |  |  252|  9.05k|#define RAPIDJSON_ALIGN(x) ((x + 7u) & ~7u)
  ------------------
  181|  9.05k|        if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity)
  ------------------
  |  Branch (181:13): [True: 1.69k, False: 7.36k]
  |  Branch (181:32): [True: 0, False: 7.36k]
  ------------------
  182|  1.69k|            AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size);
  ------------------
  |  Branch (182:22): [True: 1.69k, False: 0]
  ------------------
  183|       |
  184|  9.05k|        void *buffer = reinterpret_cast<char *>(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size;
  ------------------
  |  |  252|  9.05k|#define RAPIDJSON_ALIGN(x) ((x + 7u) & ~7u)
  ------------------
  185|  9.05k|        chunkHead_->size += size;
  186|  9.05k|        return buffer;
  187|  9.05k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEE8AddChunkEm:
  231|  1.69k|    void AddChunk(size_t capacity) {
  232|  1.69k|        if (!baseAllocator_)
  ------------------
  |  Branch (232:13): [True: 1.69k, False: 0]
  ------------------
  233|  1.69k|            ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator());
  ------------------
  |  |  491|  1.69k|#define RAPIDJSON_NEW(x) new x
  ------------------
  234|  1.69k|        ChunkHeader* chunk = reinterpret_cast<ChunkHeader*>(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity));
  ------------------
  |  |  252|  1.69k|#define RAPIDJSON_ALIGN(x) ((x + 7u) & ~7u)
  ------------------
  235|  1.69k|        chunk->capacity = capacity;
  236|  1.69k|        chunk->size = 0;
  237|  1.69k|        chunk->next = chunkHead_;
  238|  1.69k|        chunkHead_ =  chunk;
  239|  1.69k|    }
_ZN5butil9rapidjson12CrtAllocator6MallocEm:
   65|  1.69k|    void* Malloc(size_t size) { 
   66|  1.69k|        if (size) //  behavior of malloc(0) is implementation defined.
  ------------------
  |  Branch (66:13): [True: 1.69k, False: 0]
  ------------------
   67|  1.69k|            return std::malloc(size);
   68|      0|        else
   69|      0|            return NULL; // standardize to returning NULL.
   70|  1.69k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEEC2EmPS2_:
  111|  4.09k|        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
  112|  4.09k|    {
  113|  4.09k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEED2Ev:
  139|  4.09k|    ~MemoryPoolAllocator() {
  140|  4.09k|        Clear();
  141|  4.09k|        RAPIDJSON_DELETE(ownBaseAllocator_);
  ------------------
  |  |  495|  4.09k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
  142|  4.09k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEE5ClearEv:
  145|  4.09k|    void Clear() {
  146|  5.78k|        while (chunkHead_ && chunkHead_ != userBuffer_) {
  ------------------
  |  Branch (146:16): [True: 1.69k, False: 4.09k]
  |  Branch (146:30): [True: 1.69k, False: 0]
  ------------------
  147|  1.69k|            ChunkHeader* next = chunkHead_->next;
  148|  1.69k|            baseAllocator_->Free(chunkHead_);
  149|  1.69k|            chunkHead_ = next;
  150|  1.69k|        }
  151|  4.09k|        if (chunkHead_ && chunkHead_ == userBuffer_)
  ------------------
  |  Branch (151:13): [True: 0, False: 4.09k]
  |  Branch (151:27): [True: 0, False: 0]
  ------------------
  152|      0|            chunkHead_->size = 0; // Clear user buffer
  153|  4.09k|    }

_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsNullEv:
  765|  11.8k|    bool IsNull()   const { return flags_ == kNullFlag; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE4SizeEv:
 1255|    629|    SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }
  ------------------
  |  |  351|    629|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEixEj:
 1284|  4.61k|    const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEixEj:
 1279|  4.61k|    GenericValue& operator[](SizeType index) {
 1280|  4.61k|        RAPIDJSON_ASSERT(IsArray());
  ------------------
  |  |  351|  4.61k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1281|       |        RAPIDJSON_ASSERT(index < data_.a.size);
  ------------------
  |  |  351|  4.61k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1282|  4.61k|        return data_.a.elements[index];
 1283|  4.61k|    }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE5IsIntEv:
  772|  2.69k|    bool IsInt()    const { return (flags_ & kIntFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7IsInt64Ev:
  774|  2.10k|    bool IsInt64()  const { return (flags_ & kInt64Flag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8GetInt64Ev:
 1427|     39|    int64_t GetInt64() const    { RAPIDJSON_ASSERT(flags_ & kInt64Flag); return data_.n.i64; }
  ------------------
  |  |  351|     39|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsUint64Ev:
  775|  1.60k|    bool IsUint64() const { return (flags_ & kUint64Flag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9GetUint64Ev:
 1428|     34|    uint64_t GetUint64() const  { RAPIDJSON_ASSERT(flags_ & kUint64Flag); return data_.n.u64; }
  ------------------
  |  |  351|     34|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsDoubleEv:
  776|  1.57k|    bool IsDouble() const { return (flags_ & kDoubleFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9GetDoubleEv:
 1430|  4.21k|    double GetDouble() const {
 1431|  4.21k|        RAPIDJSON_ASSERT(IsNumber());
  ------------------
  |  |  351|  4.21k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1432|  4.21k|        if ((flags_ & kDoubleFlag) != 0)                return data_.n.d;   // exact type, no conversion.
  ------------------
  |  Branch (1432:13): [True: 608, False: 3.60k]
  ------------------
 1433|  3.60k|        if ((flags_ & kIntFlag) != 0)                   return data_.n.i.i; // int -> double
  ------------------
  |  Branch (1433:13): [True: 3.44k, False: 169]
  ------------------
 1434|    169|        if ((flags_ & kUintFlag) != 0)                  return data_.n.u.u; // unsigned -> double
  ------------------
  |  Branch (1434:13): [True: 67, False: 102]
  ------------------
 1435|    102|        if ((flags_ & kInt64Flag) != 0)                 return (double)data_.n.i64; // int64_t -> double (may lose precision)
  ------------------
  |  Branch (1435:13): [True: 67, False: 35]
  ------------------
 1436|     35|        RAPIDJSON_ASSERT((flags_ & kUint64Flag) != 0);  return (double)data_.n.u64; // uint64_t -> double (may lose precision)
  ------------------
  |  |  351|     35|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1437|    102|    }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6GetIntEv:
 1425|    805|    int GetInt() const          { RAPIDJSON_ASSERT(flags_ & kIntFlag);   return data_.n.i.i;   }
  ------------------
  |  |  351|    805|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsUintEv:
  773|  1.81k|    bool IsUint()   const { return (flags_ & kUintFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7GetUintEv:
 1426|    100|    unsigned GetUint() const    { RAPIDJSON_ASSERT(flags_ & kUintFlag);  return data_.n.u.u;   }
  ------------------
  |  |  351|    100|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsBoolEv:
  768|  3.09k|    bool IsBool()   const { return (flags_ & kBoolFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7GetBoolEv:
  791|  1.05k|    bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return flags_ == kTrueFlag; }
  ------------------
  |  |  351|  1.05k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsNumberEv:
  771|  4.34k|    bool IsNumber() const { return (flags_ & kNumberFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsStringEv:
  777|  5.12k|    bool IsString() const { return (flags_ & kStringFlag) != 0; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7SetNullEv:
  784|  4.09k|    GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEED2Ev:
  564|  28.6k|    ~GenericValue() {
  565|  28.6k|        if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
  ------------------
  |  Branch (565:13): [Folded, False: 28.6k]
  ------------------
  566|      0|            switch(flags_) {
  567|      0|            case kArrayFlag:
  ------------------
  |  Branch (567:13): [True: 0, False: 0]
  ------------------
  568|      0|                for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v)
  ------------------
  |  Branch (568:58): [True: 0, False: 0]
  ------------------
  569|      0|                    v->~GenericValue();
  570|      0|                Allocator::Free(data_.a.elements);
  571|      0|                break;
  572|       |
  573|      0|            case kObjectFlag:
  ------------------
  |  Branch (573:13): [True: 0, False: 0]
  ------------------
  574|      0|                for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
  ------------------
  |  Branch (574:56): [True: 0, False: 0]
  ------------------
  575|      0|                    m->~Member();
  576|      0|                Allocator::Free(data_.o.members);
  577|      0|                break;
  578|       |
  579|      0|            case kCopyStringFlag:
  ------------------
  |  Branch (579:13): [True: 0, False: 0]
  ------------------
  580|      0|                Allocator::Free(const_cast<Ch*>(data_.s.str));
  581|      0|                break;
  582|       |
  583|      0|            default:
  ------------------
  |  Branch (583:13): [True: 0, False: 0]
  ------------------
  584|      0|                break;  // Do nothing for other types.
  585|      0|            }
  586|      0|        }
  587|  28.6k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ev:
  440|  8.68k|    GenericValue() RAPIDJSON_NOEXCEPT : data_(), flags_(kNullFlag) {}
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E16ClearStackOnExitC2ERS7_:
 1933|  4.09k|        explicit ClearStackOnExit(GenericDocument& d) : d_(d) {}
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E11StartObjectEv:
 1964|  7.35k|    bool StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2ENS0_4TypeE:
  460|  40.3k|    explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_(), flags_() {
  461|  40.3k|        static const unsigned defaultFlags[7] = {
  462|  40.3k|            kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
  463|  40.3k|            kNumberAnyFlag
  464|  40.3k|        };
  465|  40.3k|        RAPIDJSON_ASSERT(type <= kNumberType);
  ------------------
  |  |  351|  40.3k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  466|  40.3k|        flags_ = defaultFlags[type];
  467|       |
  468|       |        // Use ShortString to store empty string.
  469|  40.3k|        if (type == kStringType)
  ------------------
  |  Branch (469:13): [True: 0, False: 40.3k]
  ------------------
  470|      0|            data_.ss.SetLength(0);
  471|  40.3k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11ShortString9SetLengthEj:
 1609|  14.9k|        inline void     SetLength(SizeType len) { str[LenPos] = (Ch)(MaxSize -  len); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E10StartArrayEv:
 1974|  32.9k|    bool StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); return true; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E3KeyEPKcjb:
 1966|  11.7k|    bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6StringEPKcjb:
 1956|  15.5k|    bool String(const Ch* str, SizeType length, bool copy) { 
 1957|  15.5k|        if (copy) 
  ------------------
  |  Branch (1957:13): [True: 15.5k, False: 0]
  ------------------
 1958|  15.5k|            new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
 1959|      0|        else
 1960|      0|            new (stack_.template Push<ValueType>()) ValueType(str, length);
 1961|  15.5k|        return true;
 1962|  15.5k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E12GetAllocatorEv:
 1925|  24.9k|    Allocator& GetAllocator() { return *allocator_; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2EPKcjRS6_:
  549|  15.5k|    GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_(), flags_() { SetStringRaw(StringRef(s, length), allocator); }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE12SetStringRawENS0_16GenericStringRefIcEERS6_:
 1691|  15.5k|    void SetStringRaw(StringRefType s, Allocator& allocator) {
 1692|  15.5k|        Ch* str = NULL;
 1693|  15.5k|        if(ShortString::Usable(s.length)) {
  ------------------
  |  Branch (1693:12): [True: 14.9k, False: 617]
  ------------------
 1694|  14.9k|            flags_ = kShortStringFlag;
 1695|  14.9k|            data_.ss.SetLength(s.length);
 1696|  14.9k|            str = data_.ss.str;
 1697|  14.9k|        } else {
 1698|    617|            flags_ = kCopyStringFlag;
 1699|    617|            data_.s.length = s.length;
 1700|    617|            str = (Ch *)allocator.Malloc((s.length + 1) * sizeof(Ch));
 1701|    617|            data_.s.str = str;
 1702|    617|        }
 1703|  15.5k|        std::memcpy(str, s, s.length * sizeof(Ch));
 1704|  15.5k|        str[s.length] = '\0';
 1705|  15.5k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11ShortString6UsableEj:
 1608|  15.5k|        inline static bool Usable(SizeType len) { return            (MaxSize >= len); }
_ZNK5butil9rapidjson16GenericStringRefIcEcvPKcEv:
  323|  36.0k|    operator const Ch *() const { return s; }
_ZN5butil9rapidjson9StringRefIcEENS0_16GenericStringRefIT_EEPKS3_m:
  369|  15.5k|inline GenericStringRef<CharType> StringRef(const CharType* str, size_t length) {
  370|  15.5k|    return GenericStringRef<CharType>(str, SizeType(length));
  371|  15.5k|}
_ZN5butil9rapidjson16GenericStringRefIcEC2EPKcj:
  316|  36.0k|        : s(str), length(len) { RAPIDJSON_ASSERT(s != NULL); }
  ------------------
  |  |  351|  36.0k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE12SetStringRawENS0_16GenericStringRefIcEE:
 1684|  20.4k|    void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT {
 1685|  20.4k|        flags_ = kConstStringFlag;
 1686|  20.4k|        data_.s.str = s;
 1687|  20.4k|        data_.s.length = s.length;
 1688|  20.4k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E4NullEv:
 1948|    501|    bool Null() { new (stack_.template Push<ValueType>()) ValueType(); return true; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E4BoolEb:
 1949|  1.59k|    bool Bool(bool b) { new (stack_.template Push<ValueType>()) ValueType(b); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2IbEET_PNS0_8internal8EnableIfINSA_15RemoveSfinaeTagIPFRNSA_9SfinaeTagENSA_6IsSameIS9_bEEEE4TypeEvE4TypeE:
  495|  1.59k|        : data_(), flags_(b ? kTrueFlag : kFalseFlag) {
  ------------------
  |  Branch (495:27): [True: 1.33k, False: 256]
  ------------------
  496|       |            // safe-guard against failing SFINAE
  497|  1.59k|            RAPIDJSON_STATIC_ASSERT((internal::IsSame<bool,T>::Value));
  ------------------
  |  |  383|  1.59k|    typedef ::BUTIL_RAPIDJSON_NAMESPACE::StaticAssertTest< \
  |  |  384|  1.59k|      sizeof(::BUTIL_RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \
  |  |  385|  1.59k|    RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
  ------------------
  498|  1.59k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6DoubleEd:
 1954|  4.66k|    bool Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ed:
  540|  4.66k|    explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberDoubleFlag) { data_.n.d = d; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E8AddInt64El:
 1952|    490|    bool AddInt64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2El:
  515|    490|    explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberInt64Flag) {
  516|    490|        data_.n.i64 = i64;
  517|    490|        if (i64 >= 0) {
  ------------------
  |  Branch (517:13): [True: 0, False: 490]
  ------------------
  518|      0|            flags_ |= kNumberUint64Flag;
  519|      0|            if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
  ------------------
  |  |  268|      0|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (519:17): [True: 0, False: 0]
  ------------------
  520|      0|                flags_ |= kUintFlag;
  521|      0|            if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
  ------------------
  |  |  268|      0|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (521:17): [True: 0, False: 0]
  ------------------
  522|      0|                flags_ |= kIntFlag;
  523|      0|        }
  524|    490|        else if (i64 >= static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
  ------------------
  |  |  268|    490|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (524:18): [True: 0, False: 490]
  ------------------
  525|      0|            flags_ |= kIntFlag;
  526|    490|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E9AddUint64Em:
 1953|    671|    bool AddUint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Em:
  529|    671|    explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUint64Flag) {
  530|    671|        data_.n.u64 = u64;
  531|    671|        if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000)))
  ------------------
  |  |  268|    671|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (531:13): [True: 382, False: 289]
  ------------------
  532|    382|            flags_ |= kInt64Flag;
  533|    671|        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
  ------------------
  |  |  268|    671|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (533:13): [True: 0, False: 671]
  ------------------
  534|      0|            flags_ |= kUintFlag;
  535|    671|        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
  ------------------
  |  |  268|    671|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (535:13): [True: 0, False: 671]
  ------------------
  536|      0|            flags_ |= kIntFlag;
  537|    671|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6AddIntEi:
 1950|  1.06k|    bool AddInt(int i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ei:
  501|  1.06k|    explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberIntFlag) {
  502|  1.06k|        data_.n.i64 = i;
  503|  1.06k|        if (i >= 0)
  ------------------
  |  Branch (503:13): [True: 330, False: 735]
  ------------------
  504|    330|            flags_ |= kUintFlag | kUint64Flag;
  505|  1.06k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E7AddUintEj:
 1951|  10.9k|    bool AddUint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ej:
  508|  10.9k|    explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUintFlag) {
  509|  10.9k|        data_.n.u64 = u; 
  510|  10.9k|        if (!(u & 0x80000000))
  ------------------
  |  Branch (510:13): [True: 10.7k, False: 246]
  ------------------
  511|  10.7k|            flags_ |= kIntFlag | kInt64Flag;
  512|  10.9k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E9EndObjectEj:
 1968|  6.65k|    bool EndObject(SizeType memberCount) {
 1969|  6.65k|        typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
 1970|  6.65k|        stack_.template Top<ValueType>()->SetObjectRaw(members, (SizeType)memberCount, GetAllocator());
 1971|  6.65k|        return true;
 1972|  6.65k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE12SetObjectRawEPNS0_13GenericMemberIS3_S6_EEjRS6_:
 1672|  6.65k|    void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) {
 1673|  6.65k|        flags_ = kObjectFlag;
 1674|  6.65k|        if (count) {
  ------------------
  |  Branch (1674:13): [True: 6.03k, False: 617]
  ------------------
 1675|  6.03k|            data_.o.members = (Member*)allocator.Malloc(count * sizeof(Member));
 1676|  6.03k|            std::memcpy(static_cast<void*>(data_.o.members), members, count * sizeof(Member));
 1677|  6.03k|        }
 1678|    617|        else
 1679|    617|            data_.o.members = NULL;
 1680|  6.65k|        data_.o.size = data_.o.capacity = count;
 1681|  6.65k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E8EndArrayEj:
 1976|  2.75k|    bool EndArray(SizeType elementCount) {
 1977|  2.75k|        ValueType* elements = stack_.template Pop<ValueType>(elementCount);
 1978|  2.75k|        stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
 1979|  2.75k|        return true;
 1980|  2.75k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11SetArrayRawEPS7_jRS6_:
 1660|  2.75k|    void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) {
 1661|  2.75k|        flags_ = kArrayFlag;
 1662|  2.75k|        if (count) {
  ------------------
  |  Branch (1662:13): [True: 2.39k, False: 359]
  ------------------
 1663|  2.39k|            data_.a.elements = (GenericValue*)allocator.Malloc(count * sizeof(GenericValue));
 1664|  2.39k|            std::memcpy(static_cast<void*>(data_.a.elements), values, count * sizeof(GenericValue));
 1665|  2.39k|        }
 1666|    359|        else
 1667|    359|            data_.a.elements = NULL;
 1668|  2.75k|        data_.a.size = data_.a.capacity = count;
 1669|  2.75k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9RawAssignERS7_:
 1708|  2.79k|    void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT {
 1709|  2.79k|        data_ = rhs.data_;
 1710|  2.79k|        flags_ = rhs.flags_;
 1711|  2.79k|        rhs.flags_ = kNullFlag;
 1712|  2.79k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E16ClearStackOnExitD2Ev:
 1934|  4.09k|        ~ClearStackOnExit() { d_.ClearStack(); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E10ClearStackEv:
 1999|  4.09k|    void ClearStack() {
 2000|  4.09k|        if (Allocator::kNeedFree)
  ------------------
  |  Branch (2000:13): [Folded, False: 4.09k]
  ------------------
 2001|      0|            while (stack_.GetSize() > 0)    // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects)
  ------------------
  |  Branch (2001:20): [True: 0, False: 0]
  ------------------
 2002|      0|                (stack_.template Pop<ValueType>(1))->~ValueType();
 2003|  4.09k|        else
 2004|  4.09k|            stack_.Clear();
 2005|  4.09k|        stack_.ShrinkToFit();
 2006|  4.09k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E5ParseILj4EEERS7_PKc:
 1898|  4.09k|    GenericDocument& Parse(const Ch* str) {
 1899|  4.09k|        return Parse<parseFlags, Encoding>(str);
 1900|  4.09k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E5ParseILj4ES3_EERS7_PKc:
 1887|  4.09k|    GenericDocument& Parse(const Ch* str) {
 1888|       |        RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
  ------------------
  |  |  351|  4.09k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1889|  4.09k|        GenericStringStream<SourceEncoding> s(str);
 1890|  4.09k|        return ParseStream<parseFlags, SourceEncoding>(s);
 1891|  4.09k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E11ParseStreamILj4ES3_NS0_19GenericStringStreamIS3_EEEERS7_RT1_:
 1821|  4.09k|    GenericDocument& ParseStream(InputStream& is) {
 1822|  4.09k|        ValueType::SetNull(); // Remove existing root if exist
 1823|  4.09k|        GenericReader<SourceEncoding, Encoding, StackAllocator> reader(&stack_.GetAllocator());
 1824|  4.09k|        ClearStackOnExit scope(*this);
 1825|  4.09k|        parseResult_ = reader.template Parse<parseFlags>(is, *this);
 1826|  4.09k|        if (parseResult_) {
  ------------------
  |  Branch (1826:13): [True: 2.79k, False: 1.30k]
  ------------------
 1827|       |            RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
  ------------------
  |  |  351|  2.79k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1828|  2.79k|            this->RawAssign(*stack_.template Pop<ValueType>(1));    // Add this-> to prevent issue 13.
 1829|  2.79k|        }
 1830|  4.09k|        return *this;
 1831|  4.09k|    }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9GetStringEv:
 1450|  39.3k|    const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return ((flags_ & kInlineStrFlag) ? data_.ss.str : data_.s.str); }
  ------------------
  |  |  351|  39.3k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1450:73): [True: 20.9k, False: 18.3k]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE15GetStringLengthEv:
 1455|  76.0k|    SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((flags_ & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
  ------------------
  |  |  351|  76.0k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1455:78): [True: 38.6k, False: 37.3k]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11ShortString9GetLengthEv:
 1610|  38.6k|        inline SizeType GetLength() const       { return  (SizeType)(MaxSize -  str[LenPos]); }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7IsArrayEv:
  770|  7.68k|    bool IsArray()  const { return flags_ == kArrayFlag; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsObjectEv:
  769|  10.2k|    bool IsObject() const { return flags_ == kObjectFlag; }
_ZN5butil9rapidjson21GenericMemberIteratorILb1ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2EPKNS0_13GenericMemberIS3_S6_EE:
  198|  20.4k|    explicit GenericMemberIterator(Pointer p) : ptr_(p) {}
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9MemberEndEv:
  862|  20.4k|    ConstMemberIterator MemberEnd() const   { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(data_.o.members + data_.o.size); }
  ------------------
  |  |  351|  20.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson21GenericMemberIteratorILb1ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEptEv:
  189|  9.70k|    Pointer   operator->() const { return ptr_; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE10FindMemberEPKc:
  921|  20.4k|    ConstMemberIterator FindMember(const Ch* name) const { return const_cast<GenericValue&>(*this).FindMember(name); }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE10FindMemberEPKc:
  916|  20.4k|    MemberIterator FindMember(const Ch* name) {
  917|  20.4k|        GenericValue n(StringRef(name));
  918|  20.4k|        return FindMember(n);
  919|  20.4k|    }
_ZN5butil9rapidjson9StringRefIcEENS0_16GenericStringRefIT_EEPKS3_:
  349|  20.4k|inline GenericStringRef<CharType> StringRef(const CharType* str) {
  350|  20.4k|    return GenericStringRef<CharType>(str, internal::StrLen(str));
  351|  20.4k|}
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2ENS0_16GenericStringRefIcEE:
  546|  20.4k|    explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_(), flags_() { SetStringRaw(s); }
_ZN5butil9rapidjson16GenericStringRefIcEC2ERKS2_:
  320|  20.4k|        : s(other.s), length(other.length) { RAPIDJSON_ASSERT(s != NULL); }
  ------------------
  |  |  351|  20.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE10FindMemberIS6_EENS0_21GenericMemberIteratorILb0ES3_S6_EERKNS1_IS3_T_EE:
  937|  20.4k|    MemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) {
  938|  20.4k|        RAPIDJSON_ASSERT(IsObject());
  ------------------
  |  |  351|  20.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  939|  20.4k|        RAPIDJSON_ASSERT(name.IsString());
  ------------------
  |  |  351|  20.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  940|  20.4k|        MemberIterator member = MemberBegin();
  941|  47.2k|        for ( ; member != MemberEnd(); ++member)
  ------------------
  |  Branch (941:17): [True: 36.5k, False: 10.7k]
  ------------------
  942|  36.5k|            if (name.StringEqual(member->name))
  ------------------
  |  Branch (942:17): [True: 9.70k, False: 26.8k]
  ------------------
  943|  9.70k|                break;
  944|  20.4k|        return member;
  945|  20.4k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11MemberBeginEv:
  865|  20.4k|    MemberIterator MemberBegin()            { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(data_.o.members); }
  ------------------
  |  |  351|  20.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZN5butil9rapidjson21GenericMemberIteratorILb0ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2EPNS0_13GenericMemberIS3_S6_EE:
  198|  67.7k|    explicit GenericMemberIterator(Pointer p) : ptr_(p) {}
_ZNK5butil9rapidjson21GenericMemberIteratorILb0ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEneENS1_ILb1ES3_S6_EE:
  179|  47.2k|    bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9MemberEndEv:
  868|  47.2k|    MemberIterator MemberEnd()              { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(data_.o.members + data_.o.size); }
  ------------------
  |  |  351|  47.2k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11StringEqualIS6_EEbRKNS1_IS3_T_EE:
 1715|  36.5k|    bool StringEqual(const GenericValue<Encoding, SourceAllocator>& rhs) const {
 1716|  36.5k|        RAPIDJSON_ASSERT(IsString());
  ------------------
  |  |  351|  36.5k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1717|  36.5k|        RAPIDJSON_ASSERT(rhs.IsString());
  ------------------
  |  |  351|  36.5k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1718|       |
 1719|  36.5k|        const SizeType len1 = GetStringLength();
 1720|  36.5k|        const SizeType len2 = rhs.GetStringLength();
 1721|  36.5k|        if(len1 != len2) { return false; }
  ------------------
  |  Branch (1721:12): [True: 18.7k, False: 17.7k]
  ------------------
 1722|       |
 1723|  17.7k|        const Ch* const str1 = GetString();
 1724|  17.7k|        const Ch* const str2 = rhs.GetString();
 1725|  17.7k|        if(str1 == str2) { return true; } // fast path for constant string
  ------------------
  |  Branch (1725:12): [True: 0, False: 17.7k]
  ------------------
 1726|       |
 1727|  17.7k|        return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0);
 1728|  17.7k|    }
_ZNK5butil9rapidjson21GenericMemberIteratorILb0ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEptEv:
  189|  36.5k|    Pointer   operator->() const { return ptr_; }
_ZN5butil9rapidjson21GenericMemberIteratorILb0ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEppEv:
  161|  26.8k|    Iterator& operator++(){ ++ptr_; return *this; }
_ZN5butil9rapidjson21GenericMemberIteratorILb1ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2ERKNS1_ILb0ES3_S6_EE:
  157|  67.7k|    GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {}
_ZNK5butil9rapidjson21GenericMemberIteratorILb1ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEeqES7_:
  178|  20.4k|    bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_EC2EPS6_mPS5_:
 1761|  4.09k|        allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
 1762|  4.09k|    {
 1763|  4.09k|        if (!allocator_)
  ------------------
  |  Branch (1763:13): [True: 4.09k, False: 0]
  ------------------
 1764|  4.09k|            ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  4.09k|#define RAPIDJSON_NEW(x) new x
  ------------------
 1765|  4.09k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_ED2Ev:
 1782|  4.09k|    ~GenericDocument() {
 1783|  4.09k|        Destroy();
 1784|  4.09k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E7DestroyEv:
 2008|  4.09k|    void Destroy() {
 2009|  4.09k|        RAPIDJSON_DELETE(ownAllocator_);
  ------------------
  |  |  495|  4.09k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
 2010|  4.09k|    }
_ZNK5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E13HasParseErrorEv:
 1914|  4.09k|    bool HasParseError() const { return parseResult_.IsError(); }
_ZNK5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E13GetParseErrorEv:
 1917|  1.30k|    ParseErrorCode GetParseError() const { return parseResult_.Code(); }

_ZN5butil9rapidjson4UTF8IcE6EncodeINS0_13GenericReaderIS2_S2_NS0_12CrtAllocatorEE11StackStreamIcEEEEvRT_j:
  102|  1.92k|    static void Encode(OutputStream& os, unsigned codepoint) {
  103|  1.92k|        if (codepoint <= 0x7F) 
  ------------------
  |  Branch (103:13): [True: 432, False: 1.49k]
  ------------------
  104|    432|            os.Put(static_cast<Ch>(codepoint & 0xFF));
  105|  1.49k|        else if (codepoint <= 0x7FF) {
  ------------------
  |  Branch (105:18): [True: 429, False: 1.06k]
  ------------------
  106|    429|            os.Put(static_cast<Ch>(0xC0 | ((codepoint >> 6) & 0xFF)));
  107|    429|            os.Put(static_cast<Ch>(0x80 | ((codepoint & 0x3F))));
  108|    429|        }
  109|  1.06k|        else if (codepoint <= 0xFFFF) {
  ------------------
  |  Branch (109:18): [True: 723, False: 345]
  ------------------
  110|    723|            os.Put(static_cast<Ch>(0xE0 | ((codepoint >> 12) & 0xFF)));
  111|    723|            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
  112|    723|            os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));
  113|    723|        }
  114|    345|        else {
  115|       |            RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);
  ------------------
  |  |  351|    345|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  116|    345|            os.Put(static_cast<Ch>(0xF0 | ((codepoint >> 18) & 0xFF)));
  117|    345|            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 12) & 0x3F)));
  118|    345|            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
  119|    345|            os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));
  120|    345|        }
  121|  1.92k|    }
_ZN5butil9rapidjson10TranscoderINS0_4UTF8IcEES3_E9TranscodeINS0_19GenericStringStreamIS3_EENS0_13GenericReaderIS3_S3_NS0_12CrtAllocatorEE11StackStreamIcEEEEbRT_RT0_:
  608|  95.4k|    RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) {
  609|  95.4k|        os.Put(is.Take());  // Just copy one code unit. This semantic is different from primary template class.
  610|  95.4k|        return true;
  611|  95.4k|    }

_ZN5butil9rapidjson16GetParseError_EnENS0_14ParseErrorCodeE:
   30|  1.30k|inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) {
   31|  1.30k|    switch (parseErrorCode) {
   32|      0|        case kParseErrorNone:                           return RAPIDJSON_ERROR_STRING("No error.");
  ------------------
  |  |   47|      0|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (32:9): [True: 0, False: 1.30k]
  ------------------
   33|       |
   34|     16|        case kParseErrorDocumentEmpty:                  return RAPIDJSON_ERROR_STRING("The document is empty.");
  ------------------
  |  |   47|     16|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (34:9): [True: 16, False: 1.28k]
  ------------------
   35|     89|        case kParseErrorDocumentRootNotSingular:        return RAPIDJSON_ERROR_STRING("The document root must not follow by other values.");
  ------------------
  |  |   47|     89|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (35:9): [True: 89, False: 1.21k]
  ------------------
   36|       |    
   37|    160|        case kParseErrorValueInvalid:                   return RAPIDJSON_ERROR_STRING("Invalid value.");
  ------------------
  |  |   47|    160|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (37:9): [True: 160, False: 1.14k]
  ------------------
   38|       |    
   39|     43|        case kParseErrorObjectMissName:                 return RAPIDJSON_ERROR_STRING("Missing a name for object member.");
  ------------------
  |  |   47|     43|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (39:9): [True: 43, False: 1.25k]
  ------------------
   40|     22|        case kParseErrorObjectMissColon:                return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member.");
  ------------------
  |  |   47|     22|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (40:9): [True: 22, False: 1.27k]
  ------------------
   41|     11|        case kParseErrorObjectMissCommaOrCurlyBracket:  return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member.");
  ------------------
  |  |   47|     11|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (41:9): [True: 11, False: 1.29k]
  ------------------
   42|       |    
   43|    382|        case kParseErrorArrayMissCommaOrSquareBracket:  return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element.");
  ------------------
  |  |   47|    382|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (43:9): [True: 382, False: 919]
  ------------------
   44|       |
   45|    181|        case kParseErrorStringUnicodeEscapeInvalidHex:  return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string.");
  ------------------
  |  |   47|    181|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (45:9): [True: 181, False: 1.12k]
  ------------------
   46|     62|        case kParseErrorStringUnicodeSurrogateInvalid:  return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid.");
  ------------------
  |  |   47|     62|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (46:9): [True: 62, False: 1.23k]
  ------------------
   47|     23|        case kParseErrorStringEscapeInvalid:            return RAPIDJSON_ERROR_STRING("Invalid escape character in string.");
  ------------------
  |  |   47|     23|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (47:9): [True: 23, False: 1.27k]
  ------------------
   48|    160|        case kParseErrorStringMissQuotationMark:        return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string.");
  ------------------
  |  |   47|    160|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (48:9): [True: 160, False: 1.14k]
  ------------------
   49|      0|        case kParseErrorStringInvalidEncoding:          return RAPIDJSON_ERROR_STRING("Invalid encoding in string.");
  ------------------
  |  |   47|      0|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (49:9): [True: 0, False: 1.30k]
  ------------------
   50|       |
   51|      3|        case kParseErrorNumberTooBig:                   return RAPIDJSON_ERROR_STRING("Number too big to be stored in double.");
  ------------------
  |  |   47|      3|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (51:9): [True: 3, False: 1.29k]
  ------------------
   52|     13|        case kParseErrorNumberMissFraction:             return RAPIDJSON_ERROR_STRING("Miss fraction part in number.");
  ------------------
  |  |   47|     13|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (52:9): [True: 13, False: 1.28k]
  ------------------
   53|     84|        case kParseErrorNumberMissExponent:             return RAPIDJSON_ERROR_STRING("Miss exponent in number.");
  ------------------
  |  |   47|     84|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (53:9): [True: 84, False: 1.21k]
  ------------------
   54|       |
   55|      0|        case kParseErrorTermination:                    return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error.");
  ------------------
  |  |   47|      0|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (55:9): [True: 0, False: 1.30k]
  ------------------
   56|     52|        case kParseErrorUnspecificSyntaxError:          return RAPIDJSON_ERROR_STRING("Unspecific syntax error.");
  ------------------
  |  |   47|     52|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (56:9): [True: 52, False: 1.24k]
  ------------------
   57|       |
   58|      0|        default:
  ------------------
  |  Branch (58:9): [True: 0, False: 1.30k]
  ------------------
   59|      0|            return RAPIDJSON_ERROR_STRING("Unknown error.");
  ------------------
  |  |   47|      0|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
   60|  1.30k|    }
   61|  1.30k|}

_ZN5butil9rapidjson11ParseResultC2Ev:
  105|  8.18k|    ParseResult() : code_(kParseErrorNone), offset_(0) {}
_ZN5butil9rapidjson11ParseResult5ClearEv:
  124|  4.09k|    void Clear() { Set(kParseErrorNone); }
_ZN5butil9rapidjson11ParseResult3SetENS0_14ParseErrorCodeEm:
  126|  5.39k|    void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; }
_ZNK5butil9rapidjson11ParseResult7IsErrorEv:
  117|  66.2k|    bool IsError() const { return code_ != kParseErrorNone; }
_ZNK5butil9rapidjson11ParseResultcvbEv:
  115|  4.09k|    operator bool() const { return !IsError(); }
_ZNK5butil9rapidjson11ParseResult4CodeEv:
  110|  1.30k|    ParseErrorCode Code() const { return code_; }

_ZN5butil9rapidjson8internal5Pow10Ei:
   28|  4.86k|inline double Pow10(int n) {
   29|  4.86k|    static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes
   30|  4.86k|        1e+0,  
   31|  4.86k|        1e+1,  1e+2,  1e+3,  1e+4,  1e+5,  1e+6,  1e+7,  1e+8,  1e+9,  1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, 
   32|  4.86k|        1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40,
   33|  4.86k|        1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60,
   34|  4.86k|        1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80,
   35|  4.86k|        1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100,
   36|  4.86k|        1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120,
   37|  4.86k|        1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140,
   38|  4.86k|        1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160,
   39|  4.86k|        1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180,
   40|  4.86k|        1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200,
   41|  4.86k|        1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220,
   42|  4.86k|        1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240,
   43|  4.86k|        1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260,
   44|  4.86k|        1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280,
   45|  4.86k|        1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300,
   46|  4.86k|        1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308
   47|  4.86k|    };
   48|       |    RAPIDJSON_ASSERT(n >= 0 && n <= 308);
  ------------------
  |  |  351|  4.86k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
   49|  4.86k|    return e[n];
   50|  4.86k|}

_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE12GetAllocatorEv:
  127|  4.09k|    Allocator& GetAllocator() { return *allocator_; }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEEC2EPS3_m:
   34|  8.18k|    Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) {
   35|       |        RAPIDJSON_ASSERT(stackCapacity > 0);
  ------------------
  |  |  351|  8.18k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
   36|  8.18k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEED2Ev:
   56|  8.18k|    ~Stack() {
   57|  8.18k|        Destroy();
   58|  8.18k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE7DestroyEv:
  159|  8.18k|    void Destroy() {
  160|  8.18k|        Allocator::Free(stack_);
  161|  8.18k|        RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack
  ------------------
  |  |  495|  8.18k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
  162|  8.18k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushIjEEPT_m:
  101|  80.6k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|  80.6k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 2.86k, False: 77.8k]
  ------------------
  104|  2.86k|            Expand<T>(count);
  105|       |
  106|  80.6k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|  80.6k|        stackTop_ += sizeof(T) * count;
  108|  80.6k|        return ret;
  109|  80.6k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandIjEEvm:
  134|  2.86k|    void Expand(size_t count) {
  135|       |        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.
  136|  2.86k|        size_t newCapacity;
  137|  2.86k|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 2.27k, False: 594]
  ------------------
  138|  2.27k|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 2.27k, False: 0]
  ------------------
  139|  2.27k|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  2.27k|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|  2.27k|            newCapacity = initialCapacity_;
  141|  2.27k|        } else {
  142|    594|            newCapacity = GetCapacity();
  143|    594|            newCapacity += (newCapacity + 1) / 2;
  144|    594|        }
  145|  2.86k|        size_t newSize = GetSize() + sizeof(T) * count;
  146|  2.86k|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 2.86k]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|  2.86k|        Resize(newCapacity);
  150|  2.86k|    }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE11GetCapacityEv:
  130|  9.03k|    size_t GetCapacity() const { return static_cast<size_t>(stackEnd_ - stack_); }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE7GetSizeEv:
  129|  15.0k|    size_t GetSize() const { return static_cast<size_t>(stackTop_ - stack_); }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ResizeEm:
  152|  7.52k|    void Resize(size_t newCapacity) {
  153|  7.52k|        const size_t size = GetSize();  // Backup the current size
  154|  7.52k|        stack_ = (char*)allocator_->Realloc(stack_, GetCapacity(), newCapacity);
  155|  7.52k|        stackTop_ = stack_ + size;
  156|  7.52k|        stackEnd_ = stack_ + newCapacity;
  157|  7.52k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_m:
  101|  75.8k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|  75.8k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 4.31k, False: 71.5k]
  ------------------
  104|  4.31k|            Expand<T>(count);
  105|       |
  106|  75.8k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|  75.8k|        stackTop_ += sizeof(T) * count;
  108|  75.8k|        return ret;
  109|  75.8k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEvm:
  134|  4.31k|    void Expand(size_t count) {
  135|       |        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.
  136|  4.31k|        size_t newCapacity;
  137|  4.31k|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 3.50k, False: 815]
  ------------------
  138|  3.50k|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 3.50k, False: 0]
  ------------------
  139|  3.50k|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  3.50k|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|  3.50k|            newCapacity = initialCapacity_;
  141|  3.50k|        } else {
  142|    815|            newCapacity = GetCapacity();
  143|    815|            newCapacity += (newCapacity + 1) / 2;
  144|    815|        }
  145|  4.31k|        size_t newSize = GetSize() + sizeof(T) * count;
  146|  4.31k|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 4.31k]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|  4.31k|        Resize(newCapacity);
  150|  4.31k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushIcEEPT_m:
  101|   116k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|   116k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 337, False: 115k]
  ------------------
  104|    337|            Expand<T>(count);
  105|       |
  106|   116k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|   116k|        stackTop_ += sizeof(T) * count;
  108|   116k|        return ret;
  109|   116k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandIcEEvm:
  134|    337|    void Expand(size_t count) {
  135|       |        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.
  136|    337|        size_t newCapacity;
  137|    337|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 236, False: 101]
  ------------------
  138|    236|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 236, False: 0]
  ------------------
  139|    236|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|    236|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|    236|            newCapacity = initialCapacity_;
  141|    236|        } else {
  142|    101|            newCapacity = GetCapacity();
  143|    101|            newCapacity += (newCapacity + 1) / 2;
  144|    101|        }
  145|    337|        size_t newSize = GetSize() + sizeof(T) * count;
  146|    337|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 337]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|    337|        Resize(newCapacity);
  150|    337|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopIcEEPT_m:
  112|  15.5k|    T* Pop(size_t count) {
  113|       |        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  15.5k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  114|  15.5k|        stackTop_ -= count * sizeof(T);
  115|  15.5k|        return reinterpret_cast<T*>(stackTop_);
  116|  15.5k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3TopIjEEPT_v:
  119|  42.8k|    T* Top() { 
  120|       |        RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
  ------------------
  |  |  351|  42.8k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  121|  42.8k|        return reinterpret_cast<T*>(stackTop_ - sizeof(T));
  122|  42.8k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopIjEEPT_m:
  112|  18.8k|    T* Pop(size_t count) {
  113|       |        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  18.8k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  114|  18.8k|        stackTop_ -= count * sizeof(T);
  115|  18.8k|        return reinterpret_cast<T*>(stackTop_);
  116|  18.8k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopINS0_13GenericMemberINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_m:
  112|  6.65k|    T* Pop(size_t count) {
  113|       |        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  6.65k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  114|  6.65k|        stackTop_ -= count * sizeof(T);
  115|  6.65k|        return reinterpret_cast<T*>(stackTop_);
  116|  6.65k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3TopINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_v:
  119|  9.41k|    T* Top() { 
  120|       |        RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
  ------------------
  |  |  351|  9.41k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  121|  9.41k|        return reinterpret_cast<T*>(stackTop_ - sizeof(T));
  122|  9.41k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE5ClearEv:
   84|  8.18k|    void Clear() { stackTop_ = stack_; }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_m:
  112|  5.54k|    T* Pop(size_t count) {
  113|       |        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  5.54k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  114|  5.54k|        stackTop_ -= count * sizeof(T);
  115|  5.54k|        return reinterpret_cast<T*>(stackTop_);
  116|  5.54k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE11ShrinkToFitEv:
   86|  4.09k|    void ShrinkToFit() { 
   87|  4.09k|        if (Empty()) {
  ------------------
  |  Branch (87:13): [True: 4.09k, False: 0]
  ------------------
   88|       |            // If the stack is empty, completely deallocate the memory.
   89|  4.09k|            Allocator::Free(stack_);
   90|  4.09k|            stack_ = 0;
   91|  4.09k|            stackTop_ = 0;
   92|  4.09k|            stackEnd_ = 0;
   93|  4.09k|        }
   94|      0|        else
   95|      0|            Resize(GetSize());
   96|  4.09k|    }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE5EmptyEv:
  128|  4.09k|    bool Empty() const { return stackTop_ == stack_; }

_ZN5butil9rapidjson8internal6StrLenIcEEjPKT_:
   30|  20.4k|inline SizeType StrLen(const Ch* s) {
   31|  20.4k|    const Ch* p = s;
   32|   117k|    while (*p) ++p;
  ------------------
  |  Branch (32:12): [True: 97.4k, False: 20.4k]
  ------------------
   33|  20.4k|    return SizeType(p - s);
   34|  20.4k|}

_ZN5butil9rapidjson8internal21StrtodNormalPrecisionEdi:
   36|  4.66k|inline double StrtodNormalPrecision(double d, int p) {
   37|  4.66k|    if (p < -308) {
  ------------------
  |  Branch (37:9): [True: 574, False: 4.09k]
  ------------------
   38|       |        // Prevent expSum < -308, making Pow10(p) = 0
   39|    574|        d = FastPath(d, -308);
   40|    574|        d = FastPath(d, p + 308);
   41|    574|    }
   42|  4.09k|    else
   43|  4.09k|        d = FastPath(d, p);
   44|  4.66k|    return d;
   45|  4.66k|}
_ZN5butil9rapidjson8internal8FastPathEdi:
   27|  5.23k|inline double FastPath(double significand, int exp) {
   28|  5.23k|    if (exp < -308)
  ------------------
  |  Branch (28:9): [True: 370, False: 4.86k]
  ------------------
   29|    370|        return 0.0;
   30|  4.86k|    else if (exp >= 0)
  ------------------
  |  Branch (30:14): [True: 2.67k, False: 2.19k]
  ------------------
   31|  2.67k|        return significand * internal::Pow10(exp);
   32|  2.19k|    else
   33|  2.19k|        return significand / internal::Pow10(-exp);
   34|  5.23k|}

_ZN5butil9rapidjson19GenericStringStreamINS0_4UTF8IcEEEC2EPKc:
  585|  4.09k|    GenericStringStream(const Ch *src) : src_(src), head_(src) {}
_ZN5butil9rapidjson19GenericStringStreamINS0_4UTF8IcEEE4TakeEv:
  588|   307k|    Ch Take() { return *src_++; }
_ZNK5butil9rapidjson19GenericStringStreamINS0_4UTF8IcEEE4PeekEv:
  587|  1.12M|    Ch Peek() const { return *src_; }
_ZNK5butil9rapidjson19GenericStringStreamINS0_4UTF8IcEEE4TellEv:
  591|  1.30k|    size_t Tell() const { return static_cast<size_t>(src_ - head_); }

_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEEC2EPS4_m:
  397|  4.09k|        : stack_(stackAllocator, stackCapacity), parseResult_() {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE16ClearStackOnExitC2ERS5_:
  477|  4.09k|        explicit ClearStackOnExit(GenericReader& r) : r_(r) {}
_ZN5butil9rapidjson14SkipWhitespaceINS0_19GenericStringStreamINS0_4UTF8IcEEEEEEvRT_:
  261|   122k|void SkipWhitespace(InputStream& is) {
  262|   122k|    internal::StreamLocalCopy<InputStream> copy(is);
  263|   122k|    InputStream& s(copy.s);
  264|       |
  265|   123k|    while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t')
  ------------------
  |  Branch (265:12): [True: 393, False: 123k]
  |  Branch (265:31): [True: 388, False: 122k]
  |  Branch (265:51): [True: 49, False: 122k]
  |  Branch (265:71): [True: 356, False: 122k]
  ------------------
  266|  1.18k|        s.Take();
  267|   122k|}
_ZN5butil9rapidjson8internal15StreamLocalCopyINS0_19GenericStringStreamINS0_4UTF8IcEEEELi1EEC2ERS6_:
  228|   156k|    StreamLocalCopy(Stream& original) : s(original), original_(original) {}
_ZN5butil9rapidjson8internal15StreamLocalCopyINS0_19GenericStringStreamINS0_4UTF8IcEEEELi1EED2Ev:
  229|   156k|    ~StreamLocalCopy() { original_ = s; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE8TokenizeEc:
 1165|   119k|    RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
 1166|       |
 1167|       |//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
 1168|   119k|#define N NumberToken
 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
 1170|       |        // Maps from ASCII to Token
 1171|   119k|        static const unsigned char tokenMap[256] = {
 1172|   119k|            N16, // 00~0F
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
 1173|   119k|            N16, // 10~1F
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
 1174|   119k|            N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
 1175|   119k|            N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
 1176|   119k|            N16, // 40~4F
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
 1177|   119k|            N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
 1178|   119k|            N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
 1179|   119k|            N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   119k|#define N NumberToken
  ------------------
 1180|   119k|            N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   119k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   119k|#define N NumberToken
  |  |  ------------------
  ------------------
 1181|   119k|        };
 1182|   119k|#undef N
 1183|   119k|#undef N16
 1184|       |//!@endcond
 1185|       |        
 1186|   119k|        if (sizeof(Ch) == 1 || unsigned(c) < 256)
  ------------------
  |  Branch (1186:13): [True: 119k, Folded]
  |  Branch (1186:32): [True: 0, False: 0]
  ------------------
 1187|   119k|            return (Token)tokenMap[(unsigned char)c];
 1188|      0|        else
 1189|      0|            return NumberToken;
 1190|   119k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE7PredictENS5_21IterativeParsingStateENS5_5TokenE:
 1192|   119k|    RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
 1193|       |        // current state x one lookahead token -> new state
 1194|   119k|        static const char G[cIterativeParsingStateCount][kTokenCount] = {
 1195|       |            // Start
 1196|   119k|            {
 1197|   119k|                IterativeParsingArrayInitialState,  // Left bracket
 1198|   119k|                IterativeParsingErrorState,         // Right bracket
 1199|   119k|                IterativeParsingObjectInitialState, // Left curly bracket
 1200|   119k|                IterativeParsingErrorState,         // Right curly bracket
 1201|   119k|                IterativeParsingErrorState,         // Comma
 1202|   119k|                IterativeParsingErrorState,         // Colon
 1203|   119k|                IterativeParsingValueState,         // String
 1204|   119k|                IterativeParsingValueState,         // False
 1205|   119k|                IterativeParsingValueState,         // True
 1206|   119k|                IterativeParsingValueState,         // Null
 1207|   119k|                IterativeParsingValueState          // Number
 1208|   119k|            },
 1209|       |            // Finish(sink state)
 1210|   119k|            {
 1211|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1212|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1213|   119k|                IterativeParsingErrorState
 1214|   119k|            },
 1215|       |            // Error(sink state)
 1216|   119k|            {
 1217|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1218|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1219|   119k|                IterativeParsingErrorState
 1220|   119k|            },
 1221|       |            // ObjectInitial
 1222|   119k|            {
 1223|   119k|                IterativeParsingErrorState,         // Left bracket
 1224|   119k|                IterativeParsingErrorState,         // Right bracket
 1225|   119k|                IterativeParsingErrorState,         // Left curly bracket
 1226|   119k|                IterativeParsingObjectFinishState,  // Right curly bracket
 1227|   119k|                IterativeParsingErrorState,         // Comma
 1228|   119k|                IterativeParsingErrorState,         // Colon
 1229|   119k|                IterativeParsingMemberKeyState,     // String
 1230|   119k|                IterativeParsingErrorState,         // False
 1231|   119k|                IterativeParsingErrorState,         // True
 1232|   119k|                IterativeParsingErrorState,         // Null
 1233|   119k|                IterativeParsingErrorState          // Number
 1234|   119k|            },
 1235|       |            // MemberKey
 1236|   119k|            {
 1237|   119k|                IterativeParsingErrorState,             // Left bracket
 1238|   119k|                IterativeParsingErrorState,             // Right bracket
 1239|   119k|                IterativeParsingErrorState,             // Left curly bracket
 1240|   119k|                IterativeParsingErrorState,             // Right curly bracket
 1241|   119k|                IterativeParsingErrorState,             // Comma
 1242|   119k|                IterativeParsingKeyValueDelimiterState, // Colon
 1243|   119k|                IterativeParsingErrorState,             // String
 1244|   119k|                IterativeParsingErrorState,             // False
 1245|   119k|                IterativeParsingErrorState,             // True
 1246|   119k|                IterativeParsingErrorState,             // Null
 1247|   119k|                IterativeParsingErrorState              // Number
 1248|   119k|            },
 1249|       |            // KeyValueDelimiter
 1250|   119k|            {
 1251|   119k|                IterativeParsingArrayInitialState,      // Left bracket(push MemberValue state)
 1252|   119k|                IterativeParsingErrorState,             // Right bracket
 1253|   119k|                IterativeParsingObjectInitialState,     // Left curly bracket(push MemberValue state)
 1254|   119k|                IterativeParsingErrorState,             // Right curly bracket
 1255|   119k|                IterativeParsingErrorState,             // Comma
 1256|   119k|                IterativeParsingErrorState,             // Colon
 1257|   119k|                IterativeParsingMemberValueState,       // String
 1258|   119k|                IterativeParsingMemberValueState,       // False
 1259|   119k|                IterativeParsingMemberValueState,       // True
 1260|   119k|                IterativeParsingMemberValueState,       // Null
 1261|   119k|                IterativeParsingMemberValueState        // Number
 1262|   119k|            },
 1263|       |            // MemberValue
 1264|   119k|            {
 1265|   119k|                IterativeParsingErrorState,             // Left bracket
 1266|   119k|                IterativeParsingErrorState,             // Right bracket
 1267|   119k|                IterativeParsingErrorState,             // Left curly bracket
 1268|   119k|                IterativeParsingObjectFinishState,      // Right curly bracket
 1269|   119k|                IterativeParsingMemberDelimiterState,   // Comma
 1270|   119k|                IterativeParsingErrorState,             // Colon
 1271|   119k|                IterativeParsingErrorState,             // String
 1272|   119k|                IterativeParsingErrorState,             // False
 1273|   119k|                IterativeParsingErrorState,             // True
 1274|   119k|                IterativeParsingErrorState,             // Null
 1275|   119k|                IterativeParsingErrorState              // Number
 1276|   119k|            },
 1277|       |            // MemberDelimiter
 1278|   119k|            {
 1279|   119k|                IterativeParsingErrorState,         // Left bracket
 1280|   119k|                IterativeParsingErrorState,         // Right bracket
 1281|   119k|                IterativeParsingErrorState,         // Left curly bracket
 1282|   119k|                IterativeParsingErrorState,         // Right curly bracket
 1283|   119k|                IterativeParsingErrorState,         // Comma
 1284|   119k|                IterativeParsingErrorState,         // Colon
 1285|   119k|                IterativeParsingMemberKeyState,     // String
 1286|   119k|                IterativeParsingErrorState,         // False
 1287|   119k|                IterativeParsingErrorState,         // True
 1288|   119k|                IterativeParsingErrorState,         // Null
 1289|   119k|                IterativeParsingErrorState          // Number
 1290|   119k|            },
 1291|       |            // ObjectFinish(sink state)
 1292|   119k|            {
 1293|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1294|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1295|   119k|                IterativeParsingErrorState
 1296|   119k|            },
 1297|       |            // ArrayInitial
 1298|   119k|            {
 1299|   119k|                IterativeParsingArrayInitialState,      // Left bracket(push Element state)
 1300|   119k|                IterativeParsingArrayFinishState,       // Right bracket
 1301|   119k|                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)
 1302|   119k|                IterativeParsingErrorState,             // Right curly bracket
 1303|   119k|                IterativeParsingErrorState,             // Comma
 1304|   119k|                IterativeParsingErrorState,             // Colon
 1305|   119k|                IterativeParsingElementState,           // String
 1306|   119k|                IterativeParsingElementState,           // False
 1307|   119k|                IterativeParsingElementState,           // True
 1308|   119k|                IterativeParsingElementState,           // Null
 1309|   119k|                IterativeParsingElementState            // Number
 1310|   119k|            },
 1311|       |            // Element
 1312|   119k|            {
 1313|   119k|                IterativeParsingErrorState,             // Left bracket
 1314|   119k|                IterativeParsingArrayFinishState,       // Right bracket
 1315|   119k|                IterativeParsingErrorState,             // Left curly bracket
 1316|   119k|                IterativeParsingErrorState,             // Right curly bracket
 1317|   119k|                IterativeParsingElementDelimiterState,  // Comma
 1318|   119k|                IterativeParsingErrorState,             // Colon
 1319|   119k|                IterativeParsingErrorState,             // String
 1320|   119k|                IterativeParsingErrorState,             // False
 1321|   119k|                IterativeParsingErrorState,             // True
 1322|   119k|                IterativeParsingErrorState,             // Null
 1323|   119k|                IterativeParsingErrorState              // Number
 1324|   119k|            },
 1325|       |            // ElementDelimiter
 1326|   119k|            {
 1327|   119k|                IterativeParsingArrayInitialState,      // Left bracket(push Element state)
 1328|   119k|                IterativeParsingErrorState,             // Right bracket
 1329|   119k|                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)
 1330|   119k|                IterativeParsingErrorState,             // Right curly bracket
 1331|   119k|                IterativeParsingErrorState,             // Comma
 1332|   119k|                IterativeParsingErrorState,             // Colon
 1333|   119k|                IterativeParsingElementState,           // String
 1334|   119k|                IterativeParsingElementState,           // False
 1335|   119k|                IterativeParsingElementState,           // True
 1336|   119k|                IterativeParsingElementState,           // Null
 1337|   119k|                IterativeParsingElementState            // Number
 1338|   119k|            },
 1339|       |            // ArrayFinish(sink state)
 1340|   119k|            {
 1341|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1342|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1343|   119k|                IterativeParsingErrorState
 1344|   119k|            },
 1345|       |            // Single Value (sink state)
 1346|   119k|            {
 1347|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1348|   119k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1349|   119k|                IterativeParsingErrorState
 1350|   119k|            }
 1351|   119k|        }; // End of G
 1352|       |
 1353|   119k|        return (IterativeParsingState)G[state][token];
 1354|   119k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcEC2ERNS0_8internal5StackIS4_EE:
  637|  15.9k|        StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcE3PutEc:
  638|   116k|        RAPIDJSON_FORCEINLINE void Put(Ch c) {
  639|   116k|            *stack_.template Push<Ch>() = c;
  640|   116k|            ++length_;
  641|   116k|        }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseHex4INS0_19GenericStringStreamIS3_EEEEjRT_:
  612|  2.55k|    unsigned ParseHex4(InputStream& is) {
  613|  2.55k|        unsigned codepoint = 0;
  614|  12.3k|        for (int i = 0; i < 4; i++) {
  ------------------
  |  Branch (614:25): [True: 9.97k, False: 2.37k]
  ------------------
  615|  9.97k|            Ch c = is.Take();
  616|  9.97k|            codepoint <<= 4;
  617|  9.97k|            codepoint += static_cast<unsigned>(c);
  618|  9.97k|            if (c >= '0' && c <= '9')
  ------------------
  |  Branch (618:17): [True: 9.85k, False: 120]
  |  Branch (618:29): [True: 3.89k, False: 5.95k]
  ------------------
  619|  3.89k|                codepoint -= '0';
  620|  6.07k|            else if (c >= 'A' && c <= 'F')
  ------------------
  |  Branch (620:22): [True: 5.93k, False: 140]
  |  Branch (620:34): [True: 3.16k, False: 2.77k]
  ------------------
  621|  3.16k|                codepoint -= 'A' - 10;
  622|  2.91k|            else if (c >= 'a' && c <= 'f')
  ------------------
  |  Branch (622:22): [True: 2.74k, False: 163]
  |  Branch (622:34): [True: 2.73k, False: 18]
  ------------------
  623|  2.73k|                codepoint -= 'a' - 10;
  624|    181|            else {
  625|    181|                RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, is.Tell() - 1);
  ------------------
  |  |   91|    181|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    181|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|    181|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|    181|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|    181|    SetParseError(parseErrorCode, offset); \
  |  |   94|    181|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    181|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    181|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 181]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  626|    181|                RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
  ------------------
  |  |   51|    181|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    181|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   52|    181|    if (HasParseError()) { return value; } \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 181, False: 0]
  |  |  ------------------
  |  |   53|    181|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    181|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    181|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  627|    181|            }
  628|  9.97k|        }
  629|  2.37k|        return codepoint;
  630|  2.55k|    }
_ZNK5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcE6LengthEv:
  647|  15.5k|        size_t Length() const { return length_; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcE3PopEv:
  648|  15.5k|        Ch* Pop() {
  649|  15.5k|            return stack_.template Pop<Ch>(length_);
  650|  15.5k|        }
_ZNK5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE13HasParseErrorEv:
  457|  58.0k|    bool HasParseError() const { return parseResult_.IsError(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EEC2ERS5_RS8_:
  850|  18.0k|        NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader;  }
_ZNK5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4PeekEv:
  853|   251k|        RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4TakeEv:
  855|  14.9k|        RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE8TakePushEv:
  854|  56.9k|        RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4TellEv:
  856|    143|        size_t Tell() { return is.Tell(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE6LengthEv:
  857|  35.8k|        size_t Length() { return 0; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE3PopEv:
  858|  17.8k|        const char* Pop() { return 0; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EED2Ev:
  851|  18.0k|        ~NumberStream() {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11HandleErrorINS0_19GenericStringStreamIS3_EEEEvNS5_21IterativeParsingStateERT_:
 1501|  2.01k|    void HandleError(IterativeParsingState src, InputStream& is) {
 1502|  2.01k|        if (HasParseError()) {
  ------------------
  |  Branch (1502:13): [True: 1.39k, False: 615]
  ------------------
 1503|       |            // Error flag has been set.
 1504|  1.39k|            return;
 1505|  1.39k|        }
 1506|       |        
 1507|    615|        switch (src) {
 1508|     16|        case IterativeParsingStartState:            RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return;
  ------------------
  |  |  110|     16|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     16|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     16|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     16|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     16|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     16|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     16|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     16|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     16|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     16|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     16|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 16]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     16|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     16|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     16|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     16|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     16|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 16, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     16|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     16|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     16|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     16|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     16|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     16|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1508:9): [True: 16, False: 599]
  ------------------
 1509|     89|        case IterativeParsingFinishState:           RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return;
  ------------------
  |  |  110|     89|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     89|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     89|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     89|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     89|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     89|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     89|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     89|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     89|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     89|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     89|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 89]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     89|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     89|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     89|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     89|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     89|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 89, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     89|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     89|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     89|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     89|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     89|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     89|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1509:9): [True: 89, False: 526]
  ------------------
 1510|     35|        case IterativeParsingObjectInitialState:
  ------------------
  |  Branch (1510:9): [True: 35, False: 580]
  ------------------
 1511|     43|        case IterativeParsingMemberDelimiterState:  RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return;
  ------------------
  |  |  110|     43|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     43|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     43|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     43|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     43|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     43|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     43|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 43]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     43|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     43|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     43|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     43|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 43, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     43|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     43|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1511:9): [True: 8, False: 607]
  ------------------
 1512|     22|        case IterativeParsingMemberKeyState:        RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return;
  ------------------
  |  |  110|     22|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     22|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     22|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     22|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     22|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     22|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     22|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     22|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     22|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     22|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     22|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 22]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     22|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     22|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     22|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     22|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     22|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 22, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     22|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     22|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     22|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     22|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     22|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     22|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1512:9): [True: 22, False: 593]
  ------------------
 1513|     11|        case IterativeParsingMemberValueState:      RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return;
  ------------------
  |  |  110|     11|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     11|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     11|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     11|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     11|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     11|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     11|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     11|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     11|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     11|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     11|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 11]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     11|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     11|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     11|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     11|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     11|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 11, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     11|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     11|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     11|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     11|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     11|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     11|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1513:9): [True: 11, False: 604]
  ------------------
 1514|    382|        case IterativeParsingElementState:          RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return;
  ------------------
  |  |  110|    382|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    382|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    382|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|    382|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    382|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|    382|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|    382|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|    382|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|    382|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    382|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    382|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 382]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    382|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|    382|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    382|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|    382|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    382|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 382, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    382|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|    382|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|    382|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    382|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    382|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    382|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1514:9): [True: 382, False: 233]
  ------------------
 1515|     52|        default:                                    RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell());
  ------------------
  |  |  110|     52|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     52|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     52|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     52|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     52|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     52|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     52|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     52|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     52|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     52|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     52|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 52]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     52|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     52|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     52|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     52|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     52|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 52, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     52|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     52|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     52|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     52|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     52|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     52|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1515:9): [True: 52, False: 563]
  ------------------
 1516|    615|        }       
 1517|    615|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE13SetParseErrorENS0_14ParseErrorCodeEm:
  466|  1.30k|    void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE16ClearStackOnExitD2Ev:
  478|  4.09k|        ~ClearStackOnExit() { r_.ClearStack(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ClearStackEv:
  473|  4.09k|    void ClearStack() { stack_.Clear(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE5ParseILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEENS0_11ParseResultERT0_RT1_:
  408|  4.09k|    ParseResult Parse(InputStream& is, Handler& handler) {
  409|  4.09k|        if (parseFlags & kParseIterativeFlag)
  ------------------
  |  Branch (409:13): [True: 4.09k, Folded]
  ------------------
  410|  4.09k|            return IterativeParse<parseFlags>(is, handler);
  411|       |
  412|      0|        parseResult_.Clear();
  413|       |
  414|      0|        ClearStackOnExit scope(*this);
  415|       |
  416|      0|        SkipWhitespace(is);
  417|       |
  418|      0|        if (is.Peek() == '\0') {
  ------------------
  |  Branch (418:13): [True: 0, False: 0]
  ------------------
  419|      0|            RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell());
  ------------------
  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  420|      0|            RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
  ------------------
  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  421|      0|        }
  422|      0|        else {
  423|      0|            ParseValue<parseFlags>(is, handler);
  424|      0|            RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
  ------------------
  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  425|       |
  426|      0|            if (!(parseFlags & kParseStopWhenDoneFlag)) {
  ------------------
  |  Branch (426:17): [True: 0, Folded]
  ------------------
  427|      0|                SkipWhitespace(is);
  428|       |
  429|      0|                if (is.Peek() != '\0') {
  ------------------
  |  Branch (429:21): [True: 0, False: 0]
  ------------------
  430|      0|                    RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell());
  ------------------
  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  431|      0|                    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
  ------------------
  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  432|      0|                }
  433|      0|            } else {
  434|       |                // jge: Update parseResult_.Offset() when kParseStopwhendoneflag
  435|       |                // is set which means the user needs to know where to resume
  436|       |                // parsing in next calls to JsonToProtoMessage()
  437|      0|                SetParseError(kParseErrorNone, is.Tell());
  438|      0|            }
  439|      0|        }
  440|       |
  441|      0|        return parseResult_;
  442|      0|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE14IterativeParseILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEENS0_11ParseResultERT0_RT1_:
 1520|  4.09k|    ParseResult IterativeParse(InputStream& is, Handler& handler) {
 1521|  4.09k|        parseResult_.Clear();
 1522|  4.09k|        ClearStackOnExit scope(*this);
 1523|  4.09k|        IterativeParsingState state = IterativeParsingStartState;
 1524|       |
 1525|  4.09k|        SkipWhitespace(is);
 1526|   122k|        while (is.Peek() != '\0') {
  ------------------
  |  Branch (1526:16): [True: 119k, False: 3.29k]
  ------------------
 1527|   119k|            Token t = Tokenize(is.Peek());
 1528|   119k|            IterativeParsingState n = Predict(state, t);
 1529|   119k|            IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
 1530|       |
 1531|   119k|            if (d == IterativeParsingErrorState) {
  ------------------
  |  Branch (1531:17): [True: 799, False: 118k]
  ------------------
 1532|    799|                HandleError(state, is);
 1533|    799|                break;
 1534|    799|            }
 1535|       |
 1536|   118k|            state = d;
 1537|       |
 1538|       |            // Do not further consume streams if a root JSON has been parsed.
 1539|   118k|            if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) {
  ------------------
  |  Branch (1539:17): [Folded, False: 118k]
  |  Branch (1539:58): [True: 0, False: 0]
  ------------------
 1540|       |                // wwb: Update parseResult_.Offset() when kParseStopWhenDoneFlag
 1541|       |                // is set which means the user needs to know where to resume
 1542|       |                // parsing in next calls to JsonToProtoMessage()
 1543|      0|                if (is.Peek() != '\0') {
  ------------------
  |  Branch (1543:21): [True: 0, False: 0]
  ------------------
 1544|      0|                    SetParseError(kParseErrorNone, is.Tell());
 1545|      0|                }
 1546|      0|                break;
 1547|      0|            }
 1548|   118k|            SkipWhitespace(is);
 1549|   118k|        }
 1550|       |
 1551|       |        // Handle the end of file.
 1552|  4.09k|        if (state != IterativeParsingFinishState)
  ------------------
  |  Branch (1552:13): [True: 1.21k, False: 2.87k]
  ------------------
 1553|  1.21k|            HandleError(state, is);
 1554|       |
 1555|  4.09k|        return parseResult_;
 1556|  4.09k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE7TransitILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEENS5_21IterativeParsingStateESD_NS5_5TokenESD_RT0_RT1_:
 1359|   119k|    RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
 1360|   119k|        (void)token;
 1361|       |
 1362|   119k|        switch (dst) {
 1363|    113|        case IterativeParsingErrorState:
  ------------------
  |  Branch (1363:9): [True: 113, False: 119k]
  ------------------
 1364|    113|            return dst;
 1365|       |
 1366|  7.35k|        case IterativeParsingObjectInitialState:
  ------------------
  |  Branch (1366:9): [True: 7.35k, False: 111k]
  ------------------
 1367|  40.3k|        case IterativeParsingArrayInitialState:
  ------------------
  |  Branch (1367:9): [True: 32.9k, False: 86.2k]
  ------------------
 1368|  40.3k|        {
 1369|       |            // Push the state(Element or MemeberValue) if we are nested in another array or value of member.
 1370|       |            // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop.
 1371|  40.3k|            IterativeParsingState n = src;
 1372|  40.3k|            if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
  ------------------
  |  Branch (1372:17): [True: 31.5k, False: 8.83k]
  |  Branch (1372:61): [True: 3.94k, False: 4.88k]
  ------------------
 1373|  35.4k|                n = IterativeParsingElementState;
 1374|  4.88k|            else if (src == IterativeParsingKeyValueDelimiterState)
  ------------------
  |  Branch (1374:22): [True: 2.61k, False: 2.27k]
  ------------------
 1375|  2.61k|                n = IterativeParsingMemberValueState;
 1376|       |            // Push current state.
 1377|  40.3k|            *stack_.template Push<SizeType>(1) = n;
 1378|       |            // Initialize and push the member/element count.
 1379|  40.3k|            *stack_.template Push<SizeType>(1) = 0;
 1380|       |            // Call handler
 1381|  40.3k|            bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
  ------------------
  |  Branch (1381:23): [True: 7.35k, False: 32.9k]
  ------------------
 1382|       |            // On handler short circuits the parsing.
 1383|  40.3k|            if (!hr) {
  ------------------
  |  Branch (1383:17): [True: 0, False: 40.3k]
  ------------------
 1384|      0|                RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
  ------------------
  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1385|      0|                return IterativeParsingErrorState;
 1386|      0|            }
 1387|  40.3k|            else {
 1388|  40.3k|                is.Take();
 1389|  40.3k|                return dst;
 1390|  40.3k|            }
 1391|  40.3k|        }
 1392|       |
 1393|  11.8k|        case IterativeParsingMemberKeyState:
  ------------------
  |  Branch (1393:9): [True: 11.8k, False: 107k]
  ------------------
 1394|  11.8k|            ParseString<parseFlags>(is, handler, true);
 1395|  11.8k|            if (HasParseError())
  ------------------
  |  Branch (1395:17): [True: 20, False: 11.7k]
  ------------------
 1396|     20|                return IterativeParsingErrorState;
 1397|  11.7k|            else
 1398|  11.7k|                return dst;
 1399|       |
 1400|  11.7k|        case IterativeParsingKeyValueDelimiterState:
  ------------------
  |  Branch (1400:9): [True: 11.7k, False: 107k]
  ------------------
 1401|  11.7k|            RAPIDJSON_ASSERT(token == ColonToken);
  ------------------
  |  |  351|  11.7k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1402|  11.7k|            is.Take();
 1403|  11.7k|            return dst;
 1404|       |
 1405|  9.15k|        case IterativeParsingMemberValueState:
  ------------------
  |  Branch (1405:9): [True: 9.15k, False: 110k]
  ------------------
 1406|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1407|  9.15k|            ParseValue<parseFlags>(is, handler);
 1408|  9.15k|            if (HasParseError()) {
  ------------------
  |  Branch (1408:17): [True: 4, False: 9.14k]
  ------------------
 1409|      4|                return IterativeParsingErrorState;
 1410|      4|            }
 1411|  9.14k|            return dst;
 1412|       |
 1413|  13.4k|        case IterativeParsingElementState:
  ------------------
  |  Branch (1413:9): [True: 13.4k, False: 105k]
  ------------------
 1414|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1415|  13.4k|            ParseValue<parseFlags>(is, handler);
 1416|  13.4k|            if (HasParseError()) {
  ------------------
  |  Branch (1416:17): [True: 90, False: 13.3k]
  ------------------
 1417|     90|                return IterativeParsingErrorState;
 1418|     90|            }
 1419|  13.3k|            return dst;
 1420|       |
 1421|  5.12k|        case IterativeParsingMemberDelimiterState:
  ------------------
  |  Branch (1421:9): [True: 5.12k, False: 114k]
  ------------------
 1422|  21.4k|        case IterativeParsingElementDelimiterState:
  ------------------
  |  Branch (1422:9): [True: 16.3k, False: 102k]
  ------------------
 1423|  21.4k|            is.Take();
 1424|       |            // Update member/element count.
 1425|  21.4k|            *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
 1426|  21.4k|            return dst;
 1427|       |
 1428|  6.65k|        case IterativeParsingObjectFinishState:
  ------------------
  |  Branch (1428:9): [True: 6.65k, False: 112k]
  ------------------
 1429|  6.65k|        {
 1430|       |            // Get member count.
 1431|  6.65k|            SizeType c = *stack_.template Pop<SizeType>(1);
 1432|       |            // If the object is not empty, count the last member.
 1433|  6.65k|            if (src == IterativeParsingMemberValueState)
  ------------------
  |  Branch (1433:17): [True: 6.03k, False: 617]
  ------------------
 1434|  6.03k|                ++c;
 1435|       |            // Restore the state.
 1436|  6.65k|            IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));
 1437|       |            // Transit to Finish state if this is the topmost scope.
 1438|  6.65k|            if (n == IterativeParsingStartState)
  ------------------
  |  Branch (1438:17): [True: 1.59k, False: 5.06k]
  ------------------
 1439|  1.59k|                n = IterativeParsingFinishState;
 1440|       |            // Call handler
 1441|  6.65k|            bool hr = handler.EndObject(c);
 1442|       |            // On handler short circuits the parsing.
 1443|  6.65k|            if (!hr) {
  ------------------
  |  Branch (1443:17): [True: 0, False: 6.65k]
  ------------------
 1444|      0|                RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
  ------------------
  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1445|      0|                return IterativeParsingErrorState;
 1446|      0|            }
 1447|  6.65k|            else {
 1448|  6.65k|                is.Take();
 1449|  6.65k|                return n;
 1450|  6.65k|            }
 1451|  6.65k|        }
 1452|       |
 1453|  2.75k|        case IterativeParsingArrayFinishState:
  ------------------
  |  Branch (1453:9): [True: 2.75k, False: 116k]
  ------------------
 1454|  2.75k|        {
 1455|       |            // Get element count.
 1456|  2.75k|            SizeType c = *stack_.template Pop<SizeType>(1);
 1457|       |            // If the array is not empty, count the last element.
 1458|  2.75k|            if (src == IterativeParsingElementState)
  ------------------
  |  Branch (1458:17): [True: 2.39k, False: 359]
  ------------------
 1459|  2.39k|                ++c;
 1460|       |            // Restore the state.
 1461|  2.75k|            IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));
 1462|       |            // Transit to Finish state if this is the topmost scope.
 1463|  2.75k|            if (n == IterativeParsingStartState)
  ------------------
  |  Branch (1463:17): [True: 52, False: 2.70k]
  ------------------
 1464|     52|                n = IterativeParsingFinishState;
 1465|       |            // Call handler
 1466|  2.75k|            bool hr = handler.EndArray(c);
 1467|       |            // On handler short circuits the parsing.
 1468|  2.75k|            if (!hr) {
  ------------------
  |  Branch (1468:17): [True: 0, False: 2.75k]
  ------------------
 1469|      0|                RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell());
  ------------------
  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1470|      0|                return IterativeParsingErrorState;
 1471|      0|            }
 1472|  2.75k|            else {
 1473|  2.75k|                is.Take();
 1474|  2.75k|                return n;
 1475|  2.75k|            }
 1476|  2.75k|        }
 1477|       |
 1478|  1.80k|        default:
  ------------------
  |  Branch (1478:9): [True: 1.80k, False: 117k]
  ------------------
 1479|       |            // This branch is for IterativeParsingValueState actually.
 1480|       |            // Use `default:` rather than
 1481|       |            // `case IterativeParsingValueState:` is for code coverage.
 1482|       |
 1483|       |            // The IterativeParsingStartState is not enumerated in this switch-case.
 1484|       |            // It is impossible for that case. And it can be caught by following assertion.
 1485|       |
 1486|       |            // The IterativeParsingFinishState is not enumerated in this switch-case either.
 1487|       |            // It is a "derivative" state which cannot triggered from Predict() directly.
 1488|       |            // Therefore it cannot happen here. And it can be caught by following assertion.
 1489|  1.80k|            RAPIDJSON_ASSERT(dst == IterativeParsingValueState);
  ------------------
  |  |  351|  1.80k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1490|       |
 1491|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1492|  1.80k|            ParseValue<parseFlags>(is, handler);
 1493|  1.80k|            if (HasParseError()) {
  ------------------
  |  Branch (1493:17): [True: 572, False: 1.23k]
  ------------------
 1494|    572|                return IterativeParsingErrorState;
 1495|    572|            }
 1496|  1.23k|            return IterativeParsingFinishState;
 1497|   119k|        }
 1498|   119k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11ParseStringILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_b:
  662|  15.9k|    void ParseString(InputStream& is, Handler& handler, bool isKey = false) {
  663|  15.9k|        internal::StreamLocalCopy<InputStream> copy(is);
  664|  15.9k|        InputStream& s(copy.s);
  665|       |
  666|  15.9k|        bool success = false;
  667|  15.9k|        if (parseFlags == kParseDefaultFlags && is_same<SourceEncoding, TargetEncoding>::value) { 
  ------------------
  |  Branch (667:13): [Folded, False: 15.9k]
  |  Branch (667:49): [True: 0, Folded]
  ------------------
  668|      0|            StackStream<typename SourceEncoding::Ch> stackStream(stack_);
  669|      0|            ParseStringToStream<SourceEncoding>(s, stackStream);
  670|      0|            RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  671|      0|            SizeType length = static_cast<SizeType>(stackStream.Length()) - 1;
  672|      0|            const typename SourceEncoding::Ch* const str = stackStream.Pop();
  673|      0|            success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true));
  ------------------
  |  Branch (673:24): [True: 0, False: 0]
  ------------------
  674|      0|        }
  675|  15.9k|        else if (parseFlags & kParseInsituFlag) {
  ------------------
  |  Branch (675:18): [Folded, False: 15.9k]
  ------------------
  676|      0|            typename InputStream::Ch *head = s.PutBegin();
  677|      0|            ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
  678|      0|            RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  679|      0|            size_t length = s.PutEnd(head) - 1;
  680|      0|            RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);
  ------------------
  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  681|      0|            const typename TargetEncoding::Ch* const str = (typename TargetEncoding::Ch*)head;
  682|      0|            success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false));
  ------------------
  |  Branch (682:24): [True: 0, False: 0]
  ------------------
  683|      0|        } 
  684|  15.9k|        else {
  685|  15.9k|            StackStream<typename TargetEncoding::Ch> stackStream(stack_);
  686|  15.9k|            ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
  687|  15.9k|            RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|  15.9k|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|  15.9k|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  15.9k|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|  15.9k|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 426, False: 15.5k]
  |  |  |  |  ------------------
  |  |  |  |   53|  15.9k|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|  15.9k|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|  15.9k|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 15.5k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  688|  15.5k|            SizeType length = static_cast<SizeType>(stackStream.Length()) - 1;
  689|  15.5k|            const typename TargetEncoding::Ch* const str = stackStream.Pop();
  690|  15.5k|            success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true));
  ------------------
  |  Branch (690:24): [True: 11.7k, False: 3.76k]
  ------------------
  691|  15.5k|        }
  692|  15.5k|        if (!success)
  ------------------
  |  Branch (692:13): [True: 0, False: 15.5k]
  ------------------
  693|       |            RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell());
  ------------------
  |  |  110|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      0|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  694|  15.5k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE19ParseStringToStreamILj4ES3_S3_NS0_19GenericStringStreamIS3_EENS5_11StackStreamIcEEEEvRT2_RT3_:
  784|  15.9k|    RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) {
  785|       |//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  787|  15.9k|        static const char escape[256] = {
  788|  15.9k|            Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', 
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', 
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
  789|  15.9k|            Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, 
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, 
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
  790|  15.9k|            0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, 
  791|  15.9k|            0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  792|  15.9k|            Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
                          Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  15.9k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
  793|  15.9k|        };
  794|  15.9k|#undef Z16
  795|       |//!@endcond
  796|       |
  797|  15.9k|        RAPIDJSON_ASSERT(is.Peek() == '\"');
  ------------------
  |  |  351|  15.9k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  798|  15.9k|        is.Take();  // Skip '\"'
  799|       |
  800|   113k|        for (;;) {
  801|   113k|            Ch c = is.Peek();
  802|   113k|            if (c == '\\') {    // Escape
  ------------------
  |  Branch (802:17): [True: 2.38k, False: 111k]
  ------------------
  803|  2.38k|                is.Take();
  804|  2.38k|                Ch e = is.Take();
  805|  2.38k|                if ((sizeof(Ch) == 1 || unsigned(e) < 256) && escape[(unsigned char)e]) {
  ------------------
  |  Branch (805:22): [True: 2.38k, Folded]
  |  Branch (805:41): [True: 0, False: 0]
  |  Branch (805:63): [True: 202, False: 2.18k]
  ------------------
  806|    202|                    os.Put(escape[(unsigned char)e]);
  807|    202|                }
  808|  2.18k|                else if (e == 'u') {    // Unicode
  ------------------
  |  Branch (808:26): [True: 2.17k, False: 14]
  ------------------
  809|  2.17k|                    unsigned codepoint = ParseHex4(is);
  810|  2.17k|                    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|  2.17k|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|  2.17k|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  2.17k|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|  2.17k|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 168, False: 2.00k]
  |  |  |  |  ------------------
  |  |  |  |   53|  2.17k|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|  2.17k|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|  2.17k|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 2.00k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  811|  2.00k|                    if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
  ------------------
  |  Branch (811:25): [True: 1.01k, False: 989]
  |  Branch (811:48): [True: 420, False: 595]
  ------------------
  812|       |                        // Handle UTF-16 surrogate pair
  813|    420|                        if (is.Take() != '\\' || is.Take() != 'u')
  ------------------
  |  Branch (813:29): [True: 24, False: 396]
  |  Branch (813:50): [True: 12, False: 384]
  ------------------
  814|    420|                            RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, is.Tell() - 2);
  ------------------
  |  |  110|     72|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     36|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     72|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     36|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     36|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     36|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     36|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     36|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     36|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     36|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     36|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 36]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     72|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     36|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     36|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     36|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     36|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 36, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     36|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     36|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     36|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     72|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     36|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     36|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  815|    384|                        unsigned codepoint2 = ParseHex4(is);
  816|    384|                        RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|    384|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|    384|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    384|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|    384|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 13, False: 371]
  |  |  |  |  ------------------
  |  |  |  |   53|    384|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    384|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    384|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 371]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|    371|                        if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
  ------------------
  |  Branch (817:29): [True: 20, False: 351]
  |  Branch (817:52): [True: 6, False: 345]
  ------------------
  818|    371|                            RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, is.Tell() - 2);
  ------------------
  |  |  110|     52|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     26|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     52|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     26|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     26|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     26|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     26|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     26|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     26|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     26|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     26|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 26]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     52|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     26|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     26|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     26|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     26|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 26, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     26|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     26|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     26|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     52|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     26|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     26|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  819|    345|                        codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
  820|    345|                    }
  821|  1.92k|                    TEncoding::Encode(os, codepoint);
  822|  1.92k|                }
  823|     14|                else
  824|  2.18k|                    RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     28|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     14|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     28|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     14|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     14|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     14|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     14|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     14|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     14|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     14|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     14|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 14]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     28|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     14|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     14|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     14|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     14|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 14, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     14|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     14|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     14|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     28|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     14|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     14|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  825|  2.38k|            }
  826|   111k|            else if (c == '"') {    // Closing double quote
  ------------------
  |  Branch (826:22): [True: 15.5k, False: 95.6k]
  ------------------
  827|  15.5k|                is.Take();
  828|  15.5k|                os.Put('\0');   // null-terminate the string
  829|  15.5k|                return;
  830|  15.5k|            }
  831|  95.6k|            else if (c == '\0')
  ------------------
  |  Branch (831:22): [True: 160, False: 95.4k]
  ------------------
  832|  95.6k|                RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell() - 1);
  ------------------
  |  |  110|    320|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    160|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    320|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|    160|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    160|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|    160|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|    160|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|    160|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|    160|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    160|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    160|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 160]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    320|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|    160|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    160|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|    160|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    160|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 160, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    160|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|    160|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|    160|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    320|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    160|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    160|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  833|  95.4k|            else if ((unsigned)c < 0x20) // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
  ------------------
  |  Branch (833:22): [True: 9, False: 95.4k]
  ------------------
  834|  95.4k|                RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     18|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      9|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     18|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      9|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      9|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      9|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      9|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      9|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      9|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      9|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      9|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 9]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     18|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      9|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      9|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      9|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      9|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 9, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      9|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      9|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      9|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     18|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      9|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      9|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  835|  95.4k|            else {
  836|  95.4k|                if (parseFlags & kParseValidateEncodingFlag ? 
  ------------------
  |  Branch (836:21): [Folded, False: 95.4k]
  |  Branch (836:21): [True: 0, False: 95.4k]
  ------------------
  837|      0|                    !Transcoder<SEncoding, TEncoding>::Validate(is, os) : 
  838|  95.4k|                    !Transcoder<SEncoding, TEncoding>::Transcode(is, os))
  839|       |                    RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell());
  ------------------
  |  |  110|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      0|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  840|  95.4k|            }
  841|   113k|        }
  842|  15.9k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ParseValueILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
 1105|  24.3k|    void ParseValue(InputStream& is, Handler& handler) {
 1106|  24.3k|        switch (is.Peek()) {
 1107|    538|            case 'n': ParseNull  <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1107:13): [True: 538, False: 23.8k]
  ------------------
 1108|  1.36k|            case 't': ParseTrue  <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1108:13): [True: 1.36k, False: 23.0k]
  ------------------
 1109|    303|            case 'f': ParseFalse <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1109:13): [True: 303, False: 24.0k]
  ------------------
 1110|  4.16k|            case '"': ParseString<parseFlags>(is, handler); break;
  ------------------
  |  Branch (1110:13): [True: 4.16k, False: 20.2k]
  ------------------
 1111|      0|            case '{': ParseObject<parseFlags>(is, handler); break;
  ------------------
  |  Branch (1111:13): [True: 0, False: 24.3k]
  ------------------
 1112|      0|            case '[': ParseArray <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1112:13): [True: 0, False: 24.3k]
  ------------------
 1113|  18.0k|            default : ParseNumber<parseFlags>(is, handler);
  ------------------
  |  Branch (1113:13): [True: 18.0k, False: 6.37k]
  ------------------
 1114|  24.3k|        }
 1115|  24.3k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseNullILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  572|    538|    void ParseNull(InputStream& is, Handler& handler) {
  573|    538|        RAPIDJSON_ASSERT(is.Peek() == 'n');
  ------------------
  |  |  351|    538|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  574|    538|        is.Take();
  575|       |
  576|    538|        if (is.Take() == 'u' && is.Take() == 'l' && is.Take() == 'l') {
  ------------------
  |  Branch (576:13): [True: 526, False: 12]
  |  Branch (576:33): [True: 513, False: 13]
  |  Branch (576:53): [True: 501, False: 12]
  ------------------
  577|    501|            if (!handler.Null())
  ------------------
  |  Branch (577:17): [True: 0, False: 501]
  ------------------
  578|    501|                RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());
  ------------------
  |  |  110|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      0|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  579|    501|        }
  580|     37|        else
  581|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     74|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     37|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     74|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     37|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     37|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     37|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     37|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     37|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     37|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     37|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     37|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 37]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     74|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     37|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     37|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     37|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     37|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 37, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     37|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     37|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     37|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     74|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     37|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     37|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  582|    538|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseTrueILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  585|  1.36k|    void ParseTrue(InputStream& is, Handler& handler) {
  586|  1.36k|        RAPIDJSON_ASSERT(is.Peek() == 't');
  ------------------
  |  |  351|  1.36k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  587|  1.36k|        is.Take();
  588|       |
  589|  1.36k|        if (is.Take() == 'r' && is.Take() == 'u' && is.Take() == 'e') {
  ------------------
  |  Branch (589:13): [True: 1.35k, False: 11]
  |  Branch (589:33): [True: 1.34k, False: 11]
  |  Branch (589:53): [True: 1.33k, False: 11]
  ------------------
  590|  1.33k|            if (!handler.Bool(true))
  ------------------
  |  Branch (590:17): [True: 0, False: 1.33k]
  ------------------
  591|  1.33k|                RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());
  ------------------
  |  |  110|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      0|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  592|  1.33k|        }
  593|     33|        else
  594|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     66|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     33|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     66|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     33|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     33|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     33|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     33|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     33|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     33|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     33|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     33|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 33]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     66|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     33|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     33|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     33|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     33|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 33, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     33|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     33|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     33|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     66|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     33|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     33|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  595|  1.36k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ParseFalseILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  598|    303|    void ParseFalse(InputStream& is, Handler& handler) {
  599|    303|        RAPIDJSON_ASSERT(is.Peek() == 'f');
  ------------------
  |  |  351|    303|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  600|    303|        is.Take();
  601|       |
  602|    303|        if (is.Take() == 'a' && is.Take() == 'l' && is.Take() == 's' && is.Take() == 'e') {
  ------------------
  |  Branch (602:13): [True: 291, False: 12]
  |  Branch (602:33): [True: 280, False: 11]
  |  Branch (602:53): [True: 269, False: 11]
  |  Branch (602:73): [True: 256, False: 13]
  ------------------
  603|    256|            if (!handler.Bool(false))
  ------------------
  |  Branch (603:17): [True: 0, False: 256]
  ------------------
  604|    256|                RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell());
  ------------------
  |  |  110|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      0|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  605|    256|        }
  606|     47|        else
  607|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     94|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     47|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     94|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     47|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     47|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     47|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     47|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     47|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     47|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     47|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     47|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 47]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     94|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     47|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     47|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     47|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     47|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 47, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     47|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     47|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     47|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     94|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     47|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     47|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  608|    303|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11ParseNumberILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  890|  18.0k|    void ParseNumber(InputStream& is, Handler& handler) {
  891|  18.0k|        internal::StreamLocalCopy<InputStream> copy(is);
  892|  18.0k|        NumberStream<InputStream, (parseFlags & kParseFullPrecisionFlag) != 0> s(*this, copy.s);
  893|       |
  894|       |        // Parse minus
  895|  18.0k|        bool minus = false;
  896|  18.0k|        if (s.Peek() == '-') {
  ------------------
  |  Branch (896:13): [True: 2.17k, False: 15.8k]
  ------------------
  897|  2.17k|            minus = true;
  898|  2.17k|            s.Take();
  899|  2.17k|        }
  900|       |
  901|       |        // Parse int: zero / ( digit1-9 *DIGIT )
  902|  18.0k|        unsigned i = 0;
  903|  18.0k|        uint64_t i64 = 0;
  904|  18.0k|        bool use64bit = false;
  905|  18.0k|        int significandDigit = 0;
  906|  18.0k|        if (s.Peek() == '0') {
  ------------------
  |  Branch (906:13): [True: 3.14k, False: 14.8k]
  ------------------
  907|  3.14k|            i = 0;
  908|  3.14k|            s.TakePush();
  909|  3.14k|        }
  910|  14.8k|        else if (s.Peek() >= '1' && s.Peek() <= '9') {
  ------------------
  |  Branch (910:18): [True: 14.8k, False: 36]
  |  Branch (910:37): [True: 14.8k, False: 7]
  ------------------
  911|  14.8k|            i = static_cast<unsigned>(s.TakePush() - '0');
  912|       |
  913|  14.8k|            if (minus)
  ------------------
  |  Branch (913:17): [True: 1.82k, False: 12.9k]
  ------------------
  914|  9.44k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (914:24): [True: 8.75k, False: 692]
  |  Branch (914:43): [True: 8.36k, False: 387]
  ------------------
  915|  8.36k|                    if (i >= 214748364) { // 2^31 = 2147483648
  ------------------
  |  Branch (915:25): [True: 817, False: 7.54k]
  ------------------
  916|    817|                        if (i != 214748364 || s.Peek() > '8') {
  ------------------
  |  Branch (916:29): [True: 673, False: 144]
  |  Branch (916:47): [True: 73, False: 71]
  ------------------
  917|    746|                            i64 = i;
  918|    746|                            use64bit = true;
  919|    746|                            break;
  920|    746|                        }
  921|    817|                    }
  922|  7.62k|                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');
  923|  7.62k|                    significandDigit++;
  924|  7.62k|                }
  925|  12.9k|            else
  926|  27.8k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (926:24): [True: 20.3k, False: 7.51k]
  |  Branch (926:43): [True: 16.2k, False: 4.08k]
  ------------------
  927|  16.2k|                    if (i >= 429496729) { // 2^32 - 1 = 4294967295
  ------------------
  |  Branch (927:25): [True: 1.48k, False: 14.7k]
  ------------------
  928|  1.48k|                        if (i != 429496729 || s.Peek() > '5') {
  ------------------
  |  Branch (928:29): [True: 1.32k, False: 158]
  |  Branch (928:47): [True: 71, False: 87]
  ------------------
  929|  1.39k|                            i64 = i;
  930|  1.39k|                            use64bit = true;
  931|  1.39k|                            break;
  932|  1.39k|                        }
  933|  1.48k|                    }
  934|  14.8k|                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');
  935|  14.8k|                    significandDigit++;
  936|  14.8k|                }
  937|  14.8k|        }
  938|     43|        else
  939|  14.8k|            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
  ------------------
  |  |  110|     86|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     86|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     43|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     43|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     43|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     43|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     43|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 43]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     86|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     43|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     43|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     43|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 43, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     43|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     86|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  940|       |
  941|       |        // Parse 64bit int
  942|  17.9k|        bool useDouble = false;
  943|  17.9k|        double d = 0.0;
  944|  17.9k|        if (use64bit) {
  ------------------
  |  Branch (944:13): [True: 2.14k, False: 15.8k]
  ------------------
  945|  2.14k|            if (minus) 
  ------------------
  |  Branch (945:17): [True: 746, False: 1.39k]
  ------------------
  946|  4.87k|                while (s.Peek() >= '0' && s.Peek() <= '9') {                    
  ------------------
  |  Branch (946:24): [True: 4.40k, False: 467]
  |  Branch (946:43): [True: 4.33k, False: 69]
  ------------------
  947|  4.33k|                     if (i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC)) // 2^63 = 9223372036854775808
  ------------------
  |  |  268|  4.33k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (947:26): [True: 278, False: 4.05k]
  ------------------
  948|    278|                        if (i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8') {
  ------------------
  |  |  268|    556|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (948:29): [True: 144, False: 134]
  |  Branch (948:83): [True: 66, False: 68]
  ------------------
  949|    210|                            d = i64;
  950|    210|                            useDouble = true;
  951|    210|                            break;
  952|    210|                        }
  953|  4.12k|                    i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  954|  4.12k|                    significandDigit++;
  955|  4.12k|                }
  956|  1.39k|            else
  957|  9.99k|                while (s.Peek() >= '0' && s.Peek() <= '9') {                    
  ------------------
  |  Branch (957:24): [True: 9.18k, False: 808]
  |  Branch (957:43): [True: 8.94k, False: 239]
  ------------------
  958|  8.94k|                    if (i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999)) // 2^64 - 1 = 18446744073709551615
  ------------------
  |  |  268|  8.94k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (958:25): [True: 419, False: 8.52k]
  ------------------
  959|    419|                        if (i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5') {
  ------------------
  |  |  268|    838|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (959:29): [True: 283, False: 136]
  |  Branch (959:83): [True: 67, False: 69]
  ------------------
  960|    350|                            d = i64;
  961|    350|                            useDouble = true;
  962|    350|                            break;
  963|    350|                        }
  964|  8.59k|                    i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  965|  8.59k|                    significandDigit++;
  966|  8.59k|                }
  967|  2.14k|        }
  968|       |
  969|       |        // Force double for big integer
  970|  17.9k|        if (useDouble) {
  ------------------
  |  Branch (970:13): [True: 560, False: 17.4k]
  ------------------
  971|  1.60k|            while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (971:20): [True: 1.11k, False: 489]
  |  Branch (971:39): [True: 1.04k, False: 70]
  ------------------
  972|  1.04k|                if (d >= 1.7976931348623157e307) // DBL_MAX / 10.0
  ------------------
  |  Branch (972:21): [True: 1, False: 1.04k]
  ------------------
  973|  1.04k|                    RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, s.Tell());
  ------------------
  |  |  110|      2|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      1|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      2|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      1|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      1|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      1|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      1|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      1|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      1|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      1|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      1|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 1]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      2|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      1|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      1|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      1|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      1|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 1, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      1|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      1|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      1|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      2|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      1|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      1|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  974|  1.04k|                d = d * 10 + (s.TakePush() - '0');
  975|  1.04k|            }
  976|    560|        }
  977|       |
  978|       |        // Parse frac = decimal-point 1*DIGIT
  979|  17.9k|        int expFrac = 0;
  980|  17.9k|        size_t decimalPosition;
  981|  17.9k|        if (s.Peek() == '.') {
  ------------------
  |  Branch (981:13): [True: 1.28k, False: 16.6k]
  ------------------
  982|  1.28k|            s.Take();
  983|  1.28k|            decimalPosition = s.Length();
  984|       |
  985|  1.28k|            if (!(s.Peek() >= '0' && s.Peek() <= '9'))
  ------------------
  |  Branch (985:19): [True: 1.27k, False: 9]
  |  Branch (985:38): [True: 1.27k, False: 4]
  ------------------
  986|  1.28k|                RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell());
  ------------------
  |  |  110|     26|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     13|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     26|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     13|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     13|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     13|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     13|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     13|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     13|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     13|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     13|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 13]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     26|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     13|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     13|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     13|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     13|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 13, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     13|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     13|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     13|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     26|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     13|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     13|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  987|       |
  988|  1.27k|            if (!useDouble) {
  ------------------
  |  Branch (988:17): [True: 1.20k, False: 66]
  ------------------
  989|  1.20k|#if RAPIDJSON_64BIT
  990|       |                // Use i64 to store significand in 64-bit architecture
  991|  1.20k|                if (!use64bit)
  ------------------
  |  Branch (991:21): [True: 899, False: 307]
  ------------------
  992|    899|                    i64 = i;
  993|       |        
  994|  3.36k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (994:24): [True: 2.73k, False: 627]
  |  Branch (994:43): [True: 2.29k, False: 442]
  ------------------
  995|  2.29k|                    if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path
  ------------------
  |  |  268|  2.29k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (995:25): [True: 137, False: 2.16k]
  ------------------
  996|    137|                        break;
  997|  2.16k|                    else {
  998|  2.16k|                        i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  999|  2.16k|                        --expFrac;
 1000|  2.16k|                        if (i64 != 0)
  ------------------
  |  Branch (1000:29): [True: 1.50k, False: 658]
  ------------------
 1001|  1.50k|                            significandDigit++;
 1002|  2.16k|                    }
 1003|  2.29k|                }
 1004|       |
 1005|  1.20k|                d = (double)i64;
 1006|       |#else
 1007|       |                // Use double to store significand in 32-bit architecture
 1008|       |                d = use64bit ? (double)i64 : (double)i;
 1009|       |#endif
 1010|  1.20k|                useDouble = true;
 1011|  1.20k|            }
 1012|       |
 1013|  1.89k|            while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1013:20): [True: 1.06k, False: 829]
  |  Branch (1013:39): [True: 622, False: 443]
  ------------------
 1014|    622|                if (significandDigit < 17) {
  ------------------
  |  Branch (1014:21): [True: 160, False: 462]
  ------------------
 1015|    160|                    d = d * 10.0 + (s.TakePush() - '0');
 1016|    160|                    --expFrac;
 1017|    160|                    if (d > 0.0)
  ------------------
  |  Branch (1017:25): [True: 160, False: 0]
  ------------------
 1018|    160|                        significandDigit++;
 1019|    160|                }
 1020|    462|                else
 1021|    462|                    s.TakePush();
 1022|    622|            }
 1023|  1.27k|        }
 1024|  16.6k|        else
 1025|  16.6k|            decimalPosition = s.Length(); // decimal position at the end of integer.
 1026|       |
 1027|       |        // Parse exp = e [ minus / plus ] 1*DIGIT
 1028|  17.9k|        int exp = 0;
 1029|  17.9k|        if (s.Peek() == 'e' || s.Peek() == 'E') {
  ------------------
  |  Branch (1029:13): [True: 1.96k, False: 15.9k]
  |  Branch (1029:32): [True: 1.28k, False: 14.7k]
  ------------------
 1030|  3.25k|            if (!useDouble) {
  ------------------
  |  Branch (1030:17): [True: 2.98k, False: 266]
  ------------------
 1031|  2.98k|                d = use64bit ? i64 : i;
  ------------------
  |  Branch (1031:21): [True: 115, False: 2.87k]
  ------------------
 1032|  2.98k|                useDouble = true;
 1033|  2.98k|            }
 1034|  3.25k|            s.Take();
 1035|       |
 1036|  3.25k|            bool expMinus = false;
 1037|  3.25k|            if (s.Peek() == '+')
  ------------------
  |  Branch (1037:17): [True: 196, False: 3.05k]
  ------------------
 1038|    196|                s.Take();
 1039|  3.05k|            else if (s.Peek() == '-') {
  ------------------
  |  Branch (1039:22): [True: 1.05k, False: 2.00k]
  ------------------
 1040|  1.05k|                s.Take();
 1041|  1.05k|                expMinus = true;
 1042|  1.05k|            }
 1043|       |
 1044|  3.25k|            if (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1044:17): [True: 3.17k, False: 80]
  |  Branch (1044:36): [True: 3.16k, False: 4]
  ------------------
 1045|  3.16k|                exp = s.Take() - '0';
 1046|  3.16k|                if (expMinus) {
  ------------------
  |  Branch (1046:21): [True: 1.04k, False: 2.12k]
  ------------------
 1047|  3.57k|                    while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1047:28): [True: 2.52k, False: 1.04k]
  |  Branch (1047:47): [True: 2.52k, False: 2]
  ------------------
 1048|  2.52k|                        exp = exp * 10 + (s.Take() - '0');
 1049|  2.52k|                        if (exp >= 214748364) {                         // Issue #313: prevent overflow exponent
  ------------------
  |  Branch (1049:29): [True: 86, False: 2.44k]
  ------------------
 1050|    280|                            while (s.Peek() >= '0' && s.Peek() <= '9')  // Consume the rest of exponent
  ------------------
  |  Branch (1050:36): [True: 194, False: 86]
  |  Branch (1050:55): [True: 194, False: 0]
  ------------------
 1051|    194|                                s.Take();
 1052|     86|                        }
 1053|  2.52k|                    }
 1054|  1.04k|                }
 1055|  2.12k|                else {  // positive exp
 1056|  2.12k|                    int maxExp = 308 - expFrac;
 1057|  3.24k|                    while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1057:28): [True: 1.42k, False: 1.81k]
  |  Branch (1057:47): [True: 1.12k, False: 304]
  ------------------
 1058|  1.12k|                        exp = exp * 10 + (s.Take() - '0');
 1059|  1.12k|                        if (exp > maxExp)
  ------------------
  |  Branch (1059:29): [True: 2, False: 1.11k]
  ------------------
 1060|  1.12k|                            RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, s.Tell());
  ------------------
  |  |  110|      4|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      2|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      4|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      2|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      2|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      2|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      2|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      2|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      2|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      2|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      2|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 2]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      4|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      2|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      2|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      2|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      2|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 2, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      2|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      2|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      2|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      4|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      2|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      2|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1061|  1.12k|                    }
 1062|  2.12k|                }
 1063|  3.16k|            }
 1064|     84|            else
 1065|  3.25k|                RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell());
  ------------------
  |  |  110|    168|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     84|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    168|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     84|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     84|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     84|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     84|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     84|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     84|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     84|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     84|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 84]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    168|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     84|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     84|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     84|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     84|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 84, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     84|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     84|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     84|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    168|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     84|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     84|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1066|       |
 1067|  3.16k|            if (expMinus)
  ------------------
  |  Branch (1067:17): [True: 1.04k, False: 2.12k]
  ------------------
 1068|  1.04k|                exp = -exp;
 1069|  3.16k|        }
 1070|       |
 1071|       |        // Finish parsing, call event according to the type of number.
 1072|  17.8k|        bool cont = true;
 1073|  17.8k|        size_t length = s.Length();
 1074|  17.8k|        const char* decimal = s.Pop();  // Pop stack no matter if it will be used or not.
 1075|       |
 1076|  17.8k|        if (useDouble) {
  ------------------
  |  Branch (1076:13): [True: 4.66k, False: 13.2k]
  ------------------
 1077|  4.66k|            int p = exp + expFrac;
 1078|  4.66k|            if (parseFlags & kParseFullPrecisionFlag)
  ------------------
  |  Branch (1078:17): [Folded, False: 4.66k]
  ------------------
 1079|      0|                d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp);
 1080|  4.66k|            else
 1081|  4.66k|                d = internal::StrtodNormalPrecision(d, p);
 1082|       |
 1083|  4.66k|            cont = handler.Double(minus ? -d : d);
  ------------------
  |  Branch (1083:35): [True: 594, False: 4.07k]
  ------------------
 1084|  4.66k|        }
 1085|  13.2k|        else {
 1086|  13.2k|            if (use64bit) {
  ------------------
  |  Branch (1086:17): [True: 1.16k, False: 12.0k]
  ------------------
 1087|  1.16k|                if (minus)
  ------------------
  |  Branch (1087:21): [True: 490, False: 671]
  ------------------
 1088|    490|                    cont = handler.AddInt64(static_cast<int64_t>(~i64 + 1));
 1089|    671|                else
 1090|    671|                    cont = handler.AddUint64(i64);
 1091|  1.16k|            }
 1092|  12.0k|            else {
 1093|  12.0k|                if (minus)
  ------------------
  |  Branch (1093:21): [True: 1.06k, False: 10.9k]
  ------------------
 1094|  1.06k|                    cont = handler.AddInt(static_cast<int32_t>(~i + 1));
 1095|  10.9k|                else
 1096|  10.9k|                    cont = handler.AddUint(i);
 1097|  12.0k|            }
 1098|  13.2k|        }
 1099|  17.8k|        if (!cont)
  ------------------
  |  Branch (1099:13): [True: 0, False: 17.8k]
  ------------------
 1100|       |            RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell());
  ------------------
  |  |  110|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      0|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      0|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      0|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      0|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      0|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      0|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      0|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      0|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      0|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      0|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1101|  17.8k|    }

_ZN5butil6detail29get_or_new_thread_exit_helperEv:
   99|      2|detail::ThreadExitHelper* get_or_new_thread_exit_helper() {
  100|      2|    pthread_once(&detail::thread_atexit_once, detail::make_thread_atexit_key);
  101|       |
  102|      2|    detail::ThreadExitHelper* h =
  103|      2|        (detail::ThreadExitHelper*)pthread_getspecific(detail::thread_atexit_key);
  104|      2|    if (NULL == h) {
  ------------------
  |  Branch (104:9): [True: 2, False: 0]
  ------------------
  105|      2|        h = new (std::nothrow) detail::ThreadExitHelper;
  106|      2|        if (NULL != h) {
  ------------------
  |  Branch (106:13): [True: 2, False: 0]
  ------------------
  107|      2|            pthread_setspecific(detail::thread_atexit_key, h);
  108|      2|        }
  109|      2|    }
  110|      2|    return h;
  111|      2|}
_ZN5butil13thread_atexitEPFvPvES0_:
  124|      2|int thread_atexit(void (*fn)(void*), void* arg) {
  125|      2|    if (NULL == fn) {
  ------------------
  |  Branch (125:9): [True: 0, False: 2]
  ------------------
  126|      0|        errno = EINVAL;
  127|      0|        return -1;
  128|      0|    }
  129|      2|    detail::ThreadExitHelper* h = detail::get_or_new_thread_exit_helper();
  130|      2|    if (h) {
  ------------------
  |  Branch (130:9): [True: 2, False: 0]
  ------------------
  131|      2|        return h->add(fn, arg);
  132|      2|    }
  133|      2|    errno = ENOMEM;
  134|      0|    return -1;
  135|      2|}
_ZN5butil13thread_atexitEPFvvE:
  137|      2|int thread_atexit(void (*fn)()) {
  138|      2|    if (NULL == fn) {
  ------------------
  |  Branch (138:9): [True: 0, False: 2]
  ------------------
  139|      0|        errno = EINVAL;
  140|      0|        return -1;
  141|      0|    }
  142|      2|    return thread_atexit(detail::call_single_arg_fn, (void*)fn);
  143|      2|}
thread_local.cpp:_ZN5butil6detailL22make_thread_atexit_keyEv:
   89|      2|static void make_thread_atexit_key() {
   90|      2|    if (pthread_key_create(&thread_atexit_key, delete_thread_exit_helper) != 0) {
  ------------------
  |  Branch (90:9): [True: 0, False: 2]
  ------------------
   91|      0|        fprintf(stderr, "Fail to create thread_atexit_key, abort\n");
   92|      0|        abort();
   93|      0|    }
   94|       |    // If caller is not pthread, delete_thread_exit_helper will not be called.
   95|       |    // We have to rely on atexit().
   96|      2|    atexit(helper_exit_global);
   97|      2|}
_ZN5butil6detail16ThreadExitHelper3addEPFvPvES2_:
   45|      2|    int add(Fn fn, void* arg) {
   46|      2|        try {
   47|      2|            if (_fns.capacity() < 16) {
  ------------------
  |  Branch (47:17): [True: 2, False: 0]
  ------------------
   48|      2|                _fns.reserve(16);
   49|      2|            }
   50|      2|            _fns.emplace_back(fn, arg);
   51|      2|        } catch (...) {
   52|      0|            errno = ENOMEM;
   53|      0|            return -1;
   54|      0|        }
   55|      2|        return 0;
   56|      2|    }

_ZN5butil14PlatformThread13SetNameSimpleEPKc:
   60|      2|void PlatformThread::SetNameSimple(const char* name) {
   61|      2|#if !defined(OS_NACL)
   62|       |  // On linux we can get the thread names to show up in the debugger by setting
   63|       |  // the process name for the LWP.  We don't want to do this for the main
   64|       |  // thread because that would rename the process, causing tools like killall
   65|       |  // to stop working.
   66|      2|  if (PlatformThread::CurrentId() == getpid())
  ------------------
  |  Branch (66:7): [True: 0, False: 2]
  ------------------
   67|      0|    return;
   68|       |
   69|       |  // http://0pointer.de/blog/projects/name-your-threads.html
   70|       |  // Set the name for the LWP (which gets truncated to 15 characters).
   71|       |  // Note that glibc also has a 'pthread_setname_np' api, but it may not be
   72|       |  // available everywhere and it's only benefit over using prctl directly is
   73|       |  // that it can set the name of threads other than the current thread.
   74|      2|  int err = prctl(PR_SET_NAME, name);
   75|       |  // We expect EPERM failures in sandboxed processes, just ignore those.
   76|      2|  if (err < 0 && errno != EPERM)
  ------------------
  |  Branch (76:7): [True: 0, False: 2]
  |  Branch (76:18): [True: 0, False: 0]
  ------------------
   77|      0|    DPLOG(ERROR) << "prctl(PR_SET_NAME)";
  ------------------
  |  |  749|      0|    BAIDU_LAZY_STREAM(PLOG_STREAM(severity), DLOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   78|      2|#endif  //  !defined(OS_NACL)
   79|      2|}

_ZN5butil14PlatformThread9CurrentIdEv:
  145|      2|PlatformThreadId PlatformThread::CurrentId() {
  146|       |  // Pthreads doesn't have the concept of a thread ID, so we have to reach down
  147|       |  // into the kernel.
  148|       |#if defined(OS_MACOSX)
  149|       |  return pthread_mach_thread_np(pthread_self());
  150|       |#elif defined(OS_LINUX)
  151|      2|  return syscall(__NR_gettid);
  152|       |#elif defined(OS_ANDROID)
  153|       |  return gettid();
  154|       |#elif defined(OS_SOLARIS) || defined(OS_QNX)
  155|       |  return pthread_self();
  156|       |#elif defined(OS_NACL) && defined(__GLIBC__)
  157|       |  return pthread_self();
  158|       |#elif defined(OS_NACL) && !defined(__GLIBC__)
  159|       |  // Pointers are 32-bits in NaCl.
  160|       |  return reinterpret_cast<int32_t>(pthread_self());
  161|       |#elif defined(OS_POSIX)
  162|       |  return reinterpret_cast<int64_t>(pthread_self());
  163|       |#endif
  164|      2|}

_ZN5butil15cpuwide_time_nsEv:
  283|      4|inline int64_t cpuwide_time_ns() {
  284|      4|#if !defined(BAIDU_INTERNAL) && !BUTIL_USE_CPU_FREQUENCY
  285|       |    // nearly impossible to get the correct invariant cpu frequency on
  286|       |    // different CPU and machines. CPU-ID rarely works and frequencies
  287|       |    // in "model name" and "cpu Mhz" are both unreliable.
  288|       |    // Since clock_gettime() in newer glibc/kernel is much faster(~30ns)
  289|       |    // which is closer to the previous impl. of cpuwide_time(~10ns), we
  290|       |    // simply use the monotonic time to get rid of all related issues.
  291|      4|    timespec now;
  292|      4|    clock_gettime(CLOCK_MONOTONIC, &now);
  293|      4|    return now.tv_sec * 1000000000L + now.tv_nsec;
  294|       |#else
  295|       |    int64_t cpu_freq = detail::invariant_cpu_freq;
  296|       |    if (cpu_freq > 0) {
  297|       |        const uint64_t tsc = detail::clock_cycles();
  298|       |        //Try to avoid overflow
  299|       |        const uint64_t sec = tsc / cpu_freq;
  300|       |        const uint64_t remain = tsc % cpu_freq;
  301|       |        // TODO: should be OK until CPU's frequency exceeds 16GHz.
  302|       |        return remain * 1000000000L / cpu_freq + sec * 1000000000L;
  303|       |    } else {
  304|       |        // Lack of necessary features, return system-wide monotonic time instead.
  305|       |        return monotonic_time_ns();
  306|       |    }
  307|       |#endif // defined(BAIDU_INTERNAL) || BUTIL_USE_CPU_FREQUENCY
  308|      4|}
_ZN5butil15cpuwide_time_usEv:
  318|      4|inline int64_t cpuwide_time_us() {
  319|      4|    return cpuwide_time_ns() / 1000L;
  320|      4|}

_ZN4bvar6detail10AgentGroupINS0_13AgentCombinerIPNS0_7SamplerES4_NS0_14CombineSamplerEE5AgentEE16create_new_agentEv:
   89|      2|    inline static AgentId create_new_agent() {
   90|      2|        BAIDU_SCOPED_LOCK(_s_mutex);
  ------------------
  |  |   47|      2|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      2|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      2|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      2|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   91|      2|        AgentId agent_id = 0;
   92|      2|        if (!_get_free_ids().empty()) {
  ------------------
  |  Branch (92:13): [True: 0, False: 2]
  ------------------
   93|      0|            agent_id = _get_free_ids().back();
   94|      0|            _get_free_ids().pop_back();
   95|      2|        } else {
   96|      2|            agent_id = _s_agent_kinds++;
   97|      2|        }
   98|      2|        return agent_id;
   99|      2|    }
_ZN4bvar6detail10AgentGroupINS0_13AgentCombinerIPNS0_7SamplerES4_NS0_14CombineSamplerEE5AgentEE13_get_free_idsEv:
  172|      2|    inline static std::deque<AgentId> &_get_free_ids() {
  173|      2|        if (__builtin_expect(!_s_free_ids, 0)) {
  ------------------
  |  Branch (173:13): [True: 2, False: 0]
  ------------------
  174|      2|            _s_free_ids = new (std::nothrow) std::deque<AgentId>();
  175|      2|            RELEASE_ASSERT(_s_free_ids);
  ------------------
  |  |  476|      2|    do {                            \
  |  |  477|      2|        if (!(condition)) {         \
  |  |  ------------------
  |  |  |  Branch (477:13): [True: 0, False: 2]
  |  |  ------------------
  |  |  478|      0|            ::abort();              \
  |  |  479|      0|        }                           \
  |  |  480|      2|    } while (false)
  |  |  ------------------
  |  |  |  Branch (480:14): [Folded, False: 2]
  |  |  ------------------
  ------------------
  176|      2|        }
  177|      2|        return *_s_free_ids;
  178|      2|    }
_ZN4bvar6detail10AgentGroupINS0_13AgentCombinerIPNS0_7SamplerES4_NS0_14CombineSamplerEE5AgentEE13get_tls_agentEi:
  114|      8|    inline static Agent* get_tls_agent(AgentId id) {
  115|      8|        if (__builtin_expect(id >= 0, 1)) {
  ------------------
  |  Branch (115:13): [True: 8, False: 0]
  ------------------
  116|      8|            if (_s_tls_blocks) {
  ------------------
  |  Branch (116:17): [True: 6, False: 2]
  ------------------
  117|      6|                const size_t block_id = (size_t)id / ELEMENTS_PER_BLOCK;
  118|      6|                if (block_id < _s_tls_blocks->size()) {
  ------------------
  |  Branch (118:21): [True: 6, False: 0]
  ------------------
  119|      6|                    ThreadBlock* const tb = (*_s_tls_blocks)[block_id];
  120|      6|                    if (tb) {
  ------------------
  |  Branch (120:25): [True: 6, False: 0]
  ------------------
  121|      6|                        return tb->at(id - block_id * ELEMENTS_PER_BLOCK);
  122|      6|                    }
  123|      6|                }
  124|      6|            }
  125|      8|        }
  126|      2|        return nullptr;
  127|      8|    }
_ZN4bvar6detail10AgentGroupINS0_13AgentCombinerIPNS0_7SamplerES4_NS0_14CombineSamplerEE5AgentEE11ThreadBlock2atEm:
   83|      8|        inline Agent* at(size_t offset) { return _agents + offset; };
_ZN4bvar6detail10AgentGroupINS0_13AgentCombinerIPNS0_7SamplerES4_NS0_14CombineSamplerEE5AgentEE23get_or_create_tls_agentEi:
  130|      2|    inline static Agent* get_or_create_tls_agent(AgentId id) {
  131|      2|        if (__builtin_expect(id < 0, 0)) {
  ------------------
  |  Branch (131:13): [True: 0, False: 2]
  ------------------
  132|      0|            CHECK(false) << "Invalid id=" << id;
  ------------------
  |  |  617|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(FATAL).SetCheck(), !(condition))     \
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  618|      0|    << "Check failed: " #condition ". "
  ------------------
  133|      0|            return nullptr;
  134|      0|        }
  135|      2|        if (_s_tls_blocks == nullptr) {
  ------------------
  |  Branch (135:13): [True: 2, False: 0]
  ------------------
  136|      2|            _s_tls_blocks = new (std::nothrow) std::vector<ThreadBlock *>;
  137|      2|            if (__builtin_expect(_s_tls_blocks == nullptr, 0)) {
  ------------------
  |  Branch (137:17): [True: 0, False: 2]
  ------------------
  138|      0|                LOG(FATAL) << "Fail to create vector, " << berror();
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  139|      0|                return nullptr;
  140|      0|            }
  141|      2|            butil::thread_atexit(_destroy_tls_blocks);
  142|      2|        }
  143|      2|        const size_t block_id = (size_t)id / ELEMENTS_PER_BLOCK; 
  144|      2|        if (block_id >= _s_tls_blocks->size()) {
  ------------------
  |  Branch (144:13): [True: 2, False: 0]
  ------------------
  145|       |            // The 32ul avoid pointless small resizes.
  146|      2|            _s_tls_blocks->resize(std::max(block_id + 1, 32ul));
  147|      2|        }
  148|      2|        ThreadBlock* tb = (*_s_tls_blocks)[block_id];
  149|      2|        if (tb == nullptr) {
  ------------------
  |  Branch (149:13): [True: 2, False: 0]
  ------------------
  150|      2|            ThreadBlock *new_block = new (std::nothrow) ThreadBlock;
  151|      2|            if (__builtin_expect(new_block == nullptr, 0)) {
  ------------------
  |  Branch (151:17): [True: 0, False: 2]
  ------------------
  152|      0|                return nullptr;
  153|      0|            }
  154|      2|            tb = new_block;
  155|      2|            (*_s_tls_blocks)[block_id] = new_block;
  156|      2|        }
  157|      2|        return tb->at(id - block_id * ELEMENTS_PER_BLOCK);
  158|      2|    }

_ZN4bvar6detail22call_op_returning_voidINS0_14CombineSamplerEPNS0_7SamplerES4_EEvRKT_RT0_RKT1_:
   28|     10|    const Op& op, T1& v1, const T2& v2) {
   29|     10|    return op(v1, v2);
   30|     10|}

_ZN4bvar6detail13AgentCombinerIPNS0_7SamplerES3_NS0_14CombineSamplerEEC2ES3_S3_RKS4_:
  227|      2|        : _id(AgentGroup::create_new_agent())
  228|      2|        , _op(op)
  229|      2|        , _global_result(result_identity)
  230|      2|        , _result_identity(result_identity)
  231|      2|        , _element_identity(element_identity) {
  232|      2|    }
_ZNK4bvar6detail13AgentCombinerIPNS0_7SamplerES3_NS0_14CombineSamplerEE2opEv:
  379|      8|    const BinaryOp& op() const { return _op; }
_ZN4bvar6detail13AgentCombinerIPNS0_7SamplerES3_NS0_14CombineSamplerEE16reset_all_agentsEv:
  292|      2|    ResultTp reset_all_agents() {
  293|      2|        ElementTp prev;
  294|      2|        butil::AutoLock guard(_lock);
  295|      2|        ResultTp tmp = _global_result;
  296|      2|        _global_result = _result_identity;
  297|      2|        for (butil::LinkNode<Agent>* node = _agents.head();
  298|      4|             node != _agents.end(); node = node->next()) {
  ------------------
  |  Branch (298:14): [True: 2, False: 2]
  ------------------
  299|      2|            node->value()->element.exchange(&prev, _element_identity);
  300|      2|            call_op_returning_void(_op, tmp, prev);
  301|      2|        }
  302|      2|        return tmp;
  303|      2|    }
_ZN4bvar6detail16ElementContainerIPNS0_7SamplerEvE8exchangeEPS3_RKS3_:
   86|      2|    void exchange(T* prev, const T& new_value) {
   87|      2|        butil::AutoLock guard(_lock);
   88|      2|        *prev = _value;
   89|      2|        _value = new_value;
   90|      2|    }
_ZN4bvar6detail13AgentCombinerIPNS0_7SamplerES3_NS0_14CombineSamplerEE23get_or_create_tls_agentEv:
  331|      8|    Agent* get_or_create_tls_agent() {
  332|      8|        Agent* agent = AgentGroup::get_tls_agent(_id);
  333|      8|        if (!agent) {
  ------------------
  |  Branch (333:13): [True: 2, False: 6]
  ------------------
  334|       |            // Create the agent
  335|      2|            agent = AgentGroup::get_or_create_tls_agent(_id);
  336|      2|            if (nullptr == agent) {
  ------------------
  |  Branch (336:17): [True: 0, False: 2]
  ------------------
  337|      0|                LOG(FATAL) << "Fail to create agent";
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|      0|                return nullptr;
  339|      0|            }
  340|      2|        }
  341|      8|        if (!agent->combiner.expired()) {
  ------------------
  |  Branch (341:13): [True: 6, False: 2]
  ------------------
  342|      6|            return agent;
  343|      6|        }
  344|      2|        agent->reset(_element_identity, this->shared_from_this());
  345|       |        // TODO: Is uniqueness-checking necessary here?
  346|      2|        {
  347|      2|            butil::AutoLock guard(_lock);
  348|      2|            _agents.Append(agent);
  349|      2|        }
  350|      2|        return agent;
  351|      8|    }
_ZN4bvar6detail13AgentCombinerIPNS0_7SamplerES3_NS0_14CombineSamplerEE5Agent5resetERKS3_RKSt10shared_ptrIS5_E:
  175|      2|        void reset(const ElementTp& val, const self_shared_type& c) {
  176|      2|            combiner = c;
  177|      2|            element.store(val);
  178|      2|        }
_ZN4bvar6detail16ElementContainerIPNS0_7SamplerEvE5storeERKS3_:
   81|      2|    void store(const T& new_value) {
   82|      2|        butil::AutoLock guard(_lock);
   83|      2|        _value = new_value;
   84|      2|    }
_ZN4bvar6detail16ElementContainerIPNS0_7SamplerEvE6modifyINS0_14CombineSamplerES3_EEvRKT_RKT0_:
   93|      8|    void modify(const Op &op, const T1 &value2) {
   94|      8|        butil::AutoLock guard(_lock);
   95|      8|        call_op_returning_void(op, _value, value2);
   96|      8|    }

_ZN4bvar6detail16SamplerCollector3runEv:
  135|      2|void SamplerCollector::run() {
  136|      2|    ::usleep(FLAGS_bvar_sampler_thread_start_delay_us);
  137|       |    
  138|       |#ifndef UNIT_TEST
  139|       |    // NOTE:
  140|       |    // * Following vars can't be created on thread's stack since this thread
  141|       |    //   may be abandoned at any time after forking.
  142|       |    // * They can't created inside the constructor of SamplerCollector as well,
  143|       |    //   which results in deadlock.
  144|       |    if (s_cumulated_time_bvar == nullptr) {
  145|       |        s_cumulated_time_bvar =
  146|       |            new PassiveStatus<double>(get_cumulated_time, this);
  147|       |    }
  148|       |    if (s_sampling_thread_usage_bvar == nullptr) {
  149|       |        s_sampling_thread_usage_bvar =
  150|       |            new bvar::PerSecond<bvar::PassiveStatus<double> >(
  151|       |                    "bvar_sampler_collector_usage", s_cumulated_time_bvar, 10);
  152|       |    }
  153|       |#endif
  154|       |
  155|      2|    butil::LinkNode<Sampler> root;
  156|      2|    int consecutive_nosleep = 0;
  157|      4|    while (!_stop) {
  ------------------
  |  Branch (157:12): [True: 2, False: 2]
  ------------------
  158|      2|        int64_t abstime = butil::cpuwide_time_us();
  159|      2|        Sampler* s = this->reset();
  160|      2|        if (s) {
  ------------------
  |  Branch (160:13): [True: 2, False: 0]
  ------------------
  161|      2|            s->InsertBeforeAsList(&root);
  162|      2|        }
  163|     10|        for (butil::LinkNode<Sampler>* p = root.next(); p != &root;) {
  ------------------
  |  Branch (163:57): [True: 8, False: 2]
  ------------------
  164|       |            // We may remove p from the list, save next first.
  165|      8|            butil::LinkNode<Sampler>* saved_next = p->next();
  166|      8|            Sampler* s = p->value();
  167|      8|            s->_mutex.lock();
  168|      8|            if (!s->_used) {
  ------------------
  |  Branch (168:17): [True: 0, False: 8]
  ------------------
  169|      0|                s->_mutex.unlock();
  170|      0|                p->RemoveFromList();
  171|      0|                delete s;
  172|      8|            } else {
  173|      8|                s->take_sample();
  174|      8|                s->_mutex.unlock();
  175|      8|            }
  176|      8|            p = saved_next;
  177|      8|        }
  178|      2|        bool slept = false;
  179|      2|        int64_t now = butil::cpuwide_time_us();
  180|      2|        _cumulated_time_us += now - abstime;
  181|      2|        abstime += 1000000L;
  182|      4|        while (abstime > now) {
  ------------------
  |  Branch (182:16): [True: 2, False: 2]
  ------------------
  183|      2|            ::usleep(abstime - now);
  184|      2|            slept = true;
  185|      2|            now = butil::cpuwide_time_us();
  186|      2|        }
  187|      2|        if (slept) {
  ------------------
  |  Branch (187:13): [True: 0, False: 2]
  ------------------
  188|      0|            consecutive_nosleep = 0;
  189|      2|        } else {            
  190|      2|            if (++consecutive_nosleep >= WARN_NOSLEEP_THRESHOLD) {
  ------------------
  |  Branch (190:17): [True: 0, False: 2]
  ------------------
  191|      0|                consecutive_nosleep = 0;
  192|      0|                LOG(WARNING) << "bvar is busy at sampling for "
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|      0|                             << WARN_NOSLEEP_THRESHOLD << " seconds!";
  194|      0|            }
  195|      2|        }
  196|      2|    }
  197|      2|}
_ZN4bvar6detail7SamplerC2Ev:
  199|      8|Sampler::Sampler() : _used(true) {}
_ZN4bvar6detail7Sampler8scheduleEv:
  205|      8|void Sampler::schedule() {
  206|       |    // since the SamplerCollector is initialized before the program starts
  207|       |    // flags will not take effect if used in the SamplerCollector constructor
  208|      8|    if (FLAGS_bvar_enable_sampling) {
  ------------------
  |  Branch (208:9): [True: 8, False: 0]
  ------------------
  209|      8|        *butil::get_leaky_singleton<SamplerCollector>() << this;
  210|      8|    }
  211|      8|}
_ZN4bvar6detail16SamplerCollectorC2Ev:
   66|      2|        : _created(false)
   67|      2|        , _stop(false)
   68|      2|        , _cumulated_time_us(0) {
   69|      2|        create_sampling_thread();
   70|      2|    }
_ZN4bvar6detail16SamplerCollector22create_sampling_threadEv:
   91|      2|    void create_sampling_thread() {
   92|      2|        const int rc = pthread_create(&_tid, nullptr, sampling_thread, this);
   93|      2|        if (rc != 0) {
  ------------------
  |  Branch (93:13): [True: 0, False: 2]
  ------------------
   94|      0|            LOG(FATAL) << "Fail to create sampling_thread, " << berror(rc);
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|      2|        } else {
   96|      2|            _created = true;
   97|      2|            if (!registered_atfork) {
  ------------------
  |  Branch (97:17): [True: 2, False: 0]
  ------------------
   98|      2|                registered_atfork = true;
   99|      2|                pthread_atfork(nullptr, nullptr, child_callback_atfork);
  100|      2|            }
  101|      2|        }
  102|      2|    }
_ZN4bvar6detail16SamplerCollector15sampling_threadEPv:
  111|      2|    static void* sampling_thread(void* arg) {
  112|      2|        butil::PlatformThread::SetNameSimple("bvar_sampler");
  113|      2|        static_cast<SamplerCollector*>(arg)->run();
  114|      2|        return nullptr;
  115|      2|    }
_ZNK4bvar6detail14CombineSamplerclERPNS0_7SamplerES3_:
   36|     10|    void operator()(Sampler* & s1, Sampler* s2) const {
   37|     10|        if (s2 == nullptr) {
  ------------------
  |  Branch (37:13): [True: 0, False: 10]
  ------------------
   38|      0|            return;
   39|      0|        }
   40|     10|        if (s1 == nullptr) {
  ------------------
  |  Branch (40:13): [True: 4, False: 6]
  ------------------
   41|      4|            s1 = s2;
   42|      4|            return;
   43|      4|        }
   44|      6|        s1->InsertBeforeAsList(s2);
   45|      6|    }

_ZN4bvar6detail6SeriesIlNS0_5AddToIlEEEC2ERKS3_:
  218|      2|    explicit Series(const Op& op) : Base(op) {}
_ZN4bvar6detail10SeriesBaseIlNS0_5AddToIlEEEC2ERKS3_:
  103|      2|        : _op(op)
  104|      2|        , _nsecond(0)
  105|      2|        , _nminute(0)
  106|      2|        , _nhour(0)
  107|      2|        , _nday(0) {
  108|      2|        pthread_mutex_init(&_mutex, nullptr);
  109|      2|    }
_ZN4bvar6detail10SeriesBaseIlNS0_5AddToIlEEE4DataC2Ev:
  127|      2|        Data() {
  128|       |            // is_pod does not work for gcc 3.4
  129|      2|            if (butil::is_integral<T>::value ||
  ------------------
  |  Branch (129:17): [True: 2, Folded]
  ------------------
  130|      2|                butil::is_floating_point<T>::value) {
  ------------------
  |  Branch (130:17): [Folded, False: 0]
  ------------------
  131|      2|                memset(static_cast<void*>(_array), 0, sizeof(_array));
  132|      2|            }
  133|      2|        }
_ZN4bvar6detail10SeriesBaseIlNS0_5AddToIlEEE6appendERKl:
  114|      2|    void append(const T& value) {
  115|      2|        BAIDU_SCOPED_LOCK(_mutex);
  ------------------
  |  |   47|      2|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      2|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      2|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      2|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|      2|        return append_second(value, _op);
  117|      2|    }
_ZN4bvar6detail10SeriesBaseIlNS0_5AddToIlEEE13append_secondERKlRKS3_:
  161|      2|void SeriesBase<T, Op>::append_second(const T& value, const Op& op) {
  162|      2|    _data.second(_nsecond) = value;
  163|      2|    ++_nsecond;
  164|      2|    if (_nsecond >= 60) {
  ------------------
  |  Branch (164:9): [True: 0, False: 2]
  ------------------
  165|      0|        _nsecond = 0;
  166|      0|        T tmp = _data.second(0);
  167|      0|        for (int i = 1; i < 60; ++i) {
  ------------------
  |  Branch (167:25): [True: 0, False: 0]
  ------------------
  168|      0|            call_op_returning_void(op, tmp, _data.second(i));
  169|      0|        }
  170|      0|        DivideOnAddition<T, Op>::inplace_divide(tmp, op, 60);
  171|      0|        append_minute(tmp, op);
  172|      0|    }
  173|      2|}
_ZN4bvar6detail10SeriesBaseIlNS0_5AddToIlEEE4Data6secondEi:
  135|      2|        T& second(int index) { return _array[index]; }
_ZN4bvar6detail6SeriesImNS0_5AddToImEEEC2ERKS3_:
  218|      4|    explicit Series(const Op& op) : Base(op) {}
_ZN4bvar6detail10SeriesBaseImNS0_5AddToImEEEC2ERKS3_:
  103|      4|        : _op(op)
  104|      4|        , _nsecond(0)
  105|      4|        , _nminute(0)
  106|      4|        , _nhour(0)
  107|      4|        , _nday(0) {
  108|      4|        pthread_mutex_init(&_mutex, nullptr);
  109|      4|    }
_ZN4bvar6detail10SeriesBaseImNS0_5AddToImEEE4DataC2Ev:
  127|      4|        Data() {
  128|       |            // is_pod does not work for gcc 3.4
  129|      4|            if (butil::is_integral<T>::value ||
  ------------------
  |  Branch (129:17): [True: 4, Folded]
  ------------------
  130|      4|                butil::is_floating_point<T>::value) {
  ------------------
  |  Branch (130:17): [Folded, False: 0]
  ------------------
  131|      4|                memset(static_cast<void*>(_array), 0, sizeof(_array));
  132|      4|            }
  133|      4|        }
_ZN4bvar6detail10SeriesBaseImNS0_5AddToImEEE6appendERKm:
  114|      4|    void append(const T& value) {
  115|      4|        BAIDU_SCOPED_LOCK(_mutex);
  ------------------
  |  |   47|      4|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      4|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      4|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      4|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|      4|        return append_second(value, _op);
  117|      4|    }
_ZN4bvar6detail10SeriesBaseImNS0_5AddToImEEE13append_secondERKmRKS3_:
  161|      4|void SeriesBase<T, Op>::append_second(const T& value, const Op& op) {
  162|      4|    _data.second(_nsecond) = value;
  163|      4|    ++_nsecond;
  164|      4|    if (_nsecond >= 60) {
  ------------------
  |  Branch (164:9): [True: 0, False: 4]
  ------------------
  165|      0|        _nsecond = 0;
  166|      0|        T tmp = _data.second(0);
  167|      0|        for (int i = 1; i < 60; ++i) {
  ------------------
  |  Branch (167:25): [True: 0, False: 0]
  ------------------
  168|      0|            call_op_returning_void(op, tmp, _data.second(i));
  169|      0|        }
  170|      0|        DivideOnAddition<T, Op>::inplace_divide(tmp, op, 60);
  171|      0|        append_minute(tmp, op);
  172|      0|    }
  173|      4|}
_ZN4bvar6detail10SeriesBaseImNS0_5AddToImEEE4Data6secondEi:
  135|      4|        T& second(int index) { return _array[index]; }
_ZN4bvar6detail6SeriesIiNS0_5AddToIiEEEC2ERKS3_:
  218|      2|    explicit Series(const Op& op) : Base(op) {}
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEEC2ERKS3_:
  103|      2|        : _op(op)
  104|      2|        , _nsecond(0)
  105|      2|        , _nminute(0)
  106|      2|        , _nhour(0)
  107|      2|        , _nday(0) {
  108|      2|        pthread_mutex_init(&_mutex, nullptr);
  109|      2|    }
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE4DataC2Ev:
  127|      2|        Data() {
  128|       |            // is_pod does not work for gcc 3.4
  129|      2|            if (butil::is_integral<T>::value ||
  ------------------
  |  Branch (129:17): [True: 2, Folded]
  ------------------
  130|      2|                butil::is_floating_point<T>::value) {
  ------------------
  |  Branch (130:17): [Folded, False: 0]
  ------------------
  131|      2|                memset(static_cast<void*>(_array), 0, sizeof(_array));
  132|      2|            }
  133|      2|        }
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE6appendERKi:
  114|      2|    void append(const T& value) {
  115|      2|        BAIDU_SCOPED_LOCK(_mutex);
  ------------------
  |  |   47|      2|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      2|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      2|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      2|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|      2|        return append_second(value, _op);
  117|      2|    }
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE13append_secondERKiRKS3_:
  161|      2|void SeriesBase<T, Op>::append_second(const T& value, const Op& op) {
  162|      2|    _data.second(_nsecond) = value;
  163|      2|    ++_nsecond;
  164|      2|    if (_nsecond >= 60) {
  ------------------
  |  Branch (164:9): [True: 0, False: 2]
  ------------------
  165|      0|        _nsecond = 0;
  166|      0|        T tmp = _data.second(0);
  167|      0|        for (int i = 1; i < 60; ++i) {
  ------------------
  |  Branch (167:25): [True: 0, False: 0]
  ------------------
  168|      0|            call_op_returning_void(op, tmp, _data.second(i));
  169|      0|        }
  170|      0|        DivideOnAddition<T, Op>::inplace_divide(tmp, op, 60);
  171|      0|        append_minute(tmp, op);
  172|      0|    }
  173|      2|}
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE4Data6secondEi:
  135|      2|        T& second(int index) { return _array[index]; }

_ZNK4bvar13PassiveStatusIlE9get_valueEv:
  139|      2|    Tp get_value() const {
  140|      2|        return (_getfn ? _getfn(_arg) : Tp());
  ------------------
  |  Branch (140:17): [True: 2, False: 0]
  ------------------
  141|      2|    }
_ZN4bvar13PassiveStatusIlE11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESC_NS_13DisplayFilterE:
  172|      2|                    DisplayFilter display_filter) override {
  173|      2|        const int rc = Variable::expose_impl(prefix, name, display_filter);
  174|      2|        if (ADDITIVE &&
  ------------------
  |  Branch (174:13): [True: 2, Folded]
  ------------------
  175|      2|            rc == 0 &&
  ------------------
  |  Branch (175:13): [True: 2, False: 0]
  ------------------
  176|      2|            _series_sampler == nullptr &&
  ------------------
  |  Branch (176:13): [True: 2, False: 0]
  ------------------
  177|      2|            FLAGS_save_series) {
  ------------------
  |  Branch (177:13): [True: 2, False: 0]
  ------------------
  178|      2|            _series_sampler = new SeriesSampler(this);
  179|      2|            _series_sampler->schedule();
  180|      2|        }
  181|      2|        return rc;
  182|      2|    }
_ZN4bvar13PassiveStatusIlE13SeriesSamplerC2EPS1_:
   58|      2|            : _owner(owner), _vector_names(nullptr), _series(Op()) {}
_ZN4bvar13PassiveStatusIlE13SeriesSampler11take_sampleEv:
   62|      2|        void take_sample() override { _series.append(_owner->get_value()); }
_ZN4bvar13PassiveStatusIlEC2ERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPFlPvESD_:
   81|      2|        : _getfn(getfn)
   82|      2|        , _arg(arg)
   83|      2|        , _sampler(nullptr)
   84|      2|        , _series_sampler(nullptr) {
   85|      2|        expose(name);
   86|      2|    }
_ZNK4bvar13PassiveStatusImE9get_valueEv:
  139|      4|    Tp get_value() const {
  140|      4|        return (_getfn ? _getfn(_arg) : Tp());
  ------------------
  |  Branch (140:17): [True: 4, False: 0]
  ------------------
  141|      4|    }
_ZN4bvar13PassiveStatusImE11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESC_NS_13DisplayFilterE:
  172|      4|                    DisplayFilter display_filter) override {
  173|      4|        const int rc = Variable::expose_impl(prefix, name, display_filter);
  174|      4|        if (ADDITIVE &&
  ------------------
  |  Branch (174:13): [True: 4, Folded]
  ------------------
  175|      4|            rc == 0 &&
  ------------------
  |  Branch (175:13): [True: 4, False: 0]
  ------------------
  176|      4|            _series_sampler == nullptr &&
  ------------------
  |  Branch (176:13): [True: 4, False: 0]
  ------------------
  177|      4|            FLAGS_save_series) {
  ------------------
  |  Branch (177:13): [True: 4, False: 0]
  ------------------
  178|      4|            _series_sampler = new SeriesSampler(this);
  179|      4|            _series_sampler->schedule();
  180|      4|        }
  181|      4|        return rc;
  182|      4|    }
_ZN4bvar13PassiveStatusImE13SeriesSamplerC2EPS1_:
   58|      4|            : _owner(owner), _vector_names(nullptr), _series(Op()) {}
_ZN4bvar13PassiveStatusImE13SeriesSampler11take_sampleEv:
   62|      4|        void take_sample() override { _series.append(_owner->get_value()); }
_ZN4bvar13PassiveStatusIiEC2ERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPFiPvESD_:
   81|      2|        : _getfn(getfn)
   82|      2|        , _arg(arg)
   83|      2|        , _sampler(nullptr)
   84|      2|        , _series_sampler(nullptr) {
   85|      2|        expose(name);
   86|      2|    }
_ZNK4bvar13PassiveStatusIiE9get_valueEv:
  139|      2|    Tp get_value() const {
  140|      2|        return (_getfn ? _getfn(_arg) : Tp());
  ------------------
  |  Branch (140:17): [True: 2, False: 0]
  ------------------
  141|      2|    }
_ZN4bvar13PassiveStatusIiE11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESC_NS_13DisplayFilterE:
  172|      2|                    DisplayFilter display_filter) override {
  173|      2|        const int rc = Variable::expose_impl(prefix, name, display_filter);
  174|      2|        if (ADDITIVE &&
  ------------------
  |  Branch (174:13): [True: 2, Folded]
  ------------------
  175|      2|            rc == 0 &&
  ------------------
  |  Branch (175:13): [True: 2, False: 0]
  ------------------
  176|      2|            _series_sampler == nullptr &&
  ------------------
  |  Branch (176:13): [True: 2, False: 0]
  ------------------
  177|      2|            FLAGS_save_series) {
  ------------------
  |  Branch (177:13): [True: 2, False: 0]
  ------------------
  178|      2|            _series_sampler = new SeriesSampler(this);
  179|      2|            _series_sampler->schedule();
  180|      2|        }
  181|      2|        return rc;
  182|      2|    }
_ZN4bvar13PassiveStatusIiE13SeriesSamplerC2EPS1_:
   58|      2|            : _owner(owner), _vector_names(nullptr), _series(Op()) {}
_ZN4bvar13PassiveStatusIiE13SeriesSampler11take_sampleEv:
   62|      2|        void take_sample() override { _series.append(_owner->get_value()); }
_ZN4bvar13PassiveStatusImEC2ERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPFmPvESD_:
   81|      4|        : _getfn(getfn)
   82|      4|        , _arg(arg)
   83|      4|        , _sampler(nullptr)
   84|      4|        , _series_sampler(nullptr) {
   85|      4|        expose(name);
   86|      4|    }

_ZN4bvar7ReducerIPNS_6detail7SamplerENS1_14CombineSamplerENS1_6VoidOpEEC2ERKS3_RKS4_RKS5_:
  204|      2|        : _combiner(std::make_shared<combiner_type>(identity, identity, op))
  205|      2|        , _sampler(nullptr) , _series_sampler(nullptr) , _inv_op(inv_op) {}
_ZN4bvar7ReducerIPNS_6detail7SamplerENS1_14CombineSamplerENS1_6VoidOpEE5resetEv:
  238|      2|    T reset() { return _combiner->reset_all_agents(); }
_ZN4bvar7ReducerIPNS_6detail7SamplerENS1_14CombineSamplerENS1_6VoidOpEElsERKS3_:
  302|      8|    typename butil::add_cr_non_integral<T>::type value) {
  303|       |    // It's wait-free for most time
  304|      8|    agent_type* agent = _combiner->get_or_create_tls_agent();
  305|      8|    if (__builtin_expect(!agent, 0)) {
  ------------------
  |  Branch (305:9): [True: 0, False: 8]
  ------------------
  306|      0|        LOG(FATAL) << "Fail to create agent";
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  307|      0|        return *this;
  308|      0|    }
  309|      8|    agent->element.modify(_combiner->op(), value);
  310|      8|    return *this;
  311|      8|}

_ZN4bvar8Variable11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESB_NS_13DisplayFilterE:
  131|      8|                          DisplayFilter display_filter) {
  132|      8|    if (name.empty()) {
  ------------------
  |  Branch (132:9): [True: 0, False: 8]
  ------------------
  133|      0|        LOG(ERROR) << "Parameter[name] is empty";
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  134|      0|        return -1;
  135|      0|    }
  136|       |    // NOTE: It's impossible to atomically erase from a submap and insert into
  137|       |    // another submap without a global lock. When the to-be-exposed name
  138|       |    // already exists, there's a chance that we can't insert back previous
  139|       |    // name. But it should be fine generally because users are unlikely to
  140|       |    // expose a variable more than once and calls to expose() are unlikely
  141|       |    // to contend heavily.
  142|       |
  143|       |    // remove previous pointer from the map if needed.
  144|      8|    hide();
  145|       |
  146|       |    // Build the name.
  147|      8|    _name.clear();
  148|      8|    _name.reserve((prefix.size() + name.size()) * 5 / 4);
  149|      8|    if (!prefix.empty()) {
  ------------------
  |  Branch (149:9): [True: 0, False: 8]
  ------------------
  150|      0|        to_underscored_name(&_name, prefix);
  151|      0|        if (!_name.empty() && butil::back_char(_name) != '_') {
  ------------------
  |  Branch (151:13): [True: 0, False: 0]
  |  Branch (151:31): [True: 0, False: 0]
  ------------------
  152|      0|            _name.push_back('_');
  153|      0|        }
  154|      0|    }
  155|      8|    to_underscored_name(&_name, name);
  156|       |    
  157|      8|    VarMapWithLock& m = get_var_map(_name);
  158|      8|    {
  159|      8|        BAIDU_SCOPED_LOCK(m.mutex);
  ------------------
  |  |   47|      8|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      8|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      8|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      8|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|      8|        VarEntry* entry = m.seek(_name);
  161|      8|        if (entry == nullptr) {
  ------------------
  |  Branch (161:13): [True: 8, False: 0]
  ------------------
  162|      8|            entry = &m[_name];
  163|      8|            entry->var = this;
  164|      8|            entry->display_filter = display_filter;
  165|      8|            return 0;
  166|      8|        }
  167|      8|    }
  168|      0|    RELEASE_ASSERT_VERBOSE(!FLAGS_bvar_abort_on_same_name,
  ------------------
  |  |  489|      0|    do {                                                                            \
  |  |  490|      0|        if (!(condition)) {                                                         \
  |  |  ------------------
  |  |  |  Branch (490:13): [True: 0, False: 0]
  |  |  ------------------
  |  |  491|      0|            ASSERT_LOG("Assert failure: " #condition ". " #fmt, ## __VA_ARGS__);    \
  |  |  ------------------
  |  |  |  |  469|      0|    do {                                                                \
  |  |  |  |  470|      0|        std::string log = butil::string_printf(fmt, ## __VA_ARGS__);    \
  |  |  |  |  471|      0|        LOG(FATAL) << log;                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  472|      0|    } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:14): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  492|      0|            ::abort();                                                              \
  |  |  493|      0|        }                                                                           \
  |  |  494|      0|    } while (false)
  |  |  ------------------
  |  |  |  Branch (494:14): [Folded, False: 0]
  |  |  ------------------
  ------------------
  169|      0|                           "Abort due to name conflict");
  170|      0|    if (!s_bvar_may_abort) {
  ------------------
  |  Branch (170:9): [True: 0, False: 0]
  ------------------
  171|       |        // Mark name conflict occurs, If this conflict happens before
  172|       |        // initialization of bvar_abort_on_same_name, the validator will
  173|       |        // abort the program if needed.
  174|      0|        s_bvar_may_abort = true;
  175|      0|    }
  176|       |        
  177|      0|    LOG(ERROR) << "Already exposed `" << _name << "' whose value is `"
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  178|      0|               << describe_exposed(_name) << '\'';
  179|      0|    _name.clear();
  180|      0|    return -1;
  181|      0|}
_ZN4bvar8Variable4hideEv:
  187|      8|bool Variable::hide() {
  188|      8|    if (_name.empty()) {
  ------------------
  |  Branch (188:9): [True: 8, False: 0]
  ------------------
  189|      8|        return false;
  190|      8|    }
  191|      0|    VarMapWithLock& m = get_var_map(_name);
  192|      0|    BAIDU_SCOPED_LOCK(m.mutex);
  ------------------
  |  |   47|      0|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      0|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      0|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      0|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|      0|    VarEntry* entry = m.seek(_name);
  194|      0|    if (entry) {
  ------------------
  |  Branch (194:9): [True: 0, False: 0]
  ------------------
  195|      0|        CHECK_EQ(1UL, m.erase(_name));
  ------------------
  |  |  692|      0|#define CHECK_EQ(val1, val2) BAIDU_CHECK_OP(EQ, ==, val1, val2)
  |  |  ------------------
  |  |  |  |  630|      0|    if (std::string* _result =                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (630:22): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  631|      0|        ::logging::Check##name##Impl((val1), (val2),                    \
  |  |  |  |  632|      0|                                     #val1 " " #op " " #val2))          \
  |  |  |  |  633|      0|        ::logging::LogMessage(__FILE__, __LINE__, __func__, _result).stream().SetCheck()
  |  |  ------------------
  ------------------
  196|      0|    } else {
  197|      0|        CHECK(false) << "`" << _name << "' must exist";
  ------------------
  |  |  617|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(FATAL).SetCheck(), !(condition))     \
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  618|      0|    << "Check failed: " #condition ". "
  ------------------
  198|      0|    }
  199|      0|    _name.clear();
  200|      0|    return true;
  201|      8|}
_ZN4bvar19to_underscored_nameEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKN5butil16BasicStringPieceIS5_EE:
  942|      8|void to_underscored_name(std::string* name, const butil::StringPiece& src) {
  943|      8|    name->reserve(name->size() + src.size() + 8/*just guess*/);
  944|    170|    for (const char* p = src.data(); p != src.data() + src.size(); ++p) {
  ------------------
  |  Branch (944:38): [True: 162, False: 8]
  ------------------
  945|    162|        if (isalpha(*p)) {
  ------------------
  |  Branch (945:13): [True: 146, False: 16]
  ------------------
  946|    146|            if (*p < 'a') { // upper cases
  ------------------
  |  Branch (946:17): [True: 0, False: 146]
  ------------------
  947|      0|                if (p != src.data() && !isupper(p[-1]) &&
  ------------------
  |  Branch (947:21): [True: 0, False: 0]
  |  Branch (947:40): [True: 0, False: 0]
  ------------------
  948|      0|                    butil::back_char(*name) != '_') {
  ------------------
  |  Branch (948:21): [True: 0, False: 0]
  ------------------
  949|      0|                    name->push_back('_');
  950|      0|                }
  951|      0|                name->push_back(*p - 'A' + 'a');
  952|    146|            } else {
  953|    146|                name->push_back(*p);
  954|    146|            }
  955|    146|        } else if (isdigit(*p)) {
  ------------------
  |  Branch (955:20): [True: 0, False: 16]
  ------------------
  956|      0|            name->push_back(*p);
  957|     16|        } else if (name->empty() || butil::back_char(*name) != '_') {
  ------------------
  |  Branch (957:20): [True: 0, False: 16]
  |  Branch (957:37): [True: 16, False: 0]
  ------------------
  958|     16|            name->push_back('_');
  959|     16|        }
  960|    162|    }
  961|      8|}
_ZN4bvar11get_var_mapERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  119|      8|inline VarMapWithLock& get_var_map(const std::string& name) {
  120|      8|    VarMapWithLock& m = get_var_maps()[sub_map_index(name)];
  121|      8|    return m;
  122|      8|}
_ZN4bvar13sub_map_indexERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  102|      8|inline size_t sub_map_index(const std::string& str) {
  103|      8|    if (str.empty()) {
  ------------------
  |  Branch (103:9): [True: 0, False: 8]
  ------------------
  104|      0|        return 0;
  105|      0|    }
  106|      8|    size_t h = 0;
  107|       |    // we're assume that str is ended with '\0', which may not be in general
  108|    170|    for (const char* p  = str.c_str(); *p; ++p) {
  ------------------
  |  Branch (108:40): [True: 162, False: 8]
  ------------------
  109|    162|        h = h * 5 + *p;
  110|    162|    }
  111|      8|    return h & (SUB_MAP_COUNT - 1);
  112|      8|}
_ZN4bvar12get_var_mapsEv:
  114|      8|inline VarMapWithLock* get_var_maps() {
  115|      8|    pthread_once(&s_var_maps_once, init_var_maps);
  116|      8|    return s_var_maps;
  117|      8|}
variable.cpp:_ZN4bvarL13init_var_mapsEv:
   96|      2|static void init_var_maps() {
   97|       |    // It's probably slow to initialize all sub maps, but rpc often expose 
   98|       |    // variables before user. So this should not be an issue to users.
   99|      2|    s_var_maps = new VarMapWithLock[SUB_MAP_COUNT];
  100|      2|}
_ZN4bvar14VarMapWithLockC2Ev:
   78|     64|    VarMapWithLock() {
   79|     64|        if (init(1024) != 0) {
  ------------------
  |  Branch (79:13): [True: 0, False: 64]
  ------------------
   80|      0|            LOG(WARNING) << "Fail to init VarMap";
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   81|      0|        }
   82|       |
   83|     64|        pthread_mutexattr_t attr;
   84|     64|        pthread_mutexattr_init(&attr);
   85|     64|        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
   86|     64|        pthread_mutex_init(&mutex, &attr);
   87|     64|        pthread_mutexattr_destroy(&attr);
   88|     64|    }
_ZN4bvar8VarEntryC2Ev:
   67|      8|    VarEntry() : var(nullptr), display_filter(DISPLAY_ON_ALL) {}

_ZN4bvar8VariableC2Ev:
  120|     10|    Variable() {}
_ZN4bvar8Variable6exposeERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEENS_13DisplayFilterE:
  150|      8|               DisplayFilter display_filter = DISPLAY_ON_ALL) {
  151|      8|        return expose_impl(butil::StringPiece(), name, display_filter);
  152|      8|    }

_ZN7json2pb11decode_nameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS5_:
   83|  20.4k|bool decode_name(const std::string& content, std::string& decoded_content) {
   84|  20.4k|    const int pattern_length = 6;
   85|  20.4k|    int begin = 0;
   86|  20.4k|    int second = 0;
   87|  20.4k|    bool convert = false; 
   88|   117k|    for (std::string::const_iterator it = content.begin(); it < content.end(); ++it, ++second) {
  ------------------
  |  Branch (88:60): [True: 97.4k, False: 20.4k]
  ------------------
   89|  97.4k|        if (*it != '_') {
  ------------------
  |  Branch (89:13): [True: 97.4k, False: 0]
  ------------------
   90|  97.4k|            continue;
   91|  97.4k|        }
   92|      0|        int val = match_pattern(content, second);
   93|      0|        if (val != -1) { 
  ------------------
  |  Branch (93:13): [True: 0, False: 0]
  ------------------
   94|      0|            if (!convert) {
  ------------------
  |  Branch (94:17): [True: 0, False: 0]
  ------------------
   95|      0|                decoded_content.clear();
   96|      0|                decoded_content.reserve(content.size());
   97|      0|                convert = true;
   98|      0|            }
   99|      0|            decoded_content.append(content, begin, second - begin);
  100|      0|            decoded_content.push_back(static_cast<char>(val));
  101|      0|            second += pattern_length - 1;
  102|      0|            begin = second + 1;
  103|      0|            it += pattern_length - 1;
  104|      0|        }
  105|      0|    } 
  106|  20.4k|    if (!convert) {
  ------------------
  |  Branch (106:9): [True: 20.4k, False: 0]
  ------------------
  107|  20.4k|        return false;
  108|  20.4k|    } else {
  109|      0|        decoded_content.append(content, begin, second - begin);
  110|      0|        return true; 
  111|      0|    }
  112|  20.4k|} 

_ZN7json2pb14Json2PbOptionsC2Ev:
   75|  4.09k|    : base64_to_bytes(true)
   76|       |#endif
   77|  4.09k|    , array_to_single_repeated(false)
   78|  4.09k|    , allow_remaining_bytes_after_parsing(false) {
   79|  4.09k|}
_ZN7json2pb23JsonValueToProtoMessageERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPN6google8protobuf7MessageERKNS_14Json2PbOptionsEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi:
  539|  6.85k|                             int depth) {
  540|  6.85k|    if (depth > FLAGS_json2pb_max_recursion_depth) {
  ------------------
  |  Branch (540:9): [True: 0, False: 6.85k]
  ------------------
  541|      0|        J2PERROR_WITH_PB(message, err, "Exceeded maximum recursion depth");
  ------------------
  |  |   52|      0|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   53|      0|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 0, False: 0]
  |  |  ------------------
  |  |   54|      0|            perr->append(", ", 2);                                      \
  |  |   55|      0|        }                                                               \
  |  |   56|      0|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|      0|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 0, False: 0]
  |  |  ------------------
  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|      0|        }                                                               \
  |  |   61|      0|    } else { }
  ------------------
  542|      0|        return false;
  543|      0|    }
  544|  6.85k|    const google::protobuf::Descriptor* descriptor = message->GetDescriptor();
  545|  6.85k|    if (!json_value.IsObject() &&
  ------------------
  |  Branch (545:9): [True: 1.21k, False: 5.63k]
  ------------------
  546|  1.21k|        !(json_value.IsArray() && options.array_to_single_repeated && depth == 0)) {
  ------------------
  |  Branch (546:11): [True: 51, False: 1.16k]
  |  Branch (546:35): [True: 0, False: 51]
  |  Branch (546:71): [True: 0, False: 0]
  ------------------
  547|  1.21k|        J2PERROR_WITH_PB(message, err, "The input is not a json object");
  ------------------
  |  |   52|  1.21k|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 1.21k, False: 0]
  |  |  ------------------
  |  |   53|  1.21k|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 14, False: 1.20k]
  |  |  ------------------
  |  |   54|     14|            perr->append(", ", 2);                                      \
  |  |   55|     14|        }                                                               \
  |  |   56|  1.21k|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|  1.21k|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 1.21k, False: 0]
  |  |  ------------------
  |  |   58|  1.21k|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|  1.21k|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|  1.21k|        }                                                               \
  |  |   61|  1.21k|    } else { }
  ------------------
  548|  1.21k|        return false;
  549|  1.21k|    }
  550|       |
  551|  5.63k|    const google::protobuf::Reflection* reflection = message->GetReflection();
  552|       |    
  553|  5.63k|    std::vector<const google::protobuf::FieldDescriptor*> fields;
  554|  5.63k|    fields.reserve(64);
  555|  5.63k|    for (int i = 0; i < descriptor->extension_range_count(); ++i) {
  ------------------
  |  Branch (555:21): [True: 0, False: 5.63k]
  ------------------
  556|      0|        const google::protobuf::Descriptor::ExtensionRange*
  557|      0|            ext_range = descriptor->extension_range(i);
  558|      0|#if GOOGLE_PROTOBUF_VERSION < 4024000
  559|      0|        for (int tag_number = ext_range->start; tag_number < ext_range->end; ++tag_number)
  ------------------
  |  Branch (559:49): [True: 0, False: 0]
  ------------------
  560|       |#else
  561|       |        for (int tag_number = ext_range->start_number(); tag_number < ext_range->end_number(); ++tag_number)
  562|       |#endif
  563|      0|        {
  564|      0|            const google::protobuf::FieldDescriptor* field =
  565|      0|                reflection->FindKnownExtensionByNumber(tag_number);
  566|      0|            if (field) {
  ------------------
  |  Branch (566:17): [True: 0, False: 0]
  ------------------
  567|      0|                fields.push_back(field);
  568|      0|            }
  569|      0|        }
  570|      0|    }
  571|  28.9k|    for (int i = 0; i < descriptor->field_count(); ++i) {
  ------------------
  |  Branch (571:21): [True: 23.2k, False: 5.63k]
  ------------------
  572|  23.2k|        fields.push_back(descriptor->field(i));
  573|  23.2k|    }
  574|       |
  575|  5.63k|    if (json_value.IsArray()) {
  ------------------
  |  Branch (575:9): [True: 0, False: 5.63k]
  ------------------
  576|      0|        if (fields.size() == 1 && fields.front()->is_repeated()) {
  ------------------
  |  Branch (576:13): [True: 0, False: 0]
  |  Branch (576:35): [True: 0, False: 0]
  ------------------
  577|      0|            return JsonValueToProtoField(json_value, fields.front(), message, options, err, depth);
  578|      0|        }
  579|       |
  580|      0|        J2PERROR_WITH_PB(message, err, "the input json can't be array here");
  ------------------
  |  |   52|      0|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   53|      0|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 0, False: 0]
  |  |  ------------------
  |  |   54|      0|            perr->append(", ", 2);                                      \
  |  |   55|      0|        }                                                               \
  |  |   56|      0|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|      0|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 0, False: 0]
  |  |  ------------------
  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|      0|        }                                                               \
  |  |   61|      0|    } else { }
  ------------------
  581|      0|        return false;
  582|      0|    }
  583|       |
  584|  5.63k|    std::string field_name_str_temp; 
  585|  5.63k|    const BUTIL_RAPIDJSON_NAMESPACE::Value* value_ptr = NULL;
  586|  24.6k|    for (size_t i = 0; i < fields.size(); ++i) {
  ------------------
  |  Branch (586:24): [True: 20.4k, False: 4.22k]
  ------------------
  587|  20.4k|        const google::protobuf::FieldDescriptor* field = fields[i];
  588|       |        
  589|  20.4k|        const std::string orig_name = butil::EnsureString(field->name());
  590|  20.4k|        bool res = decode_name(orig_name, field_name_str_temp); 
  591|  20.4k|        const std::string& field_name_str = (res ? field_name_str_temp : orig_name);
  ------------------
  |  Branch (591:46): [True: 0, False: 20.4k]
  ------------------
  592|       |
  593|  20.4k|#ifndef RAPIDJSON_VERSION_0_1
  594|  20.4k|        BUTIL_RAPIDJSON_NAMESPACE::Value::ConstMemberIterator member =
  ------------------
  |  |  120|  20.4k|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  595|  20.4k|                json_value.FindMember(field_name_str.data());
  596|  20.4k|        if (member == json_value.MemberEnd()) {
  ------------------
  |  Branch (596:13): [True: 10.7k, False: 9.70k]
  ------------------
  597|  10.7k|            if (field->is_required()) {
  ------------------
  |  Branch (597:17): [True: 663, False: 10.0k]
  ------------------
  598|    663|                J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  ------------------
  |  |   49|    663|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|    663|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 663, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|    663|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 218, False: 445]
  |  |  |  |  ------------------
  |  |  |  |   54|    218|            perr->append(", ", 2);                                      \
  |  |  |  |   55|    218|        }                                                               \
  |  |  |  |   56|    663|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|    663|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 663]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|    663|    } else { }
  |  |  ------------------
  ------------------
  599|    663|                return false;
  600|    663|            }
  601|  10.0k|            continue; 
  602|  10.7k|        }
  603|  9.70k|        value_ptr = &(member->value);
  604|       |#else 
  605|       |        const BUTIL_RAPIDJSON_NAMESPACE::Value::Member* member =
  606|       |                json_value.FindMember(field_name_str.data());
  607|       |        if (member == NULL) {
  608|       |            if (field->is_required()) {
  609|       |                J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  610|       |                return false;
  611|       |            }
  612|       |            continue; 
  613|       |        }
  614|       |        value_ptr = &(member->value);
  615|       |#endif
  616|       |
  617|  9.70k|        if (IsProtobufMap(field) && value_ptr->IsObject()) {
  ------------------
  |  Branch (617:13): [True: 0, False: 9.70k]
  |  Branch (617:37): [True: 0, False: 0]
  ------------------
  618|       |            // Try to parse json like {"key":value, ...} into protobuf map
  619|      0|            if (!JsonMapToProtoMap(*value_ptr, field, message, options, err, depth)) {
  ------------------
  |  Branch (619:17): [True: 0, False: 0]
  ------------------
  620|      0|                return false;
  621|      0|            }
  622|  9.70k|        } else {
  623|  9.70k|            if (!JsonValueToProtoField(*value_ptr, field, message, options, err, depth)) {
  ------------------
  |  Branch (623:17): [True: 752, False: 8.94k]
  ------------------
  624|    752|                return false;
  625|    752|            }
  626|  9.70k|        }
  627|  9.70k|    }
  628|  4.22k|    return true;
  629|  5.63k|}
_ZN7json2pb18JsonToProtoMessageERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN6google8protobuf7MessageEPS5_:
  712|  4.09k|                        std::string* error) {
  713|  4.09k|    return JsonToProtoMessageInline(json_string, message, Json2PbOptions(), error, nullptr);
  714|  4.09k|}
json_to_pb.cpp:_ZN7json2pbL21JsonValueToProtoFieldERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPKN6google8protobuf15FieldDescriptorEPNSC_7MessageERKNS_14Json2PbOptionsEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi:
  326|  9.70k|                                  int depth) {
  327|  9.70k|    if (value.IsNull()) {
  ------------------
  |  Branch (327:9): [True: 145, False: 9.55k]
  ------------------
  328|    145|        if (field->is_required()) {
  ------------------
  |  Branch (328:13): [True: 18, False: 127]
  ------------------
  329|     18|            J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  ------------------
  |  |   49|     18|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|     18|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 18, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|     18|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 14, False: 4]
  |  |  |  |  ------------------
  |  |  |  |   54|     14|            perr->append(", ", 2);                                      \
  |  |  |  |   55|     14|        }                                                               \
  |  |  |  |   56|     18|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|     18|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 18]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|     18|    } else { }
  |  |  ------------------
  ------------------
  330|     18|            return false;
  331|     18|        }
  332|    127|        return true;
  333|    145|    }
  334|       |        
  335|  9.55k|    if (field->is_repeated()) {
  ------------------
  |  Branch (335:9): [True: 652, False: 8.90k]
  ------------------
  336|    652|        if (!value.IsArray()) {
  ------------------
  |  Branch (336:13): [True: 23, False: 629]
  ------------------
  337|     23|            J2PERROR(err, "Invalid value for repeated field: %s",
  ------------------
  |  |   49|     23|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|     23|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 23, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|     23|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 11, False: 12]
  |  |  |  |  ------------------
  |  |  |  |   54|     11|            perr->append(", ", 2);                                      \
  |  |  |  |   55|     11|        }                                                               \
  |  |  |  |   56|     23|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|     23|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 23]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|     23|    } else { }
  |  |  ------------------
  ------------------
  338|     23|                     butil::EnsureString(field->full_name()).c_str());
  339|     23|            return false;
  340|     23|        }
  341|    652|    } 
  342|       |
  343|  9.53k|    const google::protobuf::Reflection* reflection = message->GetReflection();
  344|  9.53k|    switch (field->cpp_type()) {
  ------------------
  |  Branch (344:13): [True: 9.53k, False: 0]
  ------------------
  345|      0|#define CASE_FIELD_TYPE(cpptype, method, jsontype)                      \
  346|      0|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  347|      0|            if (field->is_repeated()) {                                 \
  348|      0|                const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();          \
  349|      0|                for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) { \
  350|      0|                    const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];       \
  351|      0|                    if (TYPE_MATCH == J2PCHECKTYPE(item, cpptype, jsontype)) { \
  352|      0|                        reflection->Add##method(message, field, item.Get##jsontype()); \
  353|      0|                    }                                                   \
  354|      0|                }                                                       \
  355|      0|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  356|      0|                reflection->Set##method(message, field, value.Get##jsontype()); \
  357|      0|            }                                                           \
  358|      0|            break;                                                      \
  359|      0|        }                                                               \
  360|      0|          
  361|     25|        CASE_FIELD_TYPE(INT32,  Int32,  Int);
  ------------------
  |  |  346|     25|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 25, False: 9.50k]
  |  |  ------------------
  |  |  347|     25|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 25, False: 0]
  |  |  ------------------
  |  |  348|     25|                const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();          \
  |  |  349|    420|                for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) { \
  |  |  ------------------
  |  |  |  |  120|     25|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  |  |  ------------------
  |  |  |  Branch (349:69): [True: 395, False: 25]
  |  |  ------------------
  |  |  350|    395|                    const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];       \
  |  |  351|    395|                    if (TYPE_MATCH == J2PCHECKTYPE(item, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|    395|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|    395|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|    395|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 8, False: 387]
  |  |  |  |  ------------------
  |  |  |  |  312|      8|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|      8|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 8, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|      8|                    return false;                                   \
  |  |  |  |  315|      8|                }                                                   \
  |  |  |  |  316|      8|            }                                                       \
  |  |  |  |  317|    395|            match_type;                                             \
  |  |  |  |  318|    387|        })
  |  |  ------------------
  |  |  |  Branch (351:25): [True: 387, False: 8]
  |  |  ------------------
  |  |  352|    387|                        reflection->Add##method(message, field, item.Get##jsontype()); \
  |  |  353|    387|                    }                                                   \
  |  |  354|    395|                }                                                       \
  |  |  355|     25|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|      0|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|      0|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|      0|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  312|      0|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|      0|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|      0|                    return false;                                   \
  |  |  |  |  315|      0|                }                                                   \
  |  |  |  |  316|      0|            }                                                       \
  |  |  |  |  317|      0|            match_type;                                             \
  |  |  |  |  318|      0|        })
  |  |  ------------------
  |  |  |  Branch (355:24): [True: 0, False: 0]
  |  |  ------------------
  |  |  356|      0|                reflection->Set##method(message, field, value.Get##jsontype()); \
  |  |  357|      0|            }                                                           \
  |  |  358|     25|            break;                                                      \
  |  |  359|     25|        }                                                               \
  ------------------
  362|    144|        CASE_FIELD_TYPE(UINT32, UInt32, Uint);
  ------------------
  |  |  346|    144|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 144, False: 9.38k]
  |  |  ------------------
  |  |  347|    144|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 0, False: 144]
  |  |  ------------------
  |  |  348|      0|                const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();          \
  |  |  349|      0|                for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) { \
  |  |  ------------------
  |  |  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  |  |  ------------------
  |  |  |  Branch (349:69): [True: 0, False: 0]
  |  |  ------------------
  |  |  350|      0|                    const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];       \
  |  |  351|      0|                    if (TYPE_MATCH == J2PCHECKTYPE(item, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|      0|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|      0|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|      0|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  312|      0|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|      0|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|      0|                    return false;                                   \
  |  |  |  |  315|      0|                }                                                   \
  |  |  |  |  316|      0|            }                                                       \
  |  |  |  |  317|      0|            match_type;                                             \
  |  |  |  |  318|      0|        })
  |  |  ------------------
  |  |  |  Branch (351:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  352|      0|                        reflection->Add##method(message, field, item.Get##jsontype()); \
  |  |  353|      0|                    }                                                   \
  |  |  354|      0|                }                                                       \
  |  |  355|    144|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|    144|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|    144|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|    144|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 79, False: 65]
  |  |  |  |  ------------------
  |  |  |  |  312|     79|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|     79|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 0, False: 79]
  |  |  |  |  ------------------
  |  |  |  |  314|      0|                    return false;                                   \
  |  |  |  |  315|      0|                }                                                   \
  |  |  |  |  316|     79|            }                                                       \
  |  |  |  |  317|    144|            match_type;                                             \
  |  |  |  |  318|    144|        })
  |  |  ------------------
  |  |  |  Branch (355:24): [True: 65, False: 79]
  |  |  ------------------
  |  |  356|     65|                reflection->Set##method(message, field, value.Get##jsontype()); \
  |  |  357|     65|            }                                                           \
  |  |  358|    144|            break;                                                      \
  |  |  359|    144|        }                                                               \
  ------------------
  363|    987|        CASE_FIELD_TYPE(BOOL,   Bool,   Bool);
  ------------------
  |  |  346|    987|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 987, False: 8.54k]
  |  |  ------------------
  |  |  347|    987|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 0, False: 987]
  |  |  ------------------
  |  |  348|      0|                const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();          \
  |  |  349|      0|                for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) { \
  |  |  ------------------
  |  |  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  |  |  ------------------
  |  |  |  Branch (349:69): [True: 0, False: 0]
  |  |  ------------------
  |  |  350|      0|                    const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];       \
  |  |  351|      0|                    if (TYPE_MATCH == J2PCHECKTYPE(item, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|      0|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|      0|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|      0|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  312|      0|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|      0|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|      0|                    return false;                                   \
  |  |  |  |  315|      0|                }                                                   \
  |  |  |  |  316|      0|            }                                                       \
  |  |  |  |  317|      0|            match_type;                                             \
  |  |  |  |  318|      0|        })
  |  |  ------------------
  |  |  |  Branch (351:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  352|      0|                        reflection->Add##method(message, field, item.Get##jsontype()); \
  |  |  353|      0|                    }                                                   \
  |  |  354|      0|                }                                                       \
  |  |  355|    987|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|    987|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|    987|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|    987|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 23, False: 964]
  |  |  |  |  ------------------
  |  |  |  |  312|     23|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|     23|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 23, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|     23|                    return false;                                   \
  |  |  |  |  315|     23|                }                                                   \
  |  |  |  |  316|     23|            }                                                       \
  |  |  |  |  317|    987|            match_type;                                             \
  |  |  |  |  318|    964|        })
  |  |  ------------------
  |  |  |  Branch (355:24): [True: 964, False: 23]
  |  |  ------------------
  |  |  356|    964|                reflection->Set##method(message, field, value.Get##jsontype()); \
  |  |  357|    964|            }                                                           \
  |  |  358|    987|            break;                                                      \
  |  |  359|    987|        }                                                               \
  ------------------
  364|      0|#undef CASE_FIELD_TYPE
  365|       |
  366|    465|    case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
  ------------------
  |  Branch (366:5): [True: 465, False: 9.06k]
  ------------------
  367|    465|        if (field->is_repeated()) {
  ------------------
  |  Branch (367:13): [True: 0, False: 465]
  ------------------
  368|      0|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  369|      0|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size;
  ------------------
  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (369:65): [True: 0, False: 0]
  ------------------
  370|      0|                 ++index) {
  371|      0|                const BUTIL_RAPIDJSON_NAMESPACE::Value& item = value[index];
  372|      0|                if (!convert_int64_type(item, true, message, field, reflection,
  ------------------
  |  Branch (372:21): [True: 0, False: 0]
  ------------------
  373|      0|                                        err)) {
  374|      0|                    return false;
  375|      0|                }
  376|      0|            }
  377|    465|        } else if (!convert_int64_type(value, false, message, field, reflection,
  ------------------
  |  Branch (377:20): [True: 0, False: 465]
  ------------------
  378|    465|                                       err)) {
  379|      0|            return false;
  380|      0|        }
  381|    465|        break;
  382|       |
  383|    465|    case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
  ------------------
  |  Branch (383:5): [True: 0, False: 9.53k]
  ------------------
  384|      0|        if (field->is_repeated()) {
  ------------------
  |  Branch (384:13): [True: 0, False: 0]
  ------------------
  385|      0|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  386|      0|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size;
  ------------------
  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (386:65): [True: 0, False: 0]
  ------------------
  387|      0|                 ++index) {
  388|      0|                const BUTIL_RAPIDJSON_NAMESPACE::Value& item = value[index];
  389|      0|                if (!convert_uint64_type(item, true, message, field, reflection,
  ------------------
  |  Branch (389:21): [True: 0, False: 0]
  ------------------
  390|      0|                                         err)) {
  391|      0|                    return false;
  392|      0|                }
  393|      0|            }
  394|      0|        } else if (!convert_uint64_type(value, false, message, field, reflection,
  ------------------
  |  Branch (394:20): [True: 0, False: 0]
  ------------------
  395|      0|                                       err)) {
  396|      0|            return false;
  397|      0|        }
  398|      0|        break;
  399|       |
  400|  3.38k|    case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
  ------------------
  |  Branch (400:5): [True: 3.38k, False: 6.15k]
  ------------------
  401|  3.38k|        if (field->is_repeated()) {
  ------------------
  |  Branch (401:13): [True: 0, False: 3.38k]
  ------------------
  402|      0|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  403|      0|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (403:65): [True: 0, False: 0]
  ------------------
  404|      0|                const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];
  405|      0|                if (!convert_float_type(item, true, message, field,
  ------------------
  |  Branch (405:21): [True: 0, False: 0]
  ------------------
  406|      0|                                        reflection, err)) {
  407|      0|                    return false;
  408|      0|                }
  409|      0|            }
  410|  3.38k|        } else if (!convert_float_type(value, false, message, field,
  ------------------
  |  Branch (410:20): [True: 24, False: 3.35k]
  ------------------
  411|  3.38k|                                       reflection, err)) {
  412|     24|            return false;
  413|     24|        }
  414|  3.35k|        break;
  415|       |
  416|  3.35k|    case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: 
  ------------------
  |  Branch (416:5): [True: 962, False: 8.57k]
  ------------------
  417|    962|        if (field->is_repeated()) {
  ------------------
  |  Branch (417:13): [True: 0, False: 962]
  ------------------
  418|      0|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  419|      0|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (419:65): [True: 0, False: 0]
  ------------------
  420|      0|                const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];
  421|      0|                if (!convert_double_type(item, true, message, field,
  ------------------
  |  Branch (421:21): [True: 0, False: 0]
  ------------------
  422|      0|                                         reflection, err)) {
  423|      0|                    return false;
  424|      0|                }
  425|      0|            }
  426|    962|        } else if (!convert_double_type(value, false, message, field,
  ------------------
  |  Branch (426:20): [True: 187, False: 775]
  ------------------
  427|    962|                                        reflection, err)) {
  428|    187|            return false;
  429|    187|        }
  430|    775|        break;
  431|       |        
  432|  1.95k|    case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
  ------------------
  |  Branch (432:5): [True: 1.95k, False: 7.57k]
  ------------------
  433|  1.95k|        if (field->is_repeated()) {
  ------------------
  |  Branch (433:13): [True: 67, False: 1.88k]
  ------------------
  434|     67|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  435|    940|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|     67|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (435:65): [True: 873, False: 67]
  ------------------
  436|    873|                const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];
  437|    873|                if (TYPE_MATCH == J2PCHECKTYPE(item, string, String)) { 
  ------------------
  |  |  309|    873|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  310|    873|            MatchType match_type = TYPE_MATCH;                      \
  |  |  311|    873|            if (!value.Is##jsontype()) {                            \
  |  |  ------------------
  |  |  |  Branch (311:17): [True: 16, False: 857]
  |  |  ------------------
  |  |  312|     16|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|     16|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 16, False: 0]
  |  |  ------------------
  |  |  314|     16|                    return false;                                   \
  |  |  315|     16|                }                                                   \
  |  |  316|     16|            }                                                       \
  |  |  317|    873|            match_type;                                             \
  |  |  318|    857|        })
  ------------------
  |  Branch (437:21): [True: 857, False: 16]
  ------------------
  438|    857|                    std::string str(item.GetString(), item.GetStringLength());
  439|    857|                    if (field->type() == google::protobuf::FieldDescriptor::TYPE_BYTES &&
  ------------------
  |  Branch (439:25): [True: 0, False: 857]
  ------------------
  440|      0|                        options.base64_to_bytes) {
  ------------------
  |  Branch (440:25): [True: 0, False: 0]
  ------------------
  441|      0|                        std::string str_decoded;
  442|      0|                        if (!butil::Base64Decode(str, &str_decoded)) {
  ------------------
  |  Branch (442:29): [True: 0, False: 0]
  ------------------
  443|      0|                            J2PERROR_WITH_PB(message, err, "Fail to decode base64 string=%s", str.c_str());
  ------------------
  |  |   52|      0|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 0, False: 0]
  |  |  ------------------
  |  |   53|      0|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 0, False: 0]
  |  |  ------------------
  |  |   54|      0|            perr->append(", ", 2);                                      \
  |  |   55|      0|        }                                                               \
  |  |   56|      0|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|      0|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 0, False: 0]
  |  |  ------------------
  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|      0|        }                                                               \
  |  |   61|      0|    } else { }
  ------------------
  444|      0|                            return false;
  445|      0|                        }
  446|      0|                        str = str_decoded;
  447|      0|                    }
  448|    857|                    reflection->AddString(message, field, str);
  449|    857|                }  
  450|    873|            }
  451|  1.88k|        } else if (TYPE_MATCH == J2PCHECKTYPE(value, string, String)) {
  ------------------
  |  |  309|  1.88k|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  310|  1.88k|            MatchType match_type = TYPE_MATCH;                      \
  |  |  311|  1.88k|            if (!value.Is##jsontype()) {                            \
  |  |  ------------------
  |  |  |  Branch (311:17): [True: 1.02k, False: 858]
  |  |  ------------------
  |  |  312|  1.02k|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|  1.02k|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 1, False: 1.02k]
  |  |  ------------------
  |  |  314|      1|                    return false;                                   \
  |  |  315|      1|                }                                                   \
  |  |  316|  1.02k|            }                                                       \
  |  |  317|  1.88k|            match_type;                                             \
  |  |  318|  1.88k|        })
  ------------------
  |  Branch (451:20): [True: 858, False: 1.02k]
  ------------------
  452|    858|            std::string str(value.GetString(), value.GetStringLength());
  453|    858|            if (field->type() == google::protobuf::FieldDescriptor::TYPE_BYTES &&
  ------------------
  |  Branch (453:17): [True: 757, False: 101]
  ------------------
  454|    757|                options.base64_to_bytes) {
  ------------------
  |  Branch (454:17): [True: 757, False: 0]
  ------------------
  455|    757|                std::string str_decoded;
  456|    757|                if (!butil::Base64Decode(str, &str_decoded)) {
  ------------------
  |  Branch (456:21): [True: 57, False: 700]
  ------------------
  457|     57|                    J2PERROR_WITH_PB(message, err, "Fail to decode base64 string=%s", str.c_str());
  ------------------
  |  |   52|     57|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 57, False: 0]
  |  |  ------------------
  |  |   53|     57|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 12, False: 45]
  |  |  ------------------
  |  |   54|     12|            perr->append(", ", 2);                                      \
  |  |   55|     12|        }                                                               \
  |  |   56|     57|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|     57|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 57, False: 0]
  |  |  ------------------
  |  |   58|     57|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|     57|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|     57|        }                                                               \
  |  |   61|     57|    } else { }
  ------------------
  458|     57|                    return false;
  459|     57|                }
  460|    700|                str = str_decoded;
  461|    700|            }
  462|    801|            reflection->SetString(message, field, str);
  463|    801|        }
  464|  1.89k|        break;
  465|       |
  466|  1.89k|    case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
  ------------------
  |  Branch (466:5): [True: 279, False: 9.25k]
  ------------------
  467|    279|        if (field->is_repeated()) {
  ------------------
  |  Branch (467:13): [True: 0, False: 279]
  ------------------
  468|      0|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  469|      0|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (469:65): [True: 0, False: 0]
  ------------------
  470|      0|                const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];
  471|      0|                if (!convert_enum_type(item, true, message, field,
  ------------------
  |  Branch (471:21): [True: 0, False: 0]
  ------------------
  472|      0|                                       reflection, err)) {
  473|      0|                    return false;
  474|      0|                }
  475|      0|            }
  476|    279|        } else if (!convert_enum_type(value, false, message, field,
  ------------------
  |  Branch (476:20): [True: 0, False: 279]
  ------------------
  477|    279|                                      reflection, err)) {
  478|      0|            return false;
  479|      0|        }
  480|    279|        break;
  481|       |        
  482|  1.33k|    case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
  ------------------
  |  Branch (482:5): [True: 1.33k, False: 8.19k]
  ------------------
  483|  1.33k|        if (field->is_repeated()) {
  ------------------
  |  Branch (483:13): [True: 537, False: 798]
  ------------------
  484|    537|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  485|  3.65k|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|    537|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (485:65): [True: 3.34k, False: 315]
  ------------------
  486|  3.34k|                const BUTIL_RAPIDJSON_NAMESPACE::Value& item = value[index];
  487|  3.34k|                if (TYPE_MATCH == J2PCHECKTYPE(item, message, Object)) { 
  ------------------
  |  |  309|  3.34k|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  310|  3.34k|            MatchType match_type = TYPE_MATCH;                      \
  |  |  311|  3.34k|            if (!value.Is##jsontype()) {                            \
  |  |  ------------------
  |  |  |  Branch (311:17): [True: 75, False: 3.26k]
  |  |  ------------------
  |  |  312|     75|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|     75|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 75, False: 0]
  |  |  ------------------
  |  |  314|     75|                    return false;                                   \
  |  |  315|     75|                }                                                   \
  |  |  316|     75|            }                                                       \
  |  |  317|  3.34k|            match_type;                                             \
  |  |  318|  3.26k|        })
  ------------------
  |  Branch (487:21): [True: 3.26k, False: 75]
  ------------------
  488|  3.26k|                    if (!JsonValueToProtoMessage(
  ------------------
  |  Branch (488:25): [True: 222, False: 3.04k]
  ------------------
  489|  3.26k|                            item, reflection->AddMessage(message, field), options, err, depth + 1)) {
  490|    222|                        return false;
  491|    222|                    }
  492|  3.26k|                } 
  493|  3.34k|            }
  494|    798|        } else if (!JsonValueToProtoMessage(
  ------------------
  |  Branch (494:20): [True: 98, False: 700]
  ------------------
  495|    798|            value, reflection->MutableMessage(message, field), options, err, depth + 1)) {
  496|     98|            return false;
  497|     98|        }
  498|  1.01k|        break;
  499|  9.53k|    }
  500|  8.82k|    return true;
  501|  9.53k|}
_ZN7json2pb13value_invalidEPKN6google8protobuf15FieldDescriptorEPKcRKN5butil9rapidjson12GenericValueINS8_4UTF8IcEENS8_19MemoryPoolAllocatorINS8_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  121|  2.12k|                          const BUTIL_RAPIDJSON_NAMESPACE::Value& value, std::string* err) {
  122|  2.12k|    bool optional = !field->is_required() && !field->is_repeated();
  ------------------
  |  Branch (122:21): [True: 1.88k, False: 235]
  |  Branch (122:46): [True: 1.78k, False: 99]
  ------------------
  123|  2.12k|    if (err) {
  ------------------
  |  Branch (123:9): [True: 2.12k, False: 0]
  ------------------
  124|  2.12k|        if (!err->empty()) {
  ------------------
  |  Branch (124:13): [True: 1.26k, False: 854]
  ------------------
  125|  1.26k|            err->append(", ");
  126|  1.26k|        }
  127|  2.12k|        err->append("Invalid value `");
  128|  2.12k|        string_append_value(value, err);
  129|  2.12k|        butil::string_appendf(err, "' for %sfield `%s' which SHOULD be %s",
  130|  2.12k|                       optional ? "optional " : "",
  ------------------
  |  Branch (130:24): [True: 1.78k, False: 334]
  ------------------
  131|  2.12k|                       butil::EnsureString(field->full_name()).c_str(), type);
  132|  2.12k|    }
  133|  2.12k|    if (!optional) {
  ------------------
  |  Branch (133:9): [True: 334, False: 1.78k]
  ------------------
  134|    334|        return false;                                           
  135|    334|    } 
  136|  1.78k|    return true;
  137|  2.12k|}
json_to_pb.cpp:_ZN7json2pbL19string_append_valueERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   88|  2.12k|                                std::string* output) {
   89|  2.12k|    if (value.IsNull()) {
  ------------------
  |  Branch (89:9): [True: 13, False: 2.11k]
  ------------------
   90|     13|        output->append("null");
   91|  2.11k|    } else if (value.IsBool()) {
  ------------------
  |  Branch (91:16): [True: 86, False: 2.02k]
  ------------------
   92|     86|        output->append(value.GetBool() ? "true" : "false");
  ------------------
  |  Branch (92:24): [True: 85, False: 1]
  ------------------
   93|  2.02k|    } else if (value.IsInt()) {
  ------------------
  |  Branch (93:16): [True: 350, False: 1.67k]
  ------------------
   94|    350|        butil::string_appendf(output, "%d", value.GetInt());
   95|  1.67k|    } else if (value.IsUint()) {
  ------------------
  |  Branch (95:16): [True: 35, False: 1.63k]
  ------------------
   96|     35|        butil::string_appendf(output, "%u", value.GetUint());
   97|  1.63k|    } else if (value.IsInt64()) {
  ------------------
  |  Branch (97:16): [True: 34, False: 1.60k]
  ------------------
   98|     34|        butil::string_appendf(output, "%" PRId64, value.GetInt64());
   99|  1.60k|    } else if (value.IsUint64()) {
  ------------------
  |  Branch (99:16): [True: 34, False: 1.57k]
  ------------------
  100|     34|        butil::string_appendf(output, "%" PRIu64, value.GetUint64());
  101|  1.57k|    } else if (value.IsDouble()) {
  ------------------
  |  Branch (101:16): [True: 541, False: 1.03k]
  ------------------
  102|    541|        butil::string_appendf(output, "%f", value.GetDouble());
  103|  1.03k|    } else if (value.IsString()) {
  ------------------
  |  Branch (103:16): [True: 849, False: 181]
  ------------------
  104|    849|        output->push_back('"');
  105|    849|        output->append(value.GetString(), value.GetStringLength());
  106|    849|        output->push_back('"');
  107|    849|    } else if (value.IsArray()) {
  ------------------
  |  Branch (107:16): [True: 105, False: 76]
  ------------------
  108|    105|        output->append("array");
  109|    105|    } else if (value.IsObject()) {
  ------------------
  |  Branch (109:16): [True: 76, False: 0]
  ------------------
  110|     76|        output->append("object");
  111|     76|    }
  112|  2.12k|}
_ZN7json2pb18convert_int64_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  242|    465|                               std::string* err) { 
  243|       |  
  244|    465|    int64_t num;
  245|    465|    if (item.IsInt64()) {
  ------------------
  |  Branch (245:9): [True: 5, False: 460]
  ------------------
  246|      5|        if (repeated) {
  ------------------
  |  Branch (246:13): [True: 0, False: 5]
  ------------------
  247|      0|            reflection->AddInt64(message, field, item.GetInt64());
  248|      5|        } else {
  249|      5|            reflection->SetInt64(message, field, item.GetInt64());
  250|      5|        }
  251|    460|    } else if (item.IsString() &&
  ------------------
  |  Branch (251:16): [True: 410, False: 50]
  |  Branch (251:16): [True: 221, False: 239]
  ------------------
  252|    410|               butil::StringToInt64({item.GetString(), item.GetStringLength()},
  ------------------
  |  Branch (252:16): [True: 221, False: 189]
  ------------------
  253|    410|                                    &num)) {
  254|    221|        if (repeated) {
  ------------------
  |  Branch (254:13): [True: 0, False: 221]
  ------------------
  255|      0|            reflection->AddInt64(message, field, num);
  256|    221|        } else {
  257|    221|            reflection->SetInt64(message, field, num);
  258|    221|        }
  259|    239|    } else {
  260|    239|        return value_invalid(field, "INT64", item, err);
  261|    239|    }
  262|    226|    return true;
  263|    465|}
_ZN7json2pb18convert_float_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  172|  3.38k|                               std::string* err) { 
  173|  3.38k|    if (item.IsNumber()) {
  ------------------
  |  Branch (173:9): [True: 2.90k, False: 477]
  ------------------
  174|  2.90k|        if (repeated) {
  ------------------
  |  Branch (174:13): [True: 0, False: 2.90k]
  ------------------
  175|      0|            reflection->AddFloat(message, field, item.GetDouble());
  176|  2.90k|        } else {
  177|  2.90k|            reflection->SetFloat(message, field, item.GetDouble());
  178|  2.90k|        }
  179|  2.90k|    } else if (item.IsString()) {
  ------------------
  |  Branch (179:16): [True: 463, False: 14]
  ------------------
  180|    463|        if (!convert_string_to_double_float_type(
  ------------------
  |  Branch (180:13): [True: 11, False: 452]
  ------------------
  181|    463|                (repeated ? &google::protobuf::Reflection::AddFloat
  ------------------
  |  Branch (181:18): [True: 0, False: 463]
  ------------------
  182|    463|                 : &google::protobuf::Reflection::SetFloat),
  183|    463|                message, field, reflection, item, err)) { 
  184|     11|            return false;
  185|     11|        }                                                                               
  186|    463|    } else {                                         
  187|     14|        return value_invalid(field, "float", item, err);
  188|     14|    } 
  189|  3.35k|    return true;
  190|  3.38k|}
_ZN7json2pb35convert_string_to_double_float_typeIfEEbMN6google8protobuf10ReflectionEKFvPNS2_7MessageEPKNS2_15FieldDescriptorET_ES5_S8_PKS3_RKN5butil9rapidjson12GenericValueINSF_4UTF8IcEENSF_19MemoryPoolAllocatorINSF_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  148|    463|    std::string* err) {
  149|    463|    const char* limit_type = item.GetString();  // MUST be string here 
  150|    463|    if (std::numeric_limits<T>::has_quiet_NaN &&
  ------------------
  |  Branch (150:9): [True: 463, Folded]
  ------------------
  151|    463|        strcasecmp(limit_type, "NaN") == 0) { 
  ------------------
  |  Branch (151:9): [True: 93, False: 370]
  ------------------
  152|     93|        (reflection->*func)(message, field, std::numeric_limits<T>::quiet_NaN());
  153|     93|        return true;
  154|     93|    } 
  155|    370|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (155:9): [True: 370, Folded]
  ------------------
  156|    370|        strcasecmp(limit_type, "Infinity") == 0) {
  ------------------
  |  Branch (156:9): [True: 96, False: 274]
  ------------------
  157|     96|        (reflection->*func)(message, field, std::numeric_limits<T>::infinity());
  158|     96|        return true;
  159|     96|    } 
  160|    274|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (160:9): [True: 274, Folded]
  ------------------
  161|    274|        strcasecmp(limit_type, "-Infinity") == 0) { 
  ------------------
  |  Branch (161:9): [True: 66, False: 208]
  ------------------
  162|     66|        (reflection->*func)(message, field, -std::numeric_limits<T>::infinity());
  163|     66|        return true;
  164|     66|    }
  165|    208|    return value_invalid(field, typeid(T).name(), item, err);
  166|    274|}
_ZN7json2pb19convert_double_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  196|    962|                                std::string* err) {  
  197|    962|    if (item.IsNumber()) {
  ------------------
  |  Branch (197:9): [True: 772, False: 190]
  ------------------
  198|    772|        if (repeated) {
  ------------------
  |  Branch (198:13): [True: 0, False: 772]
  ------------------
  199|      0|            reflection->AddDouble(message, field, item.GetDouble());
  200|    772|        } else {
  201|    772|            reflection->SetDouble(message, field, item.GetDouble());
  202|    772|        }
  203|    772|    } else if (item.IsString()) {
  ------------------
  |  Branch (203:16): [True: 189, False: 1]
  ------------------
  204|    189|        if (!convert_string_to_double_float_type(
  ------------------
  |  Branch (204:13): [True: 186, False: 3]
  ------------------
  205|    189|                (repeated ? &google::protobuf::Reflection::AddDouble
  ------------------
  |  Branch (205:18): [True: 0, False: 189]
  ------------------
  206|    189|                 : &google::protobuf::Reflection::SetDouble),
  207|    189|                message, field, reflection, item, err)) { 
  208|    186|            return false; 
  209|    186|        }
  210|    189|    } else {
  211|      1|        return value_invalid(field, "double", item, err); 
  212|      1|    }
  213|    775|    return true;
  214|    962|}
_ZN7json2pb35convert_string_to_double_float_typeIdEEbMN6google8protobuf10ReflectionEKFvPNS2_7MessageEPKNS2_15FieldDescriptorET_ES5_S8_PKS3_RKN5butil9rapidjson12GenericValueINSF_4UTF8IcEENSF_19MemoryPoolAllocatorINSF_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  148|    189|    std::string* err) {
  149|    189|    const char* limit_type = item.GetString();  // MUST be string here 
  150|    189|    if (std::numeric_limits<T>::has_quiet_NaN &&
  ------------------
  |  Branch (150:9): [True: 189, Folded]
  ------------------
  151|    189|        strcasecmp(limit_type, "NaN") == 0) { 
  ------------------
  |  Branch (151:9): [True: 1, False: 188]
  ------------------
  152|      1|        (reflection->*func)(message, field, std::numeric_limits<T>::quiet_NaN());
  153|      1|        return true;
  154|      1|    } 
  155|    188|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (155:9): [True: 188, Folded]
  ------------------
  156|    188|        strcasecmp(limit_type, "Infinity") == 0) {
  ------------------
  |  Branch (156:9): [True: 1, False: 187]
  ------------------
  157|      1|        (reflection->*func)(message, field, std::numeric_limits<T>::infinity());
  158|      1|        return true;
  159|      1|    } 
  160|    187|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (160:9): [True: 187, Folded]
  ------------------
  161|    187|        strcasecmp(limit_type, "-Infinity") == 0) { 
  ------------------
  |  Branch (161:9): [True: 1, False: 186]
  ------------------
  162|      1|        (reflection->*func)(message, field, -std::numeric_limits<T>::infinity());
  163|      1|        return true;
  164|      1|    }
  165|    186|    return value_invalid(field, typeid(T).name(), item, err);
  166|    187|}
_ZN7json2pb17convert_enum_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  220|    279|                              std::string* err) {
  221|    279|    const google::protobuf::EnumValueDescriptor * enum_value_descriptor = NULL; 
  222|    279|    if (item.IsInt()) {
  ------------------
  |  Branch (222:9): [True: 68, False: 211]
  ------------------
  223|     68|        enum_value_descriptor = field->enum_type()->FindValueByNumber(item.GetInt()); 
  224|    211|    } else if (item.IsString()) {                                          
  ------------------
  |  Branch (224:16): [True: 177, False: 34]
  ------------------
  225|    177|        enum_value_descriptor = field->enum_type()->FindValueByName(item.GetString()); 
  226|    177|    }                                                                      
  227|    279|    if (!enum_value_descriptor) {                                      
  ------------------
  |  Branch (227:9): [True: 245, False: 34]
  ------------------
  228|    245|        return value_invalid(field, "enum", item, err); 
  229|    245|    }                                                                  
  230|     34|    if (repeated) {
  ------------------
  |  Branch (230:9): [True: 0, False: 34]
  ------------------
  231|      0|        reflection->AddEnum(message, field, enum_value_descriptor);
  232|     34|    } else {
  233|     34|        reflection->SetEnum(message, field, enum_value_descriptor);
  234|     34|    }
  235|     34|    return true;
  236|    279|}
_ZN7json2pb24JsonToProtoMessageInlineERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN6google8protobuf7MessageERKNS_14Json2PbOptionsEPS5_Pm:
  635|  4.09k|                        size_t* parsed_offset) {
  636|  4.09k|    if (error) {
  ------------------
  |  Branch (636:9): [True: 4.09k, False: 0]
  ------------------
  637|  4.09k|        error->clear();
  638|  4.09k|    }
  639|  4.09k|    BUTIL_RAPIDJSON_NAMESPACE::Document d;
  ------------------
  |  |  120|  4.09k|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  640|  4.09k|    if (options.allow_remaining_bytes_after_parsing) {
  ------------------
  |  Branch (640:9): [True: 0, False: 4.09k]
  ------------------
  641|      0|        d.Parse<RAPIDJSON_PARSE_FLAG_STOP_WHEN_DONE>(json_string.c_str());
  642|      0|        if (parsed_offset != nullptr) {
  ------------------
  |  Branch (642:13): [True: 0, False: 0]
  ------------------
  643|      0|            *parsed_offset = d.GetErrorOffset();
  644|      0|        }
  645|  4.09k|    } else {
  646|  4.09k|        d.Parse<RAPIDJSON_PARSE_FLAG_DEFAULT>(json_string.c_str());
  647|  4.09k|    }
  648|  4.09k|    if (d.HasParseError()) {
  ------------------
  |  Branch (648:9): [True: 1.30k, False: 2.79k]
  ------------------
  649|  1.30k|        if (options.allow_remaining_bytes_after_parsing) {
  ------------------
  |  Branch (649:13): [True: 0, False: 1.30k]
  ------------------
  650|      0|            if (d.GetParseError() == BUTIL_RAPIDJSON_NAMESPACE::kParseErrorDocumentEmpty) {
  ------------------
  |  |  120|      0|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (650:17): [True: 0, False: 0]
  ------------------
  651|       |                // This is usual when parsing multiple jsons, don't waste time
  652|       |                // on setting the `empty error'
  653|      0|                return false;
  654|      0|            }
  655|      0|        }
  656|  1.30k|        J2PERROR_WITH_PB(message, error, "Invalid json: %s", BUTIL_RAPIDJSON_NAMESPACE::GetParseError_En(d.GetParseError()));
  ------------------
  |  |   52|  1.30k|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 1.30k, False: 0]
  |  |  ------------------
  |  |   53|  1.30k|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 0, False: 1.30k]
  |  |  ------------------
  |  |   54|      0|            perr->append(", ", 2);                                      \
  |  |   55|      0|        }                                                               \
  |  |   56|  1.30k|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  ------------------
  |  |  |  |  656|  1.30k|        J2PERROR_WITH_PB(message, error, "Invalid json: %s", BUTIL_RAPIDJSON_NAMESPACE::GetParseError_En(d.GetParseError()));
  |  |  |  |  ------------------
  |  |  |  |  |  |  120|  1.30k|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   57|  1.30k|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 1.30k, False: 0]
  |  |  ------------------
  |  |   58|  1.30k|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|  1.30k|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|  1.30k|        }                                                               \
  |  |   61|  1.30k|    } else { }
  ------------------
  657|  1.30k|        return false;
  658|  1.30k|    }
  659|  2.79k|    return JsonValueToProtoMessage(d, message, options, error, 0);
  660|  4.09k|}

_ZN7json2pb13IsProtobufMapEPKN6google8protobuf15FieldDescriptorE:
   26|  9.70k|bool IsProtobufMap(const FieldDescriptor* field) {
   27|  9.70k|    if (field->type() != FieldDescriptor::TYPE_MESSAGE || !field->is_repeated()) {
  ------------------
  |  Branch (27:9): [True: 8.27k, False: 1.42k]
  |  Branch (27:59): [True: 888, False: 538]
  ------------------
   28|  9.16k|        return false;
   29|  9.16k|    }
   30|    538|    const Descriptor* entry_desc = field->message_type();
   31|    538|    if (entry_desc == NULL) {
  ------------------
  |  Branch (31:9): [True: 0, False: 538]
  ------------------
   32|      0|        return false;
   33|      0|    }
   34|    538|    if (entry_desc->field_count() != 2) {
  ------------------
  |  Branch (34:9): [True: 538, False: 0]
  ------------------
   35|    538|        return false;
   36|    538|    }
   37|      0|    const FieldDescriptor* key_desc = entry_desc->field(KEY_INDEX);
   38|      0|    if (NULL == key_desc
  ------------------
  |  Branch (38:9): [True: 0, False: 0]
  ------------------
   39|      0|        || key_desc->is_repeated()
  ------------------
  |  Branch (39:12): [True: 0, False: 0]
  ------------------
   40|      0|        || key_desc->cpp_type() != FieldDescriptor::CPPTYPE_STRING
  ------------------
  |  Branch (40:12): [True: 0, False: 0]
  ------------------
   41|      0|        || key_desc->name() != KEY_NAME) {
  ------------------
  |  Branch (41:12): [True: 0, False: 0]
  ------------------
   42|      0|        return false;
   43|      0|    }
   44|      0|    const FieldDescriptor* value_desc = entry_desc->field(VALUE_INDEX);
   45|      0|    if (NULL == value_desc
  ------------------
  |  Branch (45:9): [True: 0, False: 0]
  ------------------
   46|      0|        || value_desc->name() != VALUE_NAME) {
  ------------------
  |  Branch (46:12): [True: 0, False: 0]
  ------------------
   47|      0|        return false;
   48|      0|    }
   49|      0|    return true;
   50|      0|}

LLVMFuzzerTestOneInput:
   26|  4.11k|{
   27|  4.11k|    if (size < kMinInputLength || size > kMaxInputLength){
  ------------------
  |  |   21|  8.23k|#define kMinInputLength 5
  ------------------
                  if (size < kMinInputLength || size > kMaxInputLength){
  ------------------
  |  |   22|  4.11k|#define kMaxInputLength 1024
  ------------------
  |  Branch (27:9): [True: 4, False: 4.11k]
  |  Branch (27:35): [True: 21, False: 4.09k]
  ------------------
   28|     25|        return 1;
   29|     25|    }
   30|       |
   31|  4.09k|    std::string error;
   32|  4.09k|    JsonContextBody jsondata;
   33|  4.09k|    std::string input_data((char *)data,size);
   34|  4.09k|    json2pb::JsonToProtoMessage(input_data, &jsondata, &error);
   35|       |
   36|  4.09k|    return 0;
   37|  4.11k|}

