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

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

_ZN7bthread11EpollThreadC2Ev:
  115|      2|        : _epfd(-1)
  116|      2|        , _stop(false)
  117|      2|        , _tid(0) {
  118|      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:
  432|      2|static int get_key_count(void*) {
  433|      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
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|      2|    return (int)nkey - (int)nfreekey;
  435|      2|}
key.cpp:_ZN7bthreadL18get_keytable_countEPv:
  436|      2|static size_t get_keytable_count(void*) {
  437|      2|    return nkeytable.load(butil::memory_order_relaxed);
  438|      2|}
key.cpp:_ZN7bthreadL19get_keytable_memoryEPv:
  439|      2|static size_t get_keytable_memory(void*) {
  440|      2|    const size_t n = nkeytable.load(butil::memory_order_relaxed);
  441|      2|    const size_t nsub = nsubkeytable.load(butil::memory_order_relaxed);
  442|      2|    return n * sizeof(KeyTable) + nsub * sizeof(SubKeyTable);
  443|      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|    198|                       const pthread_mutexattr_t* __restrict mutexattr) {
 1310|    198|    INIT_MUTEX_OWNER_MAP_ENTRY(mutex, mutexattr);
  ------------------
  |  |  795|    198|#define INIT_MUTEX_OWNER_MAP_ENTRY(mutex, mutexattr) ((void)0)
  ------------------
 1311|    198|    return bthread::sys_pthread_mutex_init(mutex, mutexattr);
 1312|    198|}
pthread_mutex_lock:
 1319|    728|int pthread_mutex_lock(pthread_mutex_t* mutex) {
 1320|    728|    return bthread::pthread_mutex_lock_impl(mutex);
 1321|    728|}
pthread_mutex_unlock:
 1334|    728|int pthread_mutex_unlock(pthread_mutex_t* mutex) {
 1335|    728|    return bthread::pthread_mutex_unlock_impl(mutex);
 1336|    728|}
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|    728|inline void AddTlsPthreadLockCount() {}
_ZN7bthread22SubTlsPthreadLockCountEv:
  561|    728|inline void SubTlsPthreadLockCount() {}
_ZN7bthread23pthread_mutex_lock_implEP15pthread_mutex_t:
  983|    728|BUTIL_FORCE_INLINE int pthread_mutex_lock_impl(pthread_mutex_t* mutex) {
  984|    728|    return internal::pthread_mutex_lock_impl(mutex, nullptr);
  985|    728|}
_ZN7bthread8internal23pthread_mutex_lock_implI15pthread_mutex_tEEiPT_PK8timespec:
  878|    728|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|    728|    if (!g_cp ||
  ------------------
  |  Branch (880:9): [True: 728, False: 0]
  ------------------
  881|       |        // collecting code including backtrace() and submit() may call
  882|       |        // pthread_mutex_lock and cause deadlock. Don't sample.
  883|    728|        BAIDU_GET_VOLATILE_THREAD_LOCAL(tls_inside_lock)) {
  ------------------
  |  |   68|      0|#define BAIDU_GET_VOLATILE_THREAD_LOCAL(var_name) get_##var_name()
  |  |  ------------------
  |  |  |  Branch (68:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  884|    728|        return pthread_mutex_lock_internal(mutex, abstime);
  885|    728|    }
  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 = nullptr;
  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);
  ------------------
  |  |   69|      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 == nullptr) {
  ------------------
  |  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|    728|                                                   const struct timespec* abstime) {
  807|    728|    int rc = 0;
  808|    728|    if (nullptr == abstime) {
  ------------------
  |  Branch (808:9): [True: 728, False: 0]
  ------------------
  809|    728|        FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex);
  ------------------
  |  |  797|    728|#define FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex) ((void)0)
  ------------------
  810|    728|        SYS_PTHREAD_MUTEX_CHECK_OWNER;
  ------------------
  |  |  798|    728|#define SYS_PTHREAD_MUTEX_CHECK_OWNER ((void)0)
  ------------------
  811|    728|        rc = sys_pthread_mutex_lock(mutex);
  812|    728|        if (0 == rc) {
  ------------------
  |  Branch (812:13): [True: 728, False: 0]
  ------------------
  813|    728|            SYS_PTHREAD_MUTEX_SET_OWNER;
  ------------------
  |  |  799|    728|#define SYS_PTHREAD_MUTEX_SET_OWNER ((void)0)
  ------------------
  814|    728|        }
  815|    728|    } 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|    728|    if (0 == rc) {
  ------------------
  |  Branch (822:9): [True: 728, False: 0]
  ------------------
  823|    728|        AddTlsPthreadLockCount();
  824|    728|    }
  825|    728|    return rc;
  826|    728|}
_ZN7bthread25pthread_mutex_unlock_implEP15pthread_mutex_t:
  998|    728|BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(pthread_mutex_t* mutex) {
  999|    728|    return internal::pthread_mutex_unlock_impl(mutex);
 1000|    728|}
_ZN7bthread8internal25pthread_mutex_unlock_implI15pthread_mutex_tEEiPT_:
  937|    728|BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(Mutex* mutex) {
  938|       |    // Don't change behavior of unlock when profiler is off.
  939|    728|    if (!g_cp || BAIDU_GET_VOLATILE_THREAD_LOCAL(tls_inside_lock)) {
  ------------------
  |  |   68|      0|#define BAIDU_GET_VOLATILE_THREAD_LOCAL(var_name) get_##var_name()
  |  |  ------------------
  |  |  |  Branch (68:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (939:9): [True: 728, 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|    728|        return pthread_mutex_unlock_internal(mutex);
  944|    728|    }
  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);
  ------------------
  |  |   69|      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|    728|}
_ZN7bthread8internal29pthread_mutex_unlock_internalEP15pthread_mutex_t:
  851|    728|BUTIL_FORCE_INLINE int pthread_mutex_unlock_internal(pthread_mutex_t* mutex) {
  852|    728|    SYS_PTHREAD_MUTEX_RESET_OWNER(mutex);
  ------------------
  |  |  800|    728|#define SYS_PTHREAD_MUTEX_RESET_OWNER(mutex) ((void)0)
  ------------------
  853|    728|    SubTlsPthreadLockCount();
  854|    728|    return sys_pthread_mutex_unlock(mutex);
  855|    728|}

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: 0, False: 2]
  ------------------
   68|      0|    family += (eax >> 20) & 0xff;
   69|      0|    model += ((eax >> 16) & 0xf) << 4;
   70|      0|  }
   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: 0, False: 2]
  ------------------
   78|      0|      family == 15 &&
  ------------------
  |  Branch (78:7): [True: 0, False: 0]
  ------------------
   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|    759|bool Base64Decode(const StringPiece& input, std::string* output) {
   23|    759|  std::string temp;
   24|    759|  temp.resize(modp_b64_decode_len(input.size()));
  ------------------
  |  |  108|    759|#define modp_b64_decode_len(A) (A / 4 * 3 + 2)
  ------------------
   25|       |
   26|       |  // does not null terminate result since result is binary data!
   27|    759|  size_t input_size = input.size();
   28|    759|  size_t output_size = modp_b64_decode(&(temp[0]), input.data(), input_size);
   29|    759|  if (output_size == MODP_B64_ERROR)
  ------------------
  |  |  135|    759|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (29:7): [True: 62, False: 697]
  ------------------
   30|     62|    return false;
   31|       |
   32|    697|  temp.resize(output_size);
   33|    697|  output->swap(temp);
   34|    697|  return true;
   35|    759|}

_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 nullptr; in that case, the demangled name is placed
   39|       |    //   in a region of memory allocated with malloc.
   40|       |    // length
   41|       |    //   If length is non-nullptr, 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, nullptr, nullptr, &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 = nullptr;
  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(nullptr) {
  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 : nullptr)
  ------------------
  |  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 (nullptr == 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 = nullptr;
  740|     64|    if (_S) {
  ------------------
  |  Branch (740:9): [Folded, False: 64]
  ------------------
  741|      0|        thumbnail = bit_array_malloc(new_nbucket);
  742|      0|        if (nullptr == 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 (nullptr != _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 (nullptr != _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 nullptr;
  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 nullptr;
  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 (nullptr == 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|}

_ZN5butil13AlignedMemoryILm56ELm8EE9void_dataEv:
   71|     16|      void* void_data() { return static_cast<void*>(data_); }     \
_ZN5butil13AlignedMemoryILm56ELm8EE7data_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 = nullptr;
  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); }
_ZN5butil18SingleThreadedPoolILm64ELm1024ELm16ENS_11PtAllocatorEEC2ERKS1_:
   65|     64|        : _free_nodes(nullptr), _blocks(nullptr), _allocator(alloc) {}
_ZN5butil18SingleThreadedPoolILm64ELm1024ELm16ENS_11PtAllocatorEE13get_allocatorEv:
  136|     64|    Allocator& get_allocator() { return _allocator; }

_ZN5butil14string_appendfEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKcz:
  121|  9.01k|int string_appendf(std::string* output, const char* format, ...) {
  122|  9.01k|    va_list ap;
  123|  9.01k|    va_start(ap, format);
  124|  9.01k|    const int rc = string_vappendf(output, format, ap);
  125|       |    va_end(ap);
  126|  9.01k|    return rc;
  127|  9.01k|}
_ZN5butil15string_vappendfEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKcP13__va_list_tag:
  129|  9.01k|int string_vappendf(std::string* output, const char* format, va_list args) {
  130|  9.01k|    const size_t old_size = output->size();
  131|  9.01k|    const int rc = string_printf_impl(*output, format, args);
  132|  9.01k|    if (rc != 0) {
  ------------------
  |  Branch (132:9): [True: 0, False: 9.01k]
  ------------------
  133|      0|        output->resize(old_size);
  134|      0|    }
  135|  9.01k|    return rc;
  136|  9.01k|}
string_printf.cpp:_ZN5butil12_GLOBAL__N_118string_printf_implERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKcP13__va_list_tag:
   38|  9.01k|                              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|  9.01k|    const int write_point = output.size();
   46|  9.01k|    int remaining = output.capacity() - write_point;
   47|  9.01k|    output.resize(output.capacity());
   48|       |
   49|  9.01k|    va_list copied_args;
   50|  9.01k|    va_copy(copied_args, args);
   51|  9.01k|    int bytes_used = vsnprintf(&output[write_point], remaining, format,
   52|  9.01k|                               copied_args);
   53|  9.01k|    va_end(copied_args);
   54|  9.01k|    if (bytes_used < 0) {
  ------------------
  |  Branch (54:9): [True: 0, False: 9.01k]
  ------------------
   55|      0|        return -1;
   56|  9.01k|    } else if (bytes_used < remaining) {
  ------------------
  |  Branch (56:16): [True: 2.06k, False: 6.95k]
  ------------------
   57|       |        // There was enough room, just shrink and return.
   58|  2.06k|        output.resize(write_point + bytes_used);
   59|  6.95k|    } else {
   60|  6.95k|        output.resize(write_point + bytes_used + 1);
   61|  6.95k|        remaining = bytes_used + 1;
   62|  6.95k|        bytes_used = vsnprintf(&output[write_point], remaining, format, args);
   63|  6.95k|        if (bytes_used + 1 != remaining) {
  ------------------
  |  Branch (63:13): [True: 0, False: 6.95k]
  ------------------
   64|      0|            return -1;
   65|      0|        }
   66|  6.95k|        output.resize(write_point + bytes_used);
   67|  6.95k|    }
   68|  9.01k|    return 0;
   69|  9.01k|}

_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|    754|template<typename CHAR> bool LocalIsWhitespace(CHAR c) {
  131|    754|  return WhitespaceHelper<CHAR>::Invoke(c);
  132|    754|}
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_116WhitespaceHelperIcE6InvokeEc:
  118|    754|  static bool Invoke(char c) {
  119|    754|    return 0 != isspace(static_cast<unsigned char>(c));
  120|    754|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_111CharToDigitILi10EcEEbT0_Ph:
  105|  4.84k|template<int BASE, typename CHAR> bool CharToDigit(CHAR c, uint8_t* digit) {
  106|  4.84k|  return BaseCharToDigit<CHAR, BASE, BASE <= 10>::Convert(c, digit);
  107|  4.84k|}
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_115BaseCharToDigitIcLi10ELb1EE7ConvertEcPh:
   79|  4.84k|  static bool Convert(CHAR c, uint8_t* digit) {
   80|  4.84k|    if (c >= '0' && c < '0' + BASE) {
  ------------------
  |  Branch (80:9): [True: 4.78k, False: 63]
  |  Branch (80:21): [True: 4.75k, False: 28]
  ------------------
   81|  4.75k|      *digit = c - '0';
   82|  4.75k|      return true;
   83|  4.75k|    }
   84|     91|    return false;
   85|  4.84k|  }
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|    777|    while (begin != end && LocalIsWhitespace(*begin)) {
  ------------------
  |  Branch (154:12): [True: 754, False: 23]
  |  Branch (154:28): [True: 367, False: 387]
  ------------------
  155|    367|      valid = false;
  156|    367|      ++begin;
  157|    367|    }
  158|       |
  159|    410|    if (begin != end && *begin == '-') {
  ------------------
  |  Branch (159:9): [True: 387, False: 23]
  |  Branch (159:25): [True: 182, False: 205]
  ------------------
  160|    182|      if (!std::numeric_limits<value_type>::is_signed) {
  ------------------
  |  Branch (160:11): [Folded, False: 182]
  ------------------
  161|      0|        valid = false;
  162|    182|      } else if (!Negative::Invoke(begin + 1, end, output)) {
  ------------------
  |  Branch (162:18): [True: 101, False: 81]
  ------------------
  163|    101|        valid = false;
  164|    101|      }
  165|    228|    } else {
  166|    228|      if (begin != end && *begin == '+') {
  ------------------
  |  Branch (166:11): [True: 205, False: 23]
  |  Branch (166:27): [True: 1, False: 204]
  ------------------
  167|      1|        ++begin;
  168|      1|      }
  169|    228|      if (!Positive::Invoke(begin, end, output)) {
  ------------------
  |  Branch (169:11): [True: 87, False: 141]
  ------------------
  170|     87|        valid = false;
  171|     87|      }
  172|    228|    }
  173|       |
  174|    410|    return valid;
  175|    410|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE4BaseINS4_8NegativeEE6InvokeEPKcS9_Pl:
  187|    182|                       typename traits::value_type* output) {
  188|    182|      *output = 0;
  189|       |
  190|    182|      if (begin == end) {
  ------------------
  |  Branch (190:11): [True: 1, False: 181]
  ------------------
  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|    181|      if (traits::kBase == 16 && end - begin > 2 && *begin == '0' &&
  ------------------
  |  Branch (196:11): [Folded, False: 181]
  |  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.51k|      for (const_iterator current = begin; current != end; ++current) {
  ------------------
  |  Branch (201:44): [True: 2.43k, False: 81]
  ------------------
  202|  2.43k|        uint8_t new_digit = 0;
  203|       |
  204|  2.43k|        if (!CharToDigit<traits::kBase>(*current, &new_digit)) {
  ------------------
  |  Branch (204:13): [True: 34, False: 2.39k]
  ------------------
  205|     34|          return false;
  206|     34|        }
  207|       |
  208|  2.39k|        if (current != begin) {
  ------------------
  |  Branch (208:13): [True: 2.23k, False: 164]
  ------------------
  209|  2.23k|          if (!Sign::CheckBounds(output, new_digit)) {
  ------------------
  |  Branch (209:15): [True: 66, False: 2.16k]
  ------------------
  210|     66|            return false;
  211|     66|          }
  212|  2.16k|          *output *= traits::kBase;
  213|  2.16k|        }
  214|       |
  215|  2.33k|        Sign::Increment(new_digit, output);
  216|  2.33k|      }
  217|     81|      return true;
  218|    181|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Negative11CheckBoundsEPlh:
  239|  2.23k|    static bool CheckBounds(value_type* output, uint8_t new_digit) {
  240|  2.23k|      if (*output < traits::min() / traits::kBase ||
  ------------------
  |  Branch (240:11): [True: 65, False: 2.16k]
  ------------------
  241|  2.16k|          (*output == traits::min() / traits::kBase &&
  ------------------
  |  Branch (241:12): [True: 6, False: 2.16k]
  ------------------
  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.16k|      return true;
  247|  2.23k|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_131BaseIteratorRangeToNumberTraitsIPKclLi10EE3minEv:
  259|  4.47k|  static value_type min() {
  260|  4.47k|    return std::numeric_limits<value_type>::min();
  261|  4.47k|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Negative9IncrementEhPl:
  248|  2.33k|    static void Increment(uint8_t increment, value_type* output) {
  249|  2.33k|      *output -= increment;
  250|  2.33k|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE4BaseINS4_8PositiveEE6InvokeEPKcS9_Pl:
  187|    228|                       typename traits::value_type* output) {
  188|    228|      *output = 0;
  189|       |
  190|    228|      if (begin == end) {
  ------------------
  |  Branch (190:11): [True: 24, False: 204]
  ------------------
  191|     24|        return false;
  192|     24|      }
  193|       |
  194|       |      // Note: no performance difference was found when using template
  195|       |      // specialization to remove this check in bases other than 16
  196|    204|      if (traits::kBase == 16 && end - begin > 2 && *begin == '0' &&
  ------------------
  |  Branch (196:11): [Folded, False: 204]
  |  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.55k|      for (const_iterator current = begin; current != end; ++current) {
  ------------------
  |  Branch (201:44): [True: 2.41k, False: 141]
  ------------------
  202|  2.41k|        uint8_t new_digit = 0;
  203|       |
  204|  2.41k|        if (!CharToDigit<traits::kBase>(*current, &new_digit)) {
  ------------------
  |  Branch (204:13): [True: 57, False: 2.35k]
  ------------------
  205|     57|          return false;
  206|     57|        }
  207|       |
  208|  2.35k|        if (current != begin) {
  ------------------
  |  Branch (208:13): [True: 2.19k, False: 164]
  ------------------
  209|  2.19k|          if (!Sign::CheckBounds(output, new_digit)) {
  ------------------
  |  Branch (209:15): [True: 6, False: 2.18k]
  ------------------
  210|      6|            return false;
  211|      6|          }
  212|  2.18k|          *output *= traits::kBase;
  213|  2.18k|        }
  214|       |
  215|  2.35k|        Sign::Increment(new_digit, output);
  216|  2.35k|      }
  217|    141|      return true;
  218|    204|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Positive11CheckBoundsEPlh:
  223|  2.19k|    static bool CheckBounds(value_type* output, uint8_t new_digit) {
  224|  2.19k|      if (*output > static_cast<value_type>(traits::max() / traits::kBase) ||
  ------------------
  |  Branch (224:11): [True: 4, False: 2.19k]
  ------------------
  225|  2.19k|          (*output == static_cast<value_type>(traits::max() / traits::kBase) &&
  ------------------
  |  Branch (225:12): [True: 6, False: 2.18k]
  ------------------
  226|      6|           new_digit > traits::max() % traits::kBase)) {
  ------------------
  |  Branch (226:12): [True: 2, False: 4]
  ------------------
  227|      6|        *output = traits::max();
  228|      6|        return false;
  229|      6|      }
  230|  2.18k|      return true;
  231|  2.19k|    }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_131BaseIteratorRangeToNumberTraitsIPKclLi10EE3maxEv:
  262|  4.39k|  static value_type max() {
  263|  4.39k|    return std::numeric_limits<value_type>::max();
  264|  4.39k|  }
string_number_conversions.cc:_ZN5butil12_GLOBAL__N_121IteratorRangeToNumberINS0_25StringPieceToNumberTraitsIlLi10EEEE8Positive9IncrementEhPl:
  232|  2.35k|    static void Increment(uint8_t increment, value_type* output) {
  233|  2.35k|      *output += increment;
  234|  2.35k|    }

_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2EPKc:
  192|      8|      : ptr_(str),
  193|      8|        length_((str == nullptr) ? 0 : STRING_TYPE::traits_type::length(str)) {}
  ------------------
  |  Branch (193:17): [True: 0, False: 8]
  ------------------
_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2Ev:
  190|      8|  BasicStringPiece() : ptr_(nullptr), 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|    937|  const value_type* data() const { return ptr_; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4sizeEv:
  215|  1.71k|  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|    759|      : 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.9k|inline std::string EnsureString(const std::string& s) {
  264|  25.9k|    return s;
  265|  25.9k|}

_ZN5butil17ConditionVariableC2EPNS_5MutexE:
   18|      8|    : user_mutex_(user_lock->native_handle()) {
   19|       |  // NOTE(gejun): Disable monotonic clock always due to difficulty of adapting
   20|       |  // all versions of gcc
   21|      8|  int rv = pthread_cond_init(&condition_, nullptr);
   22|      8|  DCHECK_EQ(0, rv);
  ------------------
  |  |  884|      8|#define DCHECK_EQ(val1, val2) BAIDU_DCHECK_OP(EQ, ==, val1, val2)
  |  |  ------------------
  |  |  |  |  856|      8|    if (DCHECK_IS_ON())                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |  700|      8|#define DCHECK_IS_ON() 0
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (700:24): [Folded, False: 8]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  857|      8|        if (std::string* _result =                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (857:26): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  858|      0|            ::logging::Check##name##Impl((val1), (val2),                \
  |  |  |  |  859|      0|                                         #val1 " " #op " " #val2))      \
  |  |  |  |  860|      0|            ::logging::LogMessage(                                      \
  |  |  |  |  861|      0|                __FILE__, __LINE__, __func__,                           \
  |  |  |  |  862|      0|                ::logging::BLOG_DCHECK,                                 \
  |  |  |  |  863|      0|                _result).stream()
  |  |  ------------------
  ------------------
   23|      8|}

_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|    }
_ZN5butil5MutexC2Ev:
   50|    124|    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, nullptr);
   57|    124|#endif
   58|    124|    }
_ZN5butil5Mutex13native_handleEv:
  105|      8|    NativeHandle* native_handle() { return &_native_handle; }
_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|    759|{
  200|       |#if USE_RVV_BASE64
  201|       |    return rvv_modp_b64_decode(dest, src, len);
  202|       |#endif
  203|    759|    if (len == 0) return 0;
  ------------------
  |  Branch (203:9): [True: 466, False: 293]
  ------------------
  204|       |
  205|    293|#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|    293|    if (len < 4 || (len % 4 != 0)) return MODP_B64_ERROR; /* error */
  ------------------
  |  |  135|     33|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (210:9): [True: 17, False: 276]
  |  Branch (210:20): [True: 16, False: 260]
  ------------------
  211|       |    /* there can be at most 2 pad chars at the end */
  212|    260|    if (src[len-1] == CHARPAD) {
  ------------------
  |  |    6|    260|#define CHARPAD '='
  ------------------
  |  Branch (212:9): [True: 149, False: 111]
  ------------------
  213|    149|        len--;
  214|    149|        if (src[len -1] == CHARPAD) {
  ------------------
  |  |    6|    149|#define CHARPAD '='
  ------------------
  |  Branch (214:13): [True: 70, False: 79]
  ------------------
  215|     70|            len--;
  216|     70|        }
  217|    149|    }
  218|    260|#endif
  219|       |
  220|    260|    size_t i;
  221|    260|    int leftover = len % 4;
  222|    260|    size_t chunks = (leftover == 0) ? len / 4 - 1 : len /4;
  ------------------
  |  Branch (222:21): [True: 111, False: 149]
  ------------------
  223|       |
  224|    260|    uint8_t* p = (uint8_t*)dest;
  225|    260|    uint32_t x = 0;
  226|    260|    uint32_t* destInt = (uint32_t*) p;
  227|    260|    uint32_t* srcInt = (uint32_t*) src;
  228|    260|    uint32_t y = *srcInt++;
  229|    993|    for (i = 0; i < chunks; ++i) {
  ------------------
  |  Branch (229:17): [True: 744, False: 249]
  ------------------
  230|    744|        x = d0[y & 0xff] |
  231|    744|            d1[(y >> 8) & 0xff] |
  232|    744|            d2[(y >> 16) & 0xff] |
  233|    744|            d3[(y >> 24) & 0xff];
  234|       |
  235|    744|        if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   67|    744|#define BADCHAR 0x01FFFFFF
  ------------------
                      if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  135|     11|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (235:13): [True: 11, False: 733]
  ------------------
  236|    733|        *destInt = x ;
  237|    733|        p += 3;
  238|    733|        destInt = (uint32_t*)p;
  239|    733|        y = *srcInt++;}
  240|       |
  241|       |
  242|    249|    switch (leftover) {
  243|    103|    case 0:
  ------------------
  |  Branch (243:5): [True: 103, False: 146]
  ------------------
  244|    103|        x = d0[y & 0xff] |
  245|    103|            d1[(y >> 8) & 0xff] |
  246|    103|            d2[(y >> 16) & 0xff] |
  247|    103|            d3[(y >> 24) & 0xff];
  248|       |
  249|    103|        if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   67|    103|#define BADCHAR 0x01FFFFFF
  ------------------
                      if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  135|     10|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (249:13): [True: 10, False: 93]
  ------------------
  250|     93|        *p++ =  ((uint8_t*)(&x))[0];
  251|     93|        *p++ =  ((uint8_t*)(&x))[1];
  252|     93|        *p =    ((uint8_t*)(&x))[2];
  253|     93|        return (chunks+1)*3;
  254|      0|        break;
  255|      0|    case 1:  /* with padding this is an impossible case */
  ------------------
  |  Branch (255:5): [True: 0, False: 249]
  ------------------
  256|      0|        x = d0[y & 0xff];
  257|      0|        *p = *((uint8_t*)(&x)); // i.e. first char/byte in int
  258|      0|        break;
  259|     69|    case 2: // * case 2, 1  output byte */
  ------------------
  |  Branch (259:5): [True: 69, False: 180]
  ------------------
  260|     69|        x = d0[y & 0xff] | d1[y >> 8 & 0xff];
  261|     69|        *p = *((uint8_t*)(&x)); // i.e. first char
  262|     69|        break;
  263|     77|    default: /* case 3, 2 output bytes */
  ------------------
  |  Branch (263:5): [True: 77, False: 172]
  ------------------
  264|     77|        x = d0[y & 0xff] |
  265|     77|            d1[y >> 8 & 0xff ] |
  266|     77|            d2[y >> 16 & 0xff];  /* 0x3c */
  267|     77|        *p++ =  ((uint8_t*)(&x))[0];
  268|     77|        *p =  ((uint8_t*)(&x))[1];
  269|     77|        break;
  270|    249|    }
  271|       |
  272|    146|    if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   67|    146|#define BADCHAR 0x01FFFFFF
  ------------------
                  if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  135|      8|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (272:9): [True: 8, False: 138]
  ------------------
  273|       |
  274|    138|    return 3*chunks + (6*leftover)/8;
  275|    146|}

_ZN5butil9rapidjson12CrtAllocator4FreeEPv:
   79|  13.7k|    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.06k|    void* Malloc(size_t size) {
  177|  9.06k|        if (!size)
  ------------------
  |  Branch (177:13): [True: 0, False: 9.06k]
  ------------------
  178|      0|            return NULL;
  179|       |
  180|  9.06k|        size = RAPIDJSON_ALIGN(size);
  ------------------
  |  |  252|  9.06k|#define RAPIDJSON_ALIGN(x) ((x + 7u) & ~7u)
  ------------------
  181|  9.06k|        if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity)
  ------------------
  |  Branch (181:13): [True: 1.67k, False: 7.39k]
  |  Branch (181:32): [True: 0, False: 7.39k]
  ------------------
  182|  1.67k|            AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size);
  ------------------
  |  Branch (182:22): [True: 1.67k, False: 0]
  ------------------
  183|       |
  184|  9.06k|        void *buffer = reinterpret_cast<char *>(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size;
  ------------------
  |  |  252|  9.06k|#define RAPIDJSON_ALIGN(x) ((x + 7u) & ~7u)
  ------------------
  185|  9.06k|        chunkHead_->size += size;
  186|  9.06k|        return buffer;
  187|  9.06k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEE8AddChunkEm:
  231|  1.67k|    void AddChunk(size_t capacity) {
  232|  1.67k|        if (!baseAllocator_)
  ------------------
  |  Branch (232:13): [True: 1.67k, False: 0]
  ------------------
  233|  1.67k|            ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator());
  ------------------
  |  |  491|  1.67k|#define RAPIDJSON_NEW(x) new x
  ------------------
  234|  1.67k|        ChunkHeader* chunk = reinterpret_cast<ChunkHeader*>(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity));
  ------------------
  |  |  252|  1.67k|#define RAPIDJSON_ALIGN(x) ((x + 7u) & ~7u)
  ------------------
  235|  1.67k|        chunk->capacity = capacity;
  236|  1.67k|        chunk->size = 0;
  237|  1.67k|        chunk->next = chunkHead_;
  238|  1.67k|        chunkHead_ =  chunk;
  239|  1.67k|    }
_ZN5butil9rapidjson12CrtAllocator6MallocEm:
   65|  1.67k|    void* Malloc(size_t size) { 
   66|  1.67k|        if (size) //  behavior of malloc(0) is implementation defined.
  ------------------
  |  Branch (66:13): [True: 1.67k, False: 0]
  ------------------
   67|  1.67k|            return std::malloc(size);
   68|      0|        else
   69|      0|            return NULL; // standardize to returning NULL.
   70|  1.67k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEEC2EmPS2_:
  111|  4.04k|        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
  112|  4.04k|    {
  113|  4.04k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEED2Ev:
  139|  4.04k|    ~MemoryPoolAllocator() {
  140|  4.04k|        Clear();
  141|  4.04k|        RAPIDJSON_DELETE(ownBaseAllocator_);
  ------------------
  |  |  495|  4.04k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
  142|  4.04k|    }
_ZN5butil9rapidjson19MemoryPoolAllocatorINS0_12CrtAllocatorEE5ClearEv:
  145|  4.04k|    void Clear() {
  146|  5.71k|        while (chunkHead_ && chunkHead_ != userBuffer_) {
  ------------------
  |  Branch (146:16): [True: 1.67k, False: 4.04k]
  |  Branch (146:30): [True: 1.67k, False: 0]
  ------------------
  147|  1.67k|            ChunkHeader* next = chunkHead_->next;
  148|  1.67k|            baseAllocator_->Free(chunkHead_);
  149|  1.67k|            chunkHead_ = next;
  150|  1.67k|        }
  151|  4.04k|        if (chunkHead_ && chunkHead_ == userBuffer_)
  ------------------
  |  Branch (151:13): [True: 0, False: 4.04k]
  |  Branch (151:27): [True: 0, False: 0]
  ------------------
  152|      0|            chunkHead_->size = 0; // Clear user buffer
  153|  4.04k|    }

_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsNullEv:
  765|  11.9k|    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.66k|    const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEixEj:
 1279|  4.66k|    GenericValue& operator[](SizeType index) {
 1280|  4.66k|        RAPIDJSON_ASSERT(IsArray());
  ------------------
  |  |  351|  4.66k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1281|       |        RAPIDJSON_ASSERT(index < data_.a.size);
  ------------------
  |  |  351|  4.66k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1282|  4.66k|        return data_.a.elements[index];
 1283|  4.66k|    }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE5IsIntEv:
  772|  2.71k|    bool IsInt()    const { return (flags_ & kIntFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7IsInt64Ev:
  774|  2.08k|    bool IsInt64()  const { return (flags_ & kInt64Flag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8GetInt64Ev:
 1427|     43|    int64_t GetInt64() const    { RAPIDJSON_ASSERT(flags_ & kInt64Flag); return data_.n.i64; }
  ------------------
  |  |  351|     43|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsUint64Ev:
  775|  1.57k|    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.54k|    bool IsDouble() const { return (flags_ & kDoubleFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9GetDoubleEv:
 1430|  4.26k|    double GetDouble() const {
 1431|  4.26k|        RAPIDJSON_ASSERT(IsNumber());
  ------------------
  |  |  351|  4.26k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1432|  4.26k|        if ((flags_ & kDoubleFlag) != 0)                return data_.n.d;   // exact type, no conversion.
  ------------------
  |  Branch (1432:13): [True: 606, False: 3.66k]
  ------------------
 1433|  3.66k|        if ((flags_ & kIntFlag) != 0)                   return data_.n.i.i; // int -> double
  ------------------
  |  Branch (1433:13): [True: 3.49k, 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|    857|    int GetInt() const          { RAPIDJSON_ASSERT(flags_ & kIntFlag);   return data_.n.i.i;   }
  ------------------
  |  |  351|    857|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsUintEv:
  773|  1.79k|    bool IsUint()   const { return (flags_ & kUintFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7GetUintEv:
 1426|    104|    unsigned GetUint() const    { RAPIDJSON_ASSERT(flags_ & kUintFlag);  return data_.n.u.u;   }
  ------------------
  |  |  351|    104|#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.02k|    bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return flags_ == kTrueFlag; }
  ------------------
  |  |  351|  1.02k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsNumberEv:
  771|  4.36k|    bool IsNumber() const { return (flags_ & kNumberFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsStringEv:
  777|  5.11k|    bool IsString() const { return (flags_ & kStringFlag) != 0; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7SetNullEv:
  784|  4.04k|    GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEED2Ev:
  564|  28.5k|    ~GenericValue() {
  565|  28.5k|        if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
  ------------------
  |  Branch (565:13): [Folded, False: 28.5k]
  ------------------
  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.5k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ev:
  440|  8.59k|    GenericValue() RAPIDJSON_NOEXCEPT : data_(), flags_(kNullFlag) {}
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E16ClearStackOnExitC2ERS7_:
 1933|  4.04k|        explicit ClearStackOnExit(GenericDocument& d) : d_(d) {}
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E11StartObjectEv:
 1964|  7.40k|    bool StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2ENS0_4TypeE:
  460|  41.4k|    explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_(), flags_() {
  461|  41.4k|        static const unsigned defaultFlags[7] = {
  462|  41.4k|            kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
  463|  41.4k|            kNumberAnyFlag
  464|  41.4k|        };
  465|  41.4k|        RAPIDJSON_ASSERT(type <= kNumberType);
  ------------------
  |  |  351|  41.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  466|  41.4k|        flags_ = defaultFlags[type];
  467|       |
  468|       |        // Use ShortString to store empty string.
  469|  41.4k|        if (type == kStringType)
  ------------------
  |  Branch (469:13): [True: 0, False: 41.4k]
  ------------------
  470|      0|            data_.ss.SetLength(0);
  471|  41.4k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11ShortString9SetLengthEj:
 1609|  14.9k|        inline void     SetLength(SizeType len) { str[LenPos] = (Ch)(MaxSize -  len); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E10StartArrayEv:
 1974|  34.0k|    bool StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); return true; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E3KeyEPKcjb:
 1966|  11.8k|    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: 615]
  ------------------
 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|    615|            flags_ = kCopyStringFlag;
 1699|    615|            data_.s.length = s.length;
 1700|    615|            str = (Ch *)allocator.Malloc((s.length + 1) * sizeof(Ch));
 1701|    615|            data_.s.str = str;
 1702|    615|        }
 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|    506|    bool Null() { new (stack_.template Push<ValueType>()) ValueType(); return true; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E4BoolEb:
 1949|  1.55k|    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.55k|        : data_(), flags_(b ? kTrueFlag : kFalseFlag) {
  ------------------
  |  Branch (495:27): [True: 1.31k, False: 242]
  ------------------
  496|       |            // safe-guard against failing SFINAE
  497|  1.55k|            RAPIDJSON_STATIC_ASSERT((internal::IsSame<bool,T>::Value));
  ------------------
  |  |  383|  1.55k|    typedef ::BUTIL_RAPIDJSON_NAMESPACE::StaticAssertTest< \
  |  |  384|  1.55k|      sizeof(::BUTIL_RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \
  |  |  385|  1.55k|    RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
  ------------------
  498|  1.55k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6DoubleEd:
 1954|  4.68k|    bool Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ed:
  540|  4.68k|    explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberDoubleFlag) { data_.n.d = d; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E8AddInt64El:
 1952|    475|    bool AddInt64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2El:
  515|    475|    explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberInt64Flag) {
  516|    475|        data_.n.i64 = i64;
  517|    475|        if (i64 >= 0) {
  ------------------
  |  Branch (517:13): [True: 0, False: 475]
  ------------------
  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|    475|        else if (i64 >= static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
  ------------------
  |  |  268|    475|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (524:18): [True: 0, False: 475]
  ------------------
  525|      0|            flags_ |= kIntFlag;
  526|    475|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E9AddUint64Em:
 1953|    664|    bool AddUint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Em:
  529|    664|    explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUint64Flag) {
  530|    664|        data_.n.u64 = u64;
  531|    664|        if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000)))
  ------------------
  |  |  268|    664|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (531:13): [True: 378, False: 286]
  ------------------
  532|    378|            flags_ |= kInt64Flag;
  533|    664|        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
  ------------------
  |  |  268|    664|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (533:13): [True: 0, False: 664]
  ------------------
  534|      0|            flags_ |= kUintFlag;
  535|    664|        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
  ------------------
  |  |  268|    664|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (535:13): [True: 0, False: 664]
  ------------------
  536|      0|            flags_ |= kIntFlag;
  537|    664|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6AddIntEi:
 1950|  1.03k|    bool AddInt(int i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ei:
  501|  1.03k|    explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberIntFlag) {
  502|  1.03k|        data_.n.i64 = i;
  503|  1.03k|        if (i >= 0)
  ------------------
  |  Branch (503:13): [True: 317, False: 719]
  ------------------
  504|    317|            flags_ |= kUintFlag | kUint64Flag;
  505|  1.03k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E7AddUintEj:
 1951|  11.2k|    bool AddUint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ej:
  508|  11.2k|    explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUintFlag) {
  509|  11.2k|        data_.n.u64 = u; 
  510|  11.2k|        if (!(u & 0x80000000))
  ------------------
  |  Branch (510:13): [True: 10.9k, False: 285]
  ------------------
  511|  10.9k|            flags_ |= kIntFlag | kInt64Flag;
  512|  11.2k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E9EndObjectEj:
 1968|  6.68k|    bool EndObject(SizeType memberCount) {
 1969|  6.68k|        typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
 1970|  6.68k|        stack_.template Top<ValueType>()->SetObjectRaw(members, (SizeType)memberCount, GetAllocator());
 1971|  6.68k|        return true;
 1972|  6.68k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE12SetObjectRawEPNS0_13GenericMemberIS3_S6_EEjRS6_:
 1672|  6.68k|    void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) {
 1673|  6.68k|        flags_ = kObjectFlag;
 1674|  6.68k|        if (count) {
  ------------------
  |  Branch (1674:13): [True: 6.06k, False: 621]
  ------------------
 1675|  6.06k|            data_.o.members = (Member*)allocator.Malloc(count * sizeof(Member));
 1676|  6.06k|            std::memcpy(static_cast<void*>(data_.o.members), members, count * sizeof(Member));
 1677|  6.06k|        }
 1678|    621|        else
 1679|    621|            data_.o.members = NULL;
 1680|  6.68k|        data_.o.size = data_.o.capacity = count;
 1681|  6.68k|    }
_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.38k, False: 364]
  ------------------
 1663|  2.38k|            data_.a.elements = (GenericValue*)allocator.Malloc(count * sizeof(GenericValue));
 1664|  2.38k|            std::memcpy(static_cast<void*>(data_.a.elements), values, count * sizeof(GenericValue));
 1665|  2.38k|        }
 1666|    364|        else
 1667|    364|            data_.a.elements = NULL;
 1668|  2.75k|        data_.a.size = data_.a.capacity = count;
 1669|  2.75k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9RawAssignERS7_:
 1708|  2.73k|    void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT {
 1709|  2.73k|        data_ = rhs.data_;
 1710|  2.73k|        flags_ = rhs.flags_;
 1711|  2.73k|        rhs.flags_ = kNullFlag;
 1712|  2.73k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E16ClearStackOnExitD2Ev:
 1934|  4.04k|        ~ClearStackOnExit() { d_.ClearStack(); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E10ClearStackEv:
 1999|  4.04k|    void ClearStack() {
 2000|  4.04k|        if (Allocator::kNeedFree)
  ------------------
  |  Branch (2000:13): [Folded, False: 4.04k]
  ------------------
 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.04k|        else
 2004|  4.04k|            stack_.Clear();
 2005|  4.04k|        stack_.ShrinkToFit();
 2006|  4.04k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E5ParseILj4EEERS7_PKc:
 1898|  4.04k|    GenericDocument& Parse(const Ch* str) {
 1899|  4.04k|        return Parse<parseFlags, Encoding>(str);
 1900|  4.04k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E5ParseILj4ES3_EERS7_PKc:
 1887|  4.04k|    GenericDocument& Parse(const Ch* str) {
 1888|       |        RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
  ------------------
  |  |  351|  4.04k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1889|  4.04k|        GenericStringStream<SourceEncoding> s(str);
 1890|  4.04k|        return ParseStream<parseFlags, SourceEncoding>(s);
 1891|  4.04k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E11ParseStreamILj4ES3_NS0_19GenericStringStreamIS3_EEEERS7_RT1_:
 1821|  4.04k|    GenericDocument& ParseStream(InputStream& is) {
 1822|  4.04k|        ValueType::SetNull(); // Remove existing root if exist
 1823|  4.04k|        GenericReader<SourceEncoding, Encoding, StackAllocator> reader(&stack_.GetAllocator());
 1824|  4.04k|        ClearStackOnExit scope(*this);
 1825|  4.04k|        parseResult_ = reader.template Parse<parseFlags>(is, *this);
 1826|  4.04k|        if (parseResult_) {
  ------------------
  |  Branch (1826:13): [True: 2.73k, False: 1.30k]
  ------------------
 1827|       |            RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
  ------------------
  |  |  351|  2.73k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1828|  2.73k|            this->RawAssign(*stack_.template Pop<ValueType>(1));    // Add this-> to prevent issue 13.
 1829|  2.73k|        }
 1830|  4.04k|        return *this;
 1831|  4.04k|    }
_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|  75.9k|    SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((flags_ & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
  ------------------
  |  |  351|  75.9k|#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.69k|    bool IsArray()  const { return flags_ == kArrayFlag; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsObjectEv:
  769|  10.3k|    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.75k|    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.75k, False: 26.7k]
  ------------------
  943|  9.75k|                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.7k|    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.04k|        allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
 1762|  4.04k|    {
 1763|  4.04k|        if (!allocator_)
  ------------------
  |  Branch (1763:13): [True: 4.04k, False: 0]
  ------------------
 1764|  4.04k|            ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  4.04k|#define RAPIDJSON_NEW(x) new x
  ------------------
 1765|  4.04k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_ED2Ev:
 1782|  4.04k|    ~GenericDocument() {
 1783|  4.04k|        Destroy();
 1784|  4.04k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E7DestroyEv:
 2008|  4.04k|    void Destroy() {
 2009|  4.04k|        RAPIDJSON_DELETE(ownAllocator_);
  ------------------
  |  |  495|  4.04k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
 2010|  4.04k|    }
_ZNK5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E13HasParseErrorEv:
 1914|  4.04k|    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.91k|    static void Encode(OutputStream& os, unsigned codepoint) {
  103|  1.91k|        if (codepoint <= 0x7F) 
  ------------------
  |  Branch (103:13): [True: 430, False: 1.48k]
  ------------------
  104|    430|            os.Put(static_cast<Ch>(codepoint & 0xFF));
  105|  1.48k|        else if (codepoint <= 0x7FF) {
  ------------------
  |  Branch (105:18): [True: 407, False: 1.07k]
  ------------------
  106|    407|            os.Put(static_cast<Ch>(0xC0 | ((codepoint >> 6) & 0xFF)));
  107|    407|            os.Put(static_cast<Ch>(0x80 | ((codepoint & 0x3F))));
  108|    407|        }
  109|  1.07k|        else if (codepoint <= 0xFFFF) {
  ------------------
  |  Branch (109:18): [True: 768, False: 308]
  ------------------
  110|    768|            os.Put(static_cast<Ch>(0xE0 | ((codepoint >> 12) & 0xFF)));
  111|    768|            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
  112|    768|            os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));
  113|    768|        }
  114|    308|        else {
  115|       |            RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);
  ------------------
  |  |  351|    308|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  116|    308|            os.Put(static_cast<Ch>(0xF0 | ((codepoint >> 18) & 0xFF)));
  117|    308|            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 12) & 0x3F)));
  118|    308|            os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
  119|    308|            os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));
  120|    308|        }
  121|  1.91k|    }
_ZN5butil9rapidjson10TranscoderINS0_4UTF8IcEES3_E9TranscodeINS0_19GenericStringStreamIS3_EENS0_13GenericReaderIS3_S3_NS0_12CrtAllocatorEE11StackStreamIcEEEEbRT_RT0_:
  608|  96.6k|    RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) {
  609|  96.6k|        os.Put(is.Take());  // Just copy one code unit. This semantic is different from primary template class.
  610|  96.6k|        return true;
  611|  96.6k|    }

_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|     15|        case kParseErrorDocumentEmpty:                  return RAPIDJSON_ERROR_STRING("The document is empty.");
  ------------------
  |  |   47|     15|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (34:9): [True: 15, False: 1.29k]
  ------------------
   35|     88|        case kParseErrorDocumentRootNotSingular:        return RAPIDJSON_ERROR_STRING("The document root must not follow by other values.");
  ------------------
  |  |   47|     88|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (35:9): [True: 88, False: 1.22k]
  ------------------
   36|       |    
   37|    163|        case kParseErrorValueInvalid:                   return RAPIDJSON_ERROR_STRING("Invalid value.");
  ------------------
  |  |   47|    163|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (37:9): [True: 163, False: 1.14k]
  ------------------
   38|       |    
   39|     56|        case kParseErrorObjectMissName:                 return RAPIDJSON_ERROR_STRING("Missing a name for object member.");
  ------------------
  |  |   47|     56|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (39:9): [True: 56, False: 1.25k]
  ------------------
   40|     30|        case kParseErrorObjectMissColon:                return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member.");
  ------------------
  |  |   47|     30|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (40:9): [True: 30, False: 1.27k]
  ------------------
   41|      9|        case kParseErrorObjectMissCommaOrCurlyBracket:  return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member.");
  ------------------
  |  |   47|      9|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (41:9): [True: 9, False: 1.29k]
  ------------------
   42|       |    
   43|    392|        case kParseErrorArrayMissCommaOrSquareBracket:  return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element.");
  ------------------
  |  |   47|    392|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (43:9): [True: 392, False: 916]
  ------------------
   44|       |
   45|    179|        case kParseErrorStringUnicodeEscapeInvalidHex:  return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string.");
  ------------------
  |  |   47|    179|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (45:9): [True: 179, False: 1.12k]
  ------------------
   46|     63|        case kParseErrorStringUnicodeSurrogateInvalid:  return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid.");
  ------------------
  |  |   47|     63|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (46:9): [True: 63, False: 1.24k]
  ------------------
   47|     16|        case kParseErrorStringEscapeInvalid:            return RAPIDJSON_ERROR_STRING("Invalid escape character in string.");
  ------------------
  |  |   47|     16|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (47:9): [True: 16, False: 1.29k]
  ------------------
   48|    152|        case kParseErrorStringMissQuotationMark:        return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string.");
  ------------------
  |  |   47|    152|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (48:9): [True: 152, False: 1.15k]
  ------------------
   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|      2|        case kParseErrorNumberTooBig:                   return RAPIDJSON_ERROR_STRING("Number too big to be stored in double.");
  ------------------
  |  |   47|      2|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (51:9): [True: 2, False: 1.30k]
  ------------------
   52|     17|        case kParseErrorNumberMissFraction:             return RAPIDJSON_ERROR_STRING("Miss fraction part in number.");
  ------------------
  |  |   47|     17|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (52:9): [True: 17, False: 1.29k]
  ------------------
   53|     75|        case kParseErrorNumberMissExponent:             return RAPIDJSON_ERROR_STRING("Miss exponent in number.");
  ------------------
  |  |   47|     75|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (53:9): [True: 75, False: 1.23k]
  ------------------
   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|     51|        case kParseErrorUnspecificSyntaxError:          return RAPIDJSON_ERROR_STRING("Unspecific syntax error.");
  ------------------
  |  |   47|     51|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (56:9): [True: 51, False: 1.25k]
  ------------------
   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.08k|    ParseResult() : code_(kParseErrorNone), offset_(0) {}
_ZN5butil9rapidjson11ParseResult5ClearEv:
  124|  4.04k|    void Clear() { Set(kParseErrorNone); }
_ZN5butil9rapidjson11ParseResult3SetENS0_14ParseErrorCodeEm:
  126|  5.35k|    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.04k|    operator bool() const { return !IsError(); }
_ZNK5butil9rapidjson11ParseResult4CodeEv:
  110|  1.30k|    ParseErrorCode Code() const { return code_; }

_ZN5butil9rapidjson8internal5Pow10Ei:
   28|  4.88k|inline double Pow10(int n) {
   29|  4.88k|    static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes
   30|  4.88k|        1e+0,  
   31|  4.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        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.88k|        1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308
   47|  4.88k|    };
   48|       |    RAPIDJSON_ASSERT(n >= 0 && n <= 308);
  ------------------
  |  |  351|  4.88k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
   49|  4.88k|    return e[n];
   50|  4.88k|}

_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE12GetAllocatorEv:
  127|  4.04k|    Allocator& GetAllocator() { return *allocator_; }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEEC2EPS3_m:
   34|  8.08k|    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.08k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
   36|  8.08k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEED2Ev:
   56|  8.08k|    ~Stack() {
   57|  8.08k|        Destroy();
   58|  8.08k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE7DestroyEv:
  159|  8.08k|    void Destroy() {
  160|  8.08k|        Allocator::Free(stack_);
  161|  8.08k|        RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack
  ------------------
  |  |  495|  8.08k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
  162|  8.08k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushIjEEPT_m:
  101|  82.8k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|  82.8k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 2.88k, False: 79.9k]
  ------------------
  104|  2.88k|            Expand<T>(count);
  105|       |
  106|  82.8k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|  82.8k|        stackTop_ += sizeof(T) * count;
  108|  82.8k|        return ret;
  109|  82.8k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandIjEEvm:
  134|  2.88k|    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.88k|        size_t newCapacity;
  137|  2.88k|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 2.27k, False: 614]
  ------------------
  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|    614|            newCapacity = GetCapacity();
  143|    614|            newCapacity += (newCapacity + 1) / 2;
  144|    614|        }
  145|  2.88k|        size_t newSize = GetSize() + sizeof(T) * count;
  146|  2.88k|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 2.88k]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|  2.88k|        Resize(newCapacity);
  150|  2.88k|    }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE11GetCapacityEv:
  130|  9.08k|    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|  77.1k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|  77.1k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 4.30k, False: 72.8k]
  ------------------
  104|  4.30k|            Expand<T>(count);
  105|       |
  106|  77.1k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|  77.1k|        stackTop_ += sizeof(T) * count;
  108|  77.1k|        return ret;
  109|  77.1k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEvm:
  134|  4.30k|    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.30k|        size_t newCapacity;
  137|  4.30k|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 3.47k, False: 836]
  ------------------
  138|  3.47k|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 3.47k, False: 0]
  ------------------
  139|  3.47k|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  3.47k|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|  3.47k|            newCapacity = initialCapacity_;
  141|  3.47k|        } else {
  142|    836|            newCapacity = GetCapacity();
  143|    836|            newCapacity += (newCapacity + 1) / 2;
  144|    836|        }
  145|  4.30k|        size_t newSize = GetSize() + sizeof(T) * count;
  146|  4.30k|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 4.30k]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|  4.30k|        Resize(newCapacity);
  150|  4.30k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushIcEEPT_m:
  101|   117k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|   117k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 336, False: 116k]
  ------------------
  104|    336|            Expand<T>(count);
  105|       |
  106|   117k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|   117k|        stackTop_ += sizeof(T) * count;
  108|   117k|        return ret;
  109|   117k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandIcEEvm:
  134|    336|    void Expand(size_t count) {
  135|       |        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.
  136|    336|        size_t newCapacity;
  137|    336|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 229, False: 107]
  ------------------
  138|    229|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 229, False: 0]
  ------------------
  139|    229|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|    229|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|    229|            newCapacity = initialCapacity_;
  141|    229|        } else {
  142|    107|            newCapacity = GetCapacity();
  143|    107|            newCapacity += (newCapacity + 1) / 2;
  144|    107|        }
  145|    336|        size_t newSize = GetSize() + sizeof(T) * count;
  146|    336|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 336]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|    336|        Resize(newCapacity);
  150|    336|    }
_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|  43.2k|    T* Top() { 
  120|       |        RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
  ------------------
  |  |  351|  43.2k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  121|  43.2k|        return reinterpret_cast<T*>(stackTop_ - sizeof(T));
  122|  43.2k|    }
_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.68k|    T* Pop(size_t count) {
  113|       |        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  6.68k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  114|  6.68k|        stackTop_ -= count * sizeof(T);
  115|  6.68k|        return reinterpret_cast<T*>(stackTop_);
  116|  6.68k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3TopINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_v:
  119|  9.43k|    T* Top() { 
  120|       |        RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
  ------------------
  |  |  351|  9.43k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  121|  9.43k|        return reinterpret_cast<T*>(stackTop_ - sizeof(T));
  122|  9.43k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE5ClearEv:
   84|  8.08k|    void Clear() { stackTop_ = stack_; }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_m:
  112|  5.48k|    T* Pop(size_t count) {
  113|       |        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  5.48k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  114|  5.48k|        stackTop_ -= count * sizeof(T);
  115|  5.48k|        return reinterpret_cast<T*>(stackTop_);
  116|  5.48k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE11ShrinkToFitEv:
   86|  4.04k|    void ShrinkToFit() { 
   87|  4.04k|        if (Empty()) {
  ------------------
  |  Branch (87:13): [True: 4.04k, False: 0]
  ------------------
   88|       |            // If the stack is empty, completely deallocate the memory.
   89|  4.04k|            Allocator::Free(stack_);
   90|  4.04k|            stack_ = 0;
   91|  4.04k|            stackTop_ = 0;
   92|  4.04k|            stackEnd_ = 0;
   93|  4.04k|        }
   94|      0|        else
   95|      0|            Resize(GetSize());
   96|  4.04k|    }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE5EmptyEv:
  128|  4.04k|    bool Empty() const { return stackTop_ == stack_; }

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

_ZN5butil9rapidjson8internal21StrtodNormalPrecisionEdi:
   36|  4.68k|inline double StrtodNormalPrecision(double d, int p) {
   37|  4.68k|    if (p < -308) {
  ------------------
  |  Branch (37:9): [True: 577, False: 4.10k]
  ------------------
   38|       |        // Prevent expSum < -308, making Pow10(p) = 0
   39|    577|        d = FastPath(d, -308);
   40|    577|        d = FastPath(d, p + 308);
   41|    577|    }
   42|  4.10k|    else
   43|  4.10k|        d = FastPath(d, p);
   44|  4.68k|    return d;
   45|  4.68k|}
_ZN5butil9rapidjson8internal8FastPathEdi:
   27|  5.26k|inline double FastPath(double significand, int exp) {
   28|  5.26k|    if (exp < -308)
  ------------------
  |  Branch (28:9): [True: 374, False: 4.88k]
  ------------------
   29|    374|        return 0.0;
   30|  4.88k|    else if (exp >= 0)
  ------------------
  |  Branch (30:14): [True: 2.68k, False: 2.20k]
  ------------------
   31|  2.68k|        return significand * internal::Pow10(exp);
   32|  2.20k|    else
   33|  2.20k|        return significand / internal::Pow10(-exp);
   34|  5.26k|}

_ZN5butil9rapidjson19GenericStringStreamINS0_4UTF8IcEEEC2EPKc:
  585|  4.04k|    GenericStringStream(const Ch *src) : src_(src), head_(src) {}
_ZN5butil9rapidjson19GenericStringStreamINS0_4UTF8IcEEE4TakeEv:
  588|   310k|    Ch Take() { return *src_++; }
_ZNK5butil9rapidjson19GenericStringStreamINS0_4UTF8IcEEE4PeekEv:
  587|  1.13M|    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.04k|        : stack_(stackAllocator, stackCapacity), parseResult_() {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE16ClearStackOnExitC2ERS5_:
  477|  4.04k|        explicit ClearStackOnExit(GenericReader& r) : r_(r) {}
_ZN5butil9rapidjson14SkipWhitespaceINS0_19GenericStringStreamINS0_4UTF8IcEEEEEEvRT_:
  261|   124k|void SkipWhitespace(InputStream& is) {
  262|   124k|    internal::StreamLocalCopy<InputStream> copy(is);
  263|   124k|    InputStream& s(copy.s);
  264|       |
  265|   125k|    while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t')
  ------------------
  |  Branch (265:12): [True: 401, False: 124k]
  |  Branch (265:31): [True: 407, False: 124k]
  |  Branch (265:51): [True: 351, False: 124k]
  |  Branch (265:71): [True: 44, False: 124k]
  ------------------
  266|  1.20k|        s.Take();
  267|   124k|}
_ZN5butil9rapidjson8internal15StreamLocalCopyINS0_19GenericStringStreamINS0_4UTF8IcEEEELi1EEC2ERS6_:
  228|   158k|    StreamLocalCopy(Stream& original) : s(original), original_(original) {}
_ZN5butil9rapidjson8internal15StreamLocalCopyINS0_19GenericStringStreamINS0_4UTF8IcEEEELi1EED2Ev:
  229|   158k|    ~StreamLocalCopy() { original_ = s; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE8TokenizeEc:
 1165|   120k|    RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
 1166|       |
 1167|       |//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
 1168|   120k|#define N NumberToken
 1169|   120k|#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|   120k|        static const unsigned char tokenMap[256] = {
 1172|   120k|            N16, // 00~0F
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
 1173|   120k|            N16, // 10~1F
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
 1174|   120k|            N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
 1175|   120k|            N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
 1176|   120k|            N16, // 40~4F
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
 1177|   120k|            N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
 1178|   120k|            N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
 1179|   120k|            N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   120k|#define N NumberToken
  ------------------
 1180|   120k|            N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   120k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   120k|#define N NumberToken
  |  |  ------------------
  ------------------
 1181|   120k|        };
 1182|   120k|#undef N
 1183|   120k|#undef N16
 1184|       |//!@endcond
 1185|       |        
 1186|   120k|        if (sizeof(Ch) == 1 || unsigned(c) < 256)
  ------------------
  |  Branch (1186:13): [True: 120k, Folded]
  |  Branch (1186:32): [True: 0, False: 0]
  ------------------
 1187|   120k|            return (Token)tokenMap[(unsigned char)c];
 1188|      0|        else
 1189|      0|            return NumberToken;
 1190|   120k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE7PredictENS5_21IterativeParsingStateENS5_5TokenE:
 1192|   120k|    RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
 1193|       |        // current state x one lookahead token -> new state
 1194|   120k|        static const char G[cIterativeParsingStateCount][kTokenCount] = {
 1195|       |            // Start
 1196|   120k|            {
 1197|   120k|                IterativeParsingArrayInitialState,  // Left bracket
 1198|   120k|                IterativeParsingErrorState,         // Right bracket
 1199|   120k|                IterativeParsingObjectInitialState, // Left curly bracket
 1200|   120k|                IterativeParsingErrorState,         // Right curly bracket
 1201|   120k|                IterativeParsingErrorState,         // Comma
 1202|   120k|                IterativeParsingErrorState,         // Colon
 1203|   120k|                IterativeParsingValueState,         // String
 1204|   120k|                IterativeParsingValueState,         // False
 1205|   120k|                IterativeParsingValueState,         // True
 1206|   120k|                IterativeParsingValueState,         // Null
 1207|   120k|                IterativeParsingValueState          // Number
 1208|   120k|            },
 1209|       |            // Finish(sink state)
 1210|   120k|            {
 1211|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1212|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1213|   120k|                IterativeParsingErrorState
 1214|   120k|            },
 1215|       |            // Error(sink state)
 1216|   120k|            {
 1217|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1218|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1219|   120k|                IterativeParsingErrorState
 1220|   120k|            },
 1221|       |            // ObjectInitial
 1222|   120k|            {
 1223|   120k|                IterativeParsingErrorState,         // Left bracket
 1224|   120k|                IterativeParsingErrorState,         // Right bracket
 1225|   120k|                IterativeParsingErrorState,         // Left curly bracket
 1226|   120k|                IterativeParsingObjectFinishState,  // Right curly bracket
 1227|   120k|                IterativeParsingErrorState,         // Comma
 1228|   120k|                IterativeParsingErrorState,         // Colon
 1229|   120k|                IterativeParsingMemberKeyState,     // String
 1230|   120k|                IterativeParsingErrorState,         // False
 1231|   120k|                IterativeParsingErrorState,         // True
 1232|   120k|                IterativeParsingErrorState,         // Null
 1233|   120k|                IterativeParsingErrorState          // Number
 1234|   120k|            },
 1235|       |            // MemberKey
 1236|   120k|            {
 1237|   120k|                IterativeParsingErrorState,             // Left bracket
 1238|   120k|                IterativeParsingErrorState,             // Right bracket
 1239|   120k|                IterativeParsingErrorState,             // Left curly bracket
 1240|   120k|                IterativeParsingErrorState,             // Right curly bracket
 1241|   120k|                IterativeParsingErrorState,             // Comma
 1242|   120k|                IterativeParsingKeyValueDelimiterState, // Colon
 1243|   120k|                IterativeParsingErrorState,             // String
 1244|   120k|                IterativeParsingErrorState,             // False
 1245|   120k|                IterativeParsingErrorState,             // True
 1246|   120k|                IterativeParsingErrorState,             // Null
 1247|   120k|                IterativeParsingErrorState              // Number
 1248|   120k|            },
 1249|       |            // KeyValueDelimiter
 1250|   120k|            {
 1251|   120k|                IterativeParsingArrayInitialState,      // Left bracket(push MemberValue state)
 1252|   120k|                IterativeParsingErrorState,             // Right bracket
 1253|   120k|                IterativeParsingObjectInitialState,     // Left curly bracket(push MemberValue state)
 1254|   120k|                IterativeParsingErrorState,             // Right curly bracket
 1255|   120k|                IterativeParsingErrorState,             // Comma
 1256|   120k|                IterativeParsingErrorState,             // Colon
 1257|   120k|                IterativeParsingMemberValueState,       // String
 1258|   120k|                IterativeParsingMemberValueState,       // False
 1259|   120k|                IterativeParsingMemberValueState,       // True
 1260|   120k|                IterativeParsingMemberValueState,       // Null
 1261|   120k|                IterativeParsingMemberValueState        // Number
 1262|   120k|            },
 1263|       |            // MemberValue
 1264|   120k|            {
 1265|   120k|                IterativeParsingErrorState,             // Left bracket
 1266|   120k|                IterativeParsingErrorState,             // Right bracket
 1267|   120k|                IterativeParsingErrorState,             // Left curly bracket
 1268|   120k|                IterativeParsingObjectFinishState,      // Right curly bracket
 1269|   120k|                IterativeParsingMemberDelimiterState,   // Comma
 1270|   120k|                IterativeParsingErrorState,             // Colon
 1271|   120k|                IterativeParsingErrorState,             // String
 1272|   120k|                IterativeParsingErrorState,             // False
 1273|   120k|                IterativeParsingErrorState,             // True
 1274|   120k|                IterativeParsingErrorState,             // Null
 1275|   120k|                IterativeParsingErrorState              // Number
 1276|   120k|            },
 1277|       |            // MemberDelimiter
 1278|   120k|            {
 1279|   120k|                IterativeParsingErrorState,         // Left bracket
 1280|   120k|                IterativeParsingErrorState,         // Right bracket
 1281|   120k|                IterativeParsingErrorState,         // Left curly bracket
 1282|   120k|                IterativeParsingErrorState,         // Right curly bracket
 1283|   120k|                IterativeParsingErrorState,         // Comma
 1284|   120k|                IterativeParsingErrorState,         // Colon
 1285|   120k|                IterativeParsingMemberKeyState,     // String
 1286|   120k|                IterativeParsingErrorState,         // False
 1287|   120k|                IterativeParsingErrorState,         // True
 1288|   120k|                IterativeParsingErrorState,         // Null
 1289|   120k|                IterativeParsingErrorState          // Number
 1290|   120k|            },
 1291|       |            // ObjectFinish(sink state)
 1292|   120k|            {
 1293|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1294|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1295|   120k|                IterativeParsingErrorState
 1296|   120k|            },
 1297|       |            // ArrayInitial
 1298|   120k|            {
 1299|   120k|                IterativeParsingArrayInitialState,      // Left bracket(push Element state)
 1300|   120k|                IterativeParsingArrayFinishState,       // Right bracket
 1301|   120k|                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)
 1302|   120k|                IterativeParsingErrorState,             // Right curly bracket
 1303|   120k|                IterativeParsingErrorState,             // Comma
 1304|   120k|                IterativeParsingErrorState,             // Colon
 1305|   120k|                IterativeParsingElementState,           // String
 1306|   120k|                IterativeParsingElementState,           // False
 1307|   120k|                IterativeParsingElementState,           // True
 1308|   120k|                IterativeParsingElementState,           // Null
 1309|   120k|                IterativeParsingElementState            // Number
 1310|   120k|            },
 1311|       |            // Element
 1312|   120k|            {
 1313|   120k|                IterativeParsingErrorState,             // Left bracket
 1314|   120k|                IterativeParsingArrayFinishState,       // Right bracket
 1315|   120k|                IterativeParsingErrorState,             // Left curly bracket
 1316|   120k|                IterativeParsingErrorState,             // Right curly bracket
 1317|   120k|                IterativeParsingElementDelimiterState,  // Comma
 1318|   120k|                IterativeParsingErrorState,             // Colon
 1319|   120k|                IterativeParsingErrorState,             // String
 1320|   120k|                IterativeParsingErrorState,             // False
 1321|   120k|                IterativeParsingErrorState,             // True
 1322|   120k|                IterativeParsingErrorState,             // Null
 1323|   120k|                IterativeParsingErrorState              // Number
 1324|   120k|            },
 1325|       |            // ElementDelimiter
 1326|   120k|            {
 1327|   120k|                IterativeParsingArrayInitialState,      // Left bracket(push Element state)
 1328|   120k|                IterativeParsingErrorState,             // Right bracket
 1329|   120k|                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)
 1330|   120k|                IterativeParsingErrorState,             // Right curly bracket
 1331|   120k|                IterativeParsingErrorState,             // Comma
 1332|   120k|                IterativeParsingErrorState,             // Colon
 1333|   120k|                IterativeParsingElementState,           // String
 1334|   120k|                IterativeParsingElementState,           // False
 1335|   120k|                IterativeParsingElementState,           // True
 1336|   120k|                IterativeParsingElementState,           // Null
 1337|   120k|                IterativeParsingElementState            // Number
 1338|   120k|            },
 1339|       |            // ArrayFinish(sink state)
 1340|   120k|            {
 1341|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1342|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1343|   120k|                IterativeParsingErrorState
 1344|   120k|            },
 1345|       |            // Single Value (sink state)
 1346|   120k|            {
 1347|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1348|   120k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1349|   120k|                IterativeParsingErrorState
 1350|   120k|            }
 1351|   120k|        }; // End of G
 1352|       |
 1353|   120k|        return (IterativeParsingState)G[state][token];
 1354|   120k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcEC2ERNS0_8internal5StackIS4_EE:
  637|  15.9k|        StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcE3PutEc:
  638|   117k|        RAPIDJSON_FORCEINLINE void Put(Ch c) {
  639|   117k|            *stack_.template Push<Ch>() = c;
  640|   117k|            ++length_;
  641|   117k|        }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseHex4INS0_19GenericStringStreamIS3_EEEEjRT_:
  612|  2.50k|    unsigned ParseHex4(InputStream& is) {
  613|  2.50k|        unsigned codepoint = 0;
  614|  12.1k|        for (int i = 0; i < 4; i++) {
  ------------------
  |  Branch (614:25): [True: 9.77k, False: 2.32k]
  ------------------
  615|  9.77k|            Ch c = is.Take();
  616|  9.77k|            codepoint <<= 4;
  617|  9.77k|            codepoint += static_cast<unsigned>(c);
  618|  9.77k|            if (c >= '0' && c <= '9')
  ------------------
  |  Branch (618:17): [True: 9.66k, False: 115]
  |  Branch (618:29): [True: 3.71k, False: 5.94k]
  ------------------
  619|  3.71k|                codepoint -= '0';
  620|  6.05k|            else if (c >= 'A' && c <= 'F')
  ------------------
  |  Branch (620:22): [True: 5.92k, False: 134]
  |  Branch (620:34): [True: 2.94k, False: 2.98k]
  ------------------
  621|  2.94k|                codepoint -= 'A' - 10;
  622|  3.11k|            else if (c >= 'a' && c <= 'f')
  ------------------
  |  Branch (622:22): [True: 2.96k, False: 158]
  |  Branch (622:34): [True: 2.93k, False: 21]
  ------------------
  623|  2.93k|                codepoint -= 'a' - 10;
  624|    179|            else {
  625|    179|                RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, is.Tell() - 1);
  ------------------
  |  |   91|    179|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    179|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|    179|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|    179|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|    179|    SetParseError(parseErrorCode, offset); \
  |  |   94|    179|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    179|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    179|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 179]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  626|    179|                RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
  ------------------
  |  |   51|    179|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    179|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   52|    179|    if (HasParseError()) { return value; } \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 179, False: 0]
  |  |  ------------------
  |  |   53|    179|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    179|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    179|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  627|    179|            }
  628|  9.77k|        }
  629|  2.32k|        return codepoint;
  630|  2.50k|    }
_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.1k|    bool HasParseError() const { return parseResult_.IsError(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EEC2ERS5_RS8_:
  850|  18.2k|        NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader;  }
_ZNK5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4PeekEv:
  853|   252k|        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|  57.3k|        RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4TellEv:
  856|    140|        size_t Tell() { return is.Tell(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE6LengthEv:
  857|  36.2k|        size_t Length() { return 0; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE3PopEv:
  858|  18.1k|        const char* Pop() { return 0; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EED2Ev:
  851|  18.2k|        ~NumberStream() {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11HandleErrorINS0_19GenericStringStreamIS3_EEEEvNS5_21IterativeParsingStateERT_:
 1501|  2.00k|    void HandleError(IterativeParsingState src, InputStream& is) {
 1502|  2.00k|        if (HasParseError()) {
  ------------------
  |  Branch (1502:13): [True: 1.36k, False: 641]
  ------------------
 1503|       |            // Error flag has been set.
 1504|  1.36k|            return;
 1505|  1.36k|        }
 1506|       |        
 1507|    641|        switch (src) {
 1508|     15|        case IterativeParsingStartState:            RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return;
  ------------------
  |  |  110|     15|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     15|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     15|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     15|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     15|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     15|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     15|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     15|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     15|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     15|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     15|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 15]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     15|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     15|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     15|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     15|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     15|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 15, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     15|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     15|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     15|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     15|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     15|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     15|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1508:9): [True: 15, False: 626]
  ------------------
 1509|     88|        case IterativeParsingFinishState:           RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return;
  ------------------
  |  |  110|     88|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     88|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     88|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     88|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     88|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     88|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     88|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     88|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     88|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     88|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     88|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 88]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     88|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     88|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     88|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     88|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     88|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 88, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     88|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     88|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     88|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     88|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     88|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     88|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1509:9): [True: 88, False: 553]
  ------------------
 1510|     47|        case IterativeParsingObjectInitialState:
  ------------------
  |  Branch (1510:9): [True: 47, False: 594]
  ------------------
 1511|     56|        case IterativeParsingMemberDelimiterState:  RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return;
  ------------------
  |  |  110|     56|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     56|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     56|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     56|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     56|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     56|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     56|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     56|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     56|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     56|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     56|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 56]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     56|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     56|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     56|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     56|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     56|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 56, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     56|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     56|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     56|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     56|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     56|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     56|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1511:9): [True: 9, False: 632]
  ------------------
 1512|     30|        case IterativeParsingMemberKeyState:        RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return;
  ------------------
  |  |  110|     30|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     30|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     30|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     30|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     30|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     30|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     30|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     30|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     30|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     30|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     30|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 30]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     30|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     30|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     30|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     30|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     30|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 30, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     30|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     30|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     30|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     30|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     30|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     30|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1512:9): [True: 30, False: 611]
  ------------------
 1513|      9|        case IterativeParsingMemberValueState:      RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return;
  ------------------
  |  |  110|      9|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      9|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|      9|    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|      9|    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|      9|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      9|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      9|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1513:9): [True: 9, False: 632]
  ------------------
 1514|    392|        case IterativeParsingElementState:          RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return;
  ------------------
  |  |  110|    392|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    392|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    392|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|    392|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    392|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|    392|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|    392|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|    392|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|    392|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    392|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    392|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 392]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    392|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|    392|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    392|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|    392|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    392|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 392, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    392|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|    392|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|    392|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    392|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    392|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    392|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1514:9): [True: 392, False: 249]
  ------------------
 1515|     51|        default:                                    RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell());
  ------------------
  |  |  110|     51|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     51|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     51|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     51|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     51|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     51|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     51|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     51|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     51|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     51|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     51|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 51]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     51|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     51|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     51|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     51|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     51|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 51, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     51|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     51|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     51|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     51|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     51|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     51|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1515:9): [True: 51, False: 590]
  ------------------
 1516|    641|        }       
 1517|    641|    }
_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.04k|        ~ClearStackOnExit() { r_.ClearStack(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ClearStackEv:
  473|  4.04k|    void ClearStack() { stack_.Clear(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE5ParseILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEENS0_11ParseResultERT0_RT1_:
  408|  4.04k|    ParseResult Parse(InputStream& is, Handler& handler) {
  409|  4.04k|        if (parseFlags & kParseIterativeFlag)
  ------------------
  |  Branch (409:13): [True: 4.04k, Folded]
  ------------------
  410|  4.04k|            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.04k|    ParseResult IterativeParse(InputStream& is, Handler& handler) {
 1521|  4.04k|        parseResult_.Clear();
 1522|  4.04k|        ClearStackOnExit scope(*this);
 1523|  4.04k|        IterativeParsingState state = IterativeParsingStartState;
 1524|       |
 1525|  4.04k|        SkipWhitespace(is);
 1526|   124k|        while (is.Peek() != '\0') {
  ------------------
  |  Branch (1526:16): [True: 120k, False: 3.25k]
  ------------------
 1527|   120k|            Token t = Tokenize(is.Peek());
 1528|   120k|            IterativeParsingState n = Predict(state, t);
 1529|   120k|            IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
 1530|       |
 1531|   120k|            if (d == IterativeParsingErrorState) {
  ------------------
  |  Branch (1531:17): [True: 788, False: 119k]
  ------------------
 1532|    788|                HandleError(state, is);
 1533|    788|                break;
 1534|    788|            }
 1535|       |
 1536|   119k|            state = d;
 1537|       |
 1538|       |            // Do not further consume streams if a root JSON has been parsed.
 1539|   119k|            if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) {
  ------------------
  |  Branch (1539:17): [Folded, False: 119k]
  |  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|   119k|            SkipWhitespace(is);
 1549|   119k|        }
 1550|       |
 1551|       |        // Handle the end of file.
 1552|  4.04k|        if (state != IterativeParsingFinishState)
  ------------------
  |  Branch (1552:13): [True: 1.22k, False: 2.82k]
  ------------------
 1553|  1.22k|            HandleError(state, is);
 1554|       |
 1555|  4.04k|        return parseResult_;
 1556|  4.04k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE7TransitILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEENS5_21IterativeParsingStateESD_NS5_5TokenESD_RT0_RT1_:
 1359|   120k|    RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
 1360|   120k|        (void)token;
 1361|       |
 1362|   120k|        switch (dst) {
 1363|    121|        case IterativeParsingErrorState:
  ------------------
  |  Branch (1363:9): [True: 121, False: 120k]
  ------------------
 1364|    121|            return dst;
 1365|       |
 1366|  7.40k|        case IterativeParsingObjectInitialState:
  ------------------
  |  Branch (1366:9): [True: 7.40k, False: 113k]
  ------------------
 1367|  41.4k|        case IterativeParsingArrayInitialState:
  ------------------
  |  Branch (1367:9): [True: 34.0k, False: 86.7k]
  ------------------
 1368|  41.4k|        {
 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|  41.4k|            IterativeParsingState n = src;
 1372|  41.4k|            if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
  ------------------
  |  Branch (1372:17): [True: 32.5k, False: 8.89k]
  |  Branch (1372:61): [True: 3.98k, False: 4.90k]
  ------------------
 1373|  36.5k|                n = IterativeParsingElementState;
 1374|  4.90k|            else if (src == IterativeParsingKeyValueDelimiterState)
  ------------------
  |  Branch (1374:22): [True: 2.63k, False: 2.27k]
  ------------------
 1375|  2.63k|                n = IterativeParsingMemberValueState;
 1376|       |            // Push current state.
 1377|  41.4k|            *stack_.template Push<SizeType>(1) = n;
 1378|       |            // Initialize and push the member/element count.
 1379|  41.4k|            *stack_.template Push<SizeType>(1) = 0;
 1380|       |            // Call handler
 1381|  41.4k|            bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
  ------------------
  |  Branch (1381:23): [True: 7.40k, False: 34.0k]
  ------------------
 1382|       |            // On handler short circuits the parsing.
 1383|  41.4k|            if (!hr) {
  ------------------
  |  Branch (1383:17): [True: 0, False: 41.4k]
  ------------------
 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|  41.4k|            else {
 1388|  41.4k|                is.Take();
 1389|  41.4k|                return dst;
 1390|  41.4k|            }
 1391|  41.4k|        }
 1392|       |
 1393|  11.8k|        case IterativeParsingMemberKeyState:
  ------------------
  |  Branch (1393:9): [True: 11.8k, False: 108k]
  ------------------
 1394|  11.8k|            ParseString<parseFlags>(is, handler, true);
 1395|  11.8k|            if (HasParseError())
  ------------------
  |  Branch (1395:17): [True: 14, False: 11.8k]
  ------------------
 1396|     14|                return IterativeParsingErrorState;
 1397|  11.8k|            else
 1398|  11.8k|                return dst;
 1399|       |
 1400|  11.8k|        case IterativeParsingKeyValueDelimiterState:
  ------------------
  |  Branch (1400:9): [True: 11.8k, False: 108k]
  ------------------
 1401|  11.8k|            RAPIDJSON_ASSERT(token == ColonToken);
  ------------------
  |  |  351|  11.8k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1402|  11.8k|            is.Take();
 1403|  11.8k|            return dst;
 1404|       |
 1405|  9.16k|        case IterativeParsingMemberValueState:
  ------------------
  |  Branch (1405:9): [True: 9.16k, False: 111k]
  ------------------
 1406|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1407|  9.16k|            ParseValue<parseFlags>(is, handler);
 1408|  9.16k|            if (HasParseError()) {
  ------------------
  |  Branch (1408:17): [True: 2, False: 9.15k]
  ------------------
 1409|      2|                return IterativeParsingErrorState;
 1410|      2|            }
 1411|  9.15k|            return dst;
 1412|       |
 1413|  13.5k|        case IterativeParsingElementState:
  ------------------
  |  Branch (1413:9): [True: 13.5k, False: 107k]
  ------------------
 1414|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1415|  13.5k|            ParseValue<parseFlags>(is, handler);
 1416|  13.5k|            if (HasParseError()) {
  ------------------
  |  Branch (1416:17): [True: 95, False: 13.5k]
  ------------------
 1417|     95|                return IterativeParsingErrorState;
 1418|     95|            }
 1419|  13.5k|            return dst;
 1420|       |
 1421|  5.12k|        case IterativeParsingMemberDelimiterState:
  ------------------
  |  Branch (1421:9): [True: 5.12k, False: 115k]
  ------------------
 1422|  21.6k|        case IterativeParsingElementDelimiterState:
  ------------------
  |  Branch (1422:9): [True: 16.5k, False: 104k]
  ------------------
 1423|  21.6k|            is.Take();
 1424|       |            // Update member/element count.
 1425|  21.6k|            *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
 1426|  21.6k|            return dst;
 1427|       |
 1428|  6.68k|        case IterativeParsingObjectFinishState:
  ------------------
  |  Branch (1428:9): [True: 6.68k, False: 114k]
  ------------------
 1429|  6.68k|        {
 1430|       |            // Get member count.
 1431|  6.68k|            SizeType c = *stack_.template Pop<SizeType>(1);
 1432|       |            // If the object is not empty, count the last member.
 1433|  6.68k|            if (src == IterativeParsingMemberValueState)
  ------------------
  |  Branch (1433:17): [True: 6.06k, False: 621]
  ------------------
 1434|  6.06k|                ++c;
 1435|       |            // Restore the state.
 1436|  6.68k|            IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));
 1437|       |            // Transit to Finish state if this is the topmost scope.
 1438|  6.68k|            if (n == IterativeParsingStartState)
  ------------------
  |  Branch (1438:17): [True: 1.57k, False: 5.11k]
  ------------------
 1439|  1.57k|                n = IterativeParsingFinishState;
 1440|       |            // Call handler
 1441|  6.68k|            bool hr = handler.EndObject(c);
 1442|       |            // On handler short circuits the parsing.
 1443|  6.68k|            if (!hr) {
  ------------------
  |  Branch (1443:17): [True: 0, False: 6.68k]
  ------------------
 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.68k|            else {
 1448|  6.68k|                is.Take();
 1449|  6.68k|                return n;
 1450|  6.68k|            }
 1451|  6.68k|        }
 1452|       |
 1453|  2.75k|        case IterativeParsingArrayFinishState:
  ------------------
  |  Branch (1453:9): [True: 2.75k, False: 118k]
  ------------------
 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.38k, False: 364]
  ------------------
 1459|  2.38k|                ++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: 49, False: 2.70k]
  ------------------
 1464|     49|                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.75k|        default:
  ------------------
  |  Branch (1478:9): [True: 1.75k, False: 119k]
  ------------------
 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.75k|            RAPIDJSON_ASSERT(dst == IterativeParsingValueState);
  ------------------
  |  |  351|  1.75k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
 1490|       |
 1491|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1492|  1.75k|            ParseValue<parseFlags>(is, handler);
 1493|  1.75k|            if (HasParseError()) {
  ------------------
  |  Branch (1493:17): [True: 556, False: 1.20k]
  ------------------
 1494|    556|                return IterativeParsingErrorState;
 1495|    556|            }
 1496|  1.20k|            return IterativeParsingFinishState;
 1497|   120k|        }
 1498|   120k|    }
_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: 410, 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.8k, False: 3.69k]
  ------------------
  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|   114k|        for (;;) {
  801|   114k|            Ch c = is.Peek();
  802|   114k|            if (c == '\\') {    // Escape
  ------------------
  |  Branch (802:17): [True: 2.36k, False: 112k]
  ------------------
  803|  2.36k|                is.Take();
  804|  2.36k|                Ch e = is.Take();
  805|  2.36k|                if ((sizeof(Ch) == 1 || unsigned(e) < 256) && escape[(unsigned char)e]) {
  ------------------
  |  Branch (805:22): [True: 2.36k, Folded]
  |  Branch (805:41): [True: 0, False: 0]
  |  Branch (805:63): [True: 202, False: 2.16k]
  ------------------
  806|    202|                    os.Put(escape[(unsigned char)e]);
  807|    202|                }
  808|  2.16k|                else if (e == 'u') {    // Unicode
  ------------------
  |  Branch (808:26): [True: 2.15k, False: 10]
  ------------------
  809|  2.15k|                    unsigned codepoint = ParseHex4(is);
  810|  2.15k|                    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|  2.15k|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|  2.15k|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  2.15k|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|  2.15k|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 168, False: 1.98k]
  |  |  |  |  ------------------
  |  |  |  |   53|  2.15k|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|  2.15k|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|  2.15k|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 1.98k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  811|  1.98k|                    if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
  ------------------
  |  Branch (811:25): [True: 1.02k, False: 961]
  |  Branch (811:48): [True: 382, False: 644]
  ------------------
  812|       |                        // Handle UTF-16 surrogate pair
  813|    382|                        if (is.Take() != '\\' || is.Take() != 'u')
  ------------------
  |  Branch (813:29): [True: 23, False: 359]
  |  Branch (813:50): [True: 10, False: 349]
  ------------------
  814|    382|                            RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, is.Tell() - 2);
  ------------------
  |  |  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  815|    349|                        unsigned codepoint2 = ParseHex4(is);
  816|    349|                        RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|    349|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|    349|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    349|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|    349|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 11, False: 338]
  |  |  |  |  ------------------
  |  |  |  |   53|    349|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    349|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    349|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 338]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|    338|                        if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
  ------------------
  |  Branch (817:29): [True: 21, False: 317]
  |  Branch (817:52): [True: 9, False: 308]
  ------------------
  818|    338|                            RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, is.Tell() - 2);
  ------------------
  |  |  110|     60|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     30|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     60|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     30|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     30|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     30|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     30|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     30|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     30|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     30|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     30|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 30]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     60|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     30|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     30|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     30|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     30|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 30, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     30|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     30|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     30|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     60|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     30|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     30|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  819|    308|                        codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
  820|    308|                    }
  821|  1.91k|                    TEncoding::Encode(os, codepoint);
  822|  1.91k|                }
  823|     10|                else
  824|  2.16k|                    RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     20|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     10|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     20|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     10|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     10|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     10|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     10|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     10|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     10|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     10|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     10|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 10]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     20|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     10|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     10|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     10|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     10|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 10, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     10|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     10|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     10|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     20|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     10|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     10|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  825|  2.36k|            }
  826|   112k|            else if (c == '"') {    // Closing double quote
  ------------------
  |  Branch (826:22): [True: 15.5k, False: 96.8k]
  ------------------
  827|  15.5k|                is.Take();
  828|  15.5k|                os.Put('\0');   // null-terminate the string
  829|  15.5k|                return;
  830|  15.5k|            }
  831|  96.8k|            else if (c == '\0')
  ------------------
  |  Branch (831:22): [True: 152, False: 96.6k]
  ------------------
  832|  96.8k|                RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell() - 1);
  ------------------
  |  |  110|    304|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    152|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    304|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|    152|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    152|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|    152|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|    152|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|    152|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|    152|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    152|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    152|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 152]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    304|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|    152|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    152|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|    152|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    152|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 152, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    152|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|    152|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|    152|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    304|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    152|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    152|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  833|  96.6k|            else if ((unsigned)c < 0x20) // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
  ------------------
  |  Branch (833:22): [True: 6, False: 96.6k]
  ------------------
  834|  96.6k|                RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     12|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|      6|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     12|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|      6|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|      6|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|      6|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|      6|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|      6|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|      6|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|      6|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|      6|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 6]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     12|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|      6|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|      6|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      6|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      6|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 6, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      6|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      6|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      6|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     12|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      6|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      6|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  835|  96.6k|            else {
  836|  96.6k|                if (parseFlags & kParseValidateEncodingFlag ? 
  ------------------
  |  Branch (836:21): [Folded, False: 96.6k]
  |  Branch (836:21): [True: 0, False: 96.6k]
  ------------------
  837|      0|                    !Transcoder<SEncoding, TEncoding>::Validate(is, os) : 
  838|  96.6k|                    !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|  96.6k|            }
  841|   114k|        }
  842|  15.9k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ParseValueILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
 1105|  24.5k|    void ParseValue(InputStream& is, Handler& handler) {
 1106|  24.5k|        switch (is.Peek()) {
 1107|    541|            case 'n': ParseNull  <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1107:13): [True: 541, False: 23.9k]
  ------------------
 1108|  1.35k|            case 't': ParseTrue  <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1108:13): [True: 1.35k, False: 23.1k]
  ------------------
 1109|    290|            case 'f': ParseFalse <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1109:13): [True: 290, False: 24.2k]
  ------------------
 1110|  4.09k|            case '"': ParseString<parseFlags>(is, handler); break;
  ------------------
  |  Branch (1110:13): [True: 4.09k, False: 20.4k]
  ------------------
 1111|      0|            case '{': ParseObject<parseFlags>(is, handler); break;
  ------------------
  |  Branch (1111:13): [True: 0, False: 24.5k]
  ------------------
 1112|      0|            case '[': ParseArray <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1112:13): [True: 0, False: 24.5k]
  ------------------
 1113|  18.2k|            default : ParseNumber<parseFlags>(is, handler);
  ------------------
  |  Branch (1113:13): [True: 18.2k, False: 6.27k]
  ------------------
 1114|  24.5k|        }
 1115|  24.5k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseNullILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  572|    541|    void ParseNull(InputStream& is, Handler& handler) {
  573|    541|        RAPIDJSON_ASSERT(is.Peek() == 'n');
  ------------------
  |  |  351|    541|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  574|    541|        is.Take();
  575|       |
  576|    541|        if (is.Take() == 'u' && is.Take() == 'l' && is.Take() == 'l') {
  ------------------
  |  Branch (576:13): [True: 531, False: 10]
  |  Branch (576:33): [True: 519, False: 12]
  |  Branch (576:53): [True: 506, False: 13]
  ------------------
  577|    506|            if (!handler.Null())
  ------------------
  |  Branch (577:17): [True: 0, False: 506]
  ------------------
  578|    506|                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|    506|        }
  580|     35|        else
  581|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     70|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     35|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     70|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     35|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     35|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     35|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     35|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     35|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     35|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     35|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     35|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 35]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     70|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     35|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     35|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     35|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     35|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 35, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     35|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     35|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     35|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     70|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     35|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     35|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  582|    541|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseTrueILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  585|  1.35k|    void ParseTrue(InputStream& is, Handler& handler) {
  586|  1.35k|        RAPIDJSON_ASSERT(is.Peek() == 't');
  ------------------
  |  |  351|  1.35k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  587|  1.35k|        is.Take();
  588|       |
  589|  1.35k|        if (is.Take() == 'r' && is.Take() == 'u' && is.Take() == 'e') {
  ------------------
  |  Branch (589:13): [True: 1.33k, False: 11]
  |  Branch (589:33): [True: 1.32k, False: 11]
  |  Branch (589:53): [True: 1.31k, False: 12]
  ------------------
  590|  1.31k|            if (!handler.Bool(true))
  ------------------
  |  Branch (590:17): [True: 0, False: 1.31k]
  ------------------
  591|  1.31k|                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.31k|        }
  593|     34|        else
  594|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     68|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     34|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     68|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     34|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     34|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     34|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     34|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     34|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     34|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     34|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     34|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 34]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     68|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     34|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     34|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     34|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     34|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 34, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     34|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     34|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     34|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     68|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     34|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     34|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  595|  1.35k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ParseFalseILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  598|    290|    void ParseFalse(InputStream& is, Handler& handler) {
  599|    290|        RAPIDJSON_ASSERT(is.Peek() == 'f');
  ------------------
  |  |  351|    290|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  600|    290|        is.Take();
  601|       |
  602|    290|        if (is.Take() == 'a' && is.Take() == 'l' && is.Take() == 's' && is.Take() == 'e') {
  ------------------
  |  Branch (602:13): [True: 278, False: 12]
  |  Branch (602:33): [True: 266, False: 12]
  |  Branch (602:53): [True: 255, False: 11]
  |  Branch (602:73): [True: 242, False: 13]
  ------------------
  603|    242|            if (!handler.Bool(false))
  ------------------
  |  Branch (603:17): [True: 0, False: 242]
  ------------------
  604|    242|                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|    242|        }
  606|     48|        else
  607|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     96|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     48|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     96|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     48|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     48|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     48|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     48|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     48|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     48|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     48|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     48|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 48]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     96|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     48|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     48|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     48|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     48|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 48, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     48|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     48|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     48|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     96|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     48|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     48|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  608|    290|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11ParseNumberILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  890|  18.2k|    void ParseNumber(InputStream& is, Handler& handler) {
  891|  18.2k|        internal::StreamLocalCopy<InputStream> copy(is);
  892|  18.2k|        NumberStream<InputStream, (parseFlags & kParseFullPrecisionFlag) != 0> s(*this, copy.s);
  893|       |
  894|       |        // Parse minus
  895|  18.2k|        bool minus = false;
  896|  18.2k|        if (s.Peek() == '-') {
  ------------------
  |  Branch (896:13): [True: 2.14k, False: 16.0k]
  ------------------
  897|  2.14k|            minus = true;
  898|  2.14k|            s.Take();
  899|  2.14k|        }
  900|       |
  901|       |        // Parse int: zero / ( digit1-9 *DIGIT )
  902|  18.2k|        unsigned i = 0;
  903|  18.2k|        uint64_t i64 = 0;
  904|  18.2k|        bool use64bit = false;
  905|  18.2k|        int significandDigit = 0;
  906|  18.2k|        if (s.Peek() == '0') {
  ------------------
  |  Branch (906:13): [True: 3.33k, False: 14.9k]
  ------------------
  907|  3.33k|            i = 0;
  908|  3.33k|            s.TakePush();
  909|  3.33k|        }
  910|  14.9k|        else if (s.Peek() >= '1' && s.Peek() <= '9') {
  ------------------
  |  Branch (910:18): [True: 14.8k, False: 36]
  |  Branch (910:37): [True: 14.8k, False: 10]
  ------------------
  911|  14.8k|            i = static_cast<unsigned>(s.TakePush() - '0');
  912|       |
  913|  14.8k|            if (minus)
  ------------------
  |  Branch (913:17): [True: 1.81k, False: 13.0k]
  ------------------
  914|  9.38k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (914:24): [True: 8.71k, False: 675]
  |  Branch (914:43): [True: 8.32k, False: 389]
  ------------------
  915|  8.32k|                    if (i >= 214748364) { // 2^31 = 2147483648
  ------------------
  |  Branch (915:25): [True: 819, False: 7.50k]
  ------------------
  916|    819|                        if (i != 214748364 || s.Peek() > '8') {
  ------------------
  |  Branch (916:29): [True: 682, False: 137]
  |  Branch (916:47): [True: 66, False: 71]
  ------------------
  917|    748|                            i64 = i;
  918|    748|                            use64bit = true;
  919|    748|                            break;
  920|    748|                        }
  921|    819|                    }
  922|  7.57k|                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');
  923|  7.57k|                    significandDigit++;
  924|  7.57k|                }
  925|  13.0k|            else
  926|  28.0k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (926:24): [True: 20.4k, False: 7.65k]
  |  Branch (926:43): [True: 16.4k, False: 4.00k]
  ------------------
  927|  16.4k|                    if (i >= 429496729) { // 2^32 - 1 = 4294967295
  ------------------
  |  Branch (927:25): [True: 1.50k, False: 14.9k]
  ------------------
  928|  1.50k|                        if (i != 429496729 || s.Peek() > '5') {
  ------------------
  |  Branch (928:29): [True: 1.32k, False: 179]
  |  Branch (928:47): [True: 70, False: 109]
  ------------------
  929|  1.39k|                            i64 = i;
  930|  1.39k|                            use64bit = true;
  931|  1.39k|                            break;
  932|  1.39k|                        }
  933|  1.50k|                    }
  934|  15.0k|                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');
  935|  15.0k|                    significandDigit++;
  936|  15.0k|                }
  937|  14.8k|        }
  938|     46|        else
  939|  14.9k|            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
  ------------------
  |  |  110|     92|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     46|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     92|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     46|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     46|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     46|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     46|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     46|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     46|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     46|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     46|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 46]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     92|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     46|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     46|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     46|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     46|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 46, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     46|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     46|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     46|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     92|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     46|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     46|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  940|       |
  941|       |        // Parse 64bit int
  942|  18.1k|        bool useDouble = false;
  943|  18.1k|        double d = 0.0;
  944|  18.1k|        if (use64bit) {
  ------------------
  |  Branch (944:13): [True: 2.14k, False: 16.0k]
  ------------------
  945|  2.14k|            if (minus) 
  ------------------
  |  Branch (945:17): [True: 748, False: 1.39k]
  ------------------
  946|  4.99k|                while (s.Peek() >= '0' && s.Peek() <= '9') {                    
  ------------------
  |  Branch (946:24): [True: 4.54k, False: 449]
  |  Branch (946:43): [True: 4.45k, False: 86]
  ------------------
  947|  4.45k|                     if (i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC)) // 2^63 = 9223372036854775808
  ------------------
  |  |  268|  4.45k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (947:26): [True: 287, False: 4.17k]
  ------------------
  948|    287|                        if (i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8') {
  ------------------
  |  |  268|    574|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (948:29): [True: 147, False: 140]
  |  Branch (948:83): [True: 66, False: 74]
  ------------------
  949|    213|                            d = i64;
  950|    213|                            useDouble = true;
  951|    213|                            break;
  952|    213|                        }
  953|  4.24k|                    i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  954|  4.24k|                    significandDigit++;
  955|  4.24k|                }
  956|  1.39k|            else
  957|  9.93k|                while (s.Peek() >= '0' && s.Peek() <= '9') {                    
  ------------------
  |  Branch (957:24): [True: 9.13k, False: 808]
  |  Branch (957:43): [True: 8.89k, False: 238]
  ------------------
  958|  8.89k|                    if (i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999)) // 2^64 - 1 = 18446744073709551615
  ------------------
  |  |  268|  8.89k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (958:25): [True: 415, False: 8.47k]
  ------------------
  959|    415|                        if (i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5') {
  ------------------
  |  |  268|    830|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (959:29): [True: 279, False: 136]
  |  Branch (959:83): [True: 67, False: 69]
  ------------------
  960|    346|                            d = i64;
  961|    346|                            useDouble = true;
  962|    346|                            break;
  963|    346|                        }
  964|  8.54k|                    i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  965|  8.54k|                    significandDigit++;
  966|  8.54k|                }
  967|  2.14k|        }
  968|       |
  969|       |        // Force double for big integer
  970|  18.1k|        if (useDouble) {
  ------------------
  |  Branch (970:13): [True: 559, False: 17.6k]
  ------------------
  971|  1.61k|            while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (971:20): [True: 1.12k, False: 489]
  |  Branch (971:39): [True: 1.05k, False: 69]
  ------------------
  972|  1.05k|                if (d >= 1.7976931348623157e307) // DBL_MAX / 10.0
  ------------------
  |  Branch (972:21): [True: 1, False: 1.05k]
  ------------------
  973|  1.05k|                    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.05k|                d = d * 10 + (s.TakePush() - '0');
  975|  1.05k|            }
  976|    559|        }
  977|       |
  978|       |        // Parse frac = decimal-point 1*DIGIT
  979|  18.1k|        int expFrac = 0;
  980|  18.1k|        size_t decimalPosition;
  981|  18.1k|        if (s.Peek() == '.') {
  ------------------
  |  Branch (981:13): [True: 1.28k, False: 16.9k]
  ------------------
  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: 11]
  |  Branch (985:38): [True: 1.26k, False: 6]
  ------------------
  986|  1.28k|                RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell());
  ------------------
  |  |  110|     34|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     17|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     34|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     17|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     17|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     17|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     17|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     17|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     17|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     17|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     17|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 17]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     34|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     17|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     17|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     17|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     17|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 17, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     17|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     17|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     17|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     34|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     17|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     17|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  987|       |
  988|  1.26k|            if (!useDouble) {
  ------------------
  |  Branch (988:17): [True: 1.19k, False: 68]
  ------------------
  989|  1.19k|#if RAPIDJSON_64BIT
  990|       |                // Use i64 to store significand in 64-bit architecture
  991|  1.19k|                if (!use64bit)
  ------------------
  |  Branch (991:21): [True: 881, False: 315]
  ------------------
  992|    881|                    i64 = i;
  993|       |        
  994|  3.25k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (994:24): [True: 2.63k, False: 625]
  |  Branch (994:43): [True: 2.19k, False: 434]
  ------------------
  995|  2.19k|                    if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path
  ------------------
  |  |  268|  2.19k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (995:25): [True: 137, False: 2.05k]
  ------------------
  996|    137|                        break;
  997|  2.05k|                    else {
  998|  2.05k|                        i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  999|  2.05k|                        --expFrac;
 1000|  2.05k|                        if (i64 != 0)
  ------------------
  |  Branch (1000:29): [True: 1.39k, False: 666]
  ------------------
 1001|  1.39k|                            significandDigit++;
 1002|  2.05k|                    }
 1003|  2.19k|                }
 1004|       |
 1005|  1.19k|                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.19k|                useDouble = true;
 1011|  1.19k|            }
 1012|       |
 1013|  1.92k|            while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1013:20): [True: 1.09k, False: 829]
  |  Branch (1013:39): [True: 664, False: 435]
  ------------------
 1014|    664|                if (significandDigit < 17) {
  ------------------
  |  Branch (1014:21): [True: 159, False: 505]
  ------------------
 1015|    159|                    d = d * 10.0 + (s.TakePush() - '0');
 1016|    159|                    --expFrac;
 1017|    159|                    if (d > 0.0)
  ------------------
  |  Branch (1017:25): [True: 159, False: 0]
  ------------------
 1018|    159|                        significandDigit++;
 1019|    159|                }
 1020|    505|                else
 1021|    505|                    s.TakePush();
 1022|    664|            }
 1023|  1.26k|        }
 1024|  16.9k|        else
 1025|  16.9k|            decimalPosition = s.Length(); // decimal position at the end of integer.
 1026|       |
 1027|       |        // Parse exp = e [ minus / plus ] 1*DIGIT
 1028|  18.1k|        int exp = 0;
 1029|  18.1k|        if (s.Peek() == 'e' || s.Peek() == 'E') {
  ------------------
  |  Branch (1029:13): [True: 2.07k, False: 16.1k]
  |  Branch (1029:32): [True: 1.19k, False: 14.9k]
  ------------------
 1030|  3.26k|            if (!useDouble) {
  ------------------
  |  Branch (1030:17): [True: 3.00k, False: 261]
  ------------------
 1031|  3.00k|                d = use64bit ? i64 : i;
  ------------------
  |  Branch (1031:21): [True: 127, False: 2.88k]
  ------------------
 1032|  3.00k|                useDouble = true;
 1033|  3.00k|            }
 1034|  3.26k|            s.Take();
 1035|       |
 1036|  3.26k|            bool expMinus = false;
 1037|  3.26k|            if (s.Peek() == '+')
  ------------------
  |  Branch (1037:17): [True: 199, False: 3.06k]
  ------------------
 1038|    199|                s.Take();
 1039|  3.06k|            else if (s.Peek() == '-') {
  ------------------
  |  Branch (1039:22): [True: 1.06k, False: 2.00k]
  ------------------
 1040|  1.06k|                s.Take();
 1041|  1.06k|                expMinus = true;
 1042|  1.06k|            }
 1043|       |
 1044|  3.26k|            if (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1044:17): [True: 3.19k, False: 71]
  |  Branch (1044:36): [True: 3.19k, False: 4]
  ------------------
 1045|  3.19k|                exp = s.Take() - '0';
 1046|  3.19k|                if (expMinus) {
  ------------------
  |  Branch (1046:21): [True: 1.06k, False: 2.13k]
  ------------------
 1047|  3.61k|                    while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1047:28): [True: 2.55k, False: 1.05k]
  |  Branch (1047:47): [True: 2.55k, False: 2]
  ------------------
 1048|  2.55k|                        exp = exp * 10 + (s.Take() - '0');
 1049|  2.55k|                        if (exp >= 214748364) {                         // Issue #313: prevent overflow exponent
  ------------------
  |  Branch (1049:29): [True: 87, False: 2.46k]
  ------------------
 1050|    281|                            while (s.Peek() >= '0' && s.Peek() <= '9')  // Consume the rest of exponent
  ------------------
  |  Branch (1050:36): [True: 194, False: 87]
  |  Branch (1050:55): [True: 194, False: 0]
  ------------------
 1051|    194|                                s.Take();
 1052|     87|                        }
 1053|  2.55k|                    }
 1054|  1.06k|                }
 1055|  2.13k|                else {  // positive exp
 1056|  2.13k|                    int maxExp = 308 - expFrac;
 1057|  3.22k|                    while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1057:28): [True: 1.39k, False: 1.83k]
  |  Branch (1057:47): [True: 1.09k, False: 300]
  ------------------
 1058|  1.09k|                        exp = exp * 10 + (s.Take() - '0');
 1059|  1.09k|                        if (exp > maxExp)
  ------------------
  |  Branch (1059:29): [True: 1, False: 1.09k]
  ------------------
 1060|  1.09k|                            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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1061|  1.09k|                    }
 1062|  2.13k|                }
 1063|  3.19k|            }
 1064|     75|            else
 1065|  3.26k|                RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell());
  ------------------
  |  |  110|    150|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     75|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    150|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     75|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     75|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     75|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     75|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     75|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     75|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     75|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     75|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 75]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    150|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     75|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     75|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     75|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     75|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 75, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     75|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     75|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     75|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    150|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     75|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     75|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1066|       |
 1067|  3.19k|            if (expMinus)
  ------------------
  |  Branch (1067:17): [True: 1.06k, False: 2.13k]
  ------------------
 1068|  1.06k|                exp = -exp;
 1069|  3.19k|        }
 1070|       |
 1071|       |        // Finish parsing, call event according to the type of number.
 1072|  18.1k|        bool cont = true;
 1073|  18.1k|        size_t length = s.Length();
 1074|  18.1k|        const char* decimal = s.Pop();  // Pop stack no matter if it will be used or not.
 1075|       |
 1076|  18.1k|        if (useDouble) {
  ------------------
  |  Branch (1076:13): [True: 4.68k, False: 13.4k]
  ------------------
 1077|  4.68k|            int p = exp + expFrac;
 1078|  4.68k|            if (parseFlags & kParseFullPrecisionFlag)
  ------------------
  |  Branch (1078:17): [Folded, False: 4.68k]
  ------------------
 1079|      0|                d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp);
 1080|  4.68k|            else
 1081|  4.68k|                d = internal::StrtodNormalPrecision(d, p);
 1082|       |
 1083|  4.68k|            cont = handler.Double(minus ? -d : d);
  ------------------
  |  Branch (1083:35): [True: 617, False: 4.06k]
  ------------------
 1084|  4.68k|        }
 1085|  13.4k|        else {
 1086|  13.4k|            if (use64bit) {
  ------------------
  |  Branch (1086:17): [True: 1.13k, False: 12.2k]
  ------------------
 1087|  1.13k|                if (minus)
  ------------------
  |  Branch (1087:21): [True: 475, False: 664]
  ------------------
 1088|    475|                    cont = handler.AddInt64(static_cast<int64_t>(~i64 + 1));
 1089|    664|                else
 1090|    664|                    cont = handler.AddUint64(i64);
 1091|  1.13k|            }
 1092|  12.2k|            else {
 1093|  12.2k|                if (minus)
  ------------------
  |  Branch (1093:21): [True: 1.03k, False: 11.2k]
  ------------------
 1094|  1.03k|                    cont = handler.AddInt(static_cast<int32_t>(~i + 1));
 1095|  11.2k|                else
 1096|  11.2k|                    cont = handler.AddUint(i);
 1097|  12.2k|            }
 1098|  13.4k|        }
 1099|  18.1k|        if (!cont)
  ------------------
  |  Branch (1099:13): [True: 0, False: 18.1k]
  ------------------
 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|  18.1k|    }

_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 (nullptr == h) {
  ------------------
  |  Branch (104:9): [True: 2, False: 0]
  ------------------
  105|      2|        h = new (std::nothrow) detail::ThreadExitHelper;
  106|      2|        if (nullptr != 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 (nullptr == 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 (nullptr == 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|    }

_ZN4bvar6detail16make_exposed_refINS_8VariableEEESt10shared_ptrINS0_10ExposedRefIT_EEEPS5_:
   94|      8|SharedExposedRef<T> make_exposed_ref(T* obj) {
   95|      8|    return std::make_shared<ExposedRef<T>>(obj);
   96|      8|}
_ZN4bvar6detail10ExposedRefINS_8VariableEEC2EPS2_:
   49|      8|        : _cond(&_mutex), _obj(obj), _nref(0), _hidden(false) {}

_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|       |                // If the sampler is still borrowed (a Window outlived the bvar
  170|       |                // it references), deleting it would leave the borrowers with a
  171|       |                // dangling pointer, so leak it on purpose. destroy() already
  172|       |                // reported the misuse.
  173|      0|                const bool leaked = s->_leaked;
  174|      0|                s->_mutex.unlock();
  175|      0|                p->RemoveFromList();
  176|      0|                if (!leaked) {
  ------------------
  |  Branch (176:21): [True: 0, False: 0]
  ------------------
  177|      0|                    delete s;
  178|      0|                }
  179|      8|            } else {
  180|      8|                s->take_sample();
  181|      8|                s->_mutex.unlock();
  182|      8|            }
  183|      8|            p = saved_next;
  184|      8|        }
  185|      2|        bool slept = false;
  186|      2|        int64_t now = butil::cpuwide_time_us();
  187|      2|        _cumulated_time_us += now - abstime;
  188|      2|        abstime += 1000000L;
  189|      4|        while (abstime > now) {
  ------------------
  |  Branch (189:16): [True: 2, False: 2]
  ------------------
  190|      2|            ::usleep(abstime - now);
  191|      2|            slept = true;
  192|      2|            now = butil::cpuwide_time_us();
  193|      2|        }
  194|      2|        if (slept) {
  ------------------
  |  Branch (194:13): [True: 0, False: 2]
  ------------------
  195|      0|            consecutive_nosleep = 0;
  196|      2|        } else {            
  197|      2|            if (++consecutive_nosleep >= WARN_NOSLEEP_THRESHOLD) {
  ------------------
  |  Branch (197:17): [True: 0, False: 2]
  ------------------
  198|      0|                consecutive_nosleep = 0;
  199|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|      0|                             << WARN_NOSLEEP_THRESHOLD << " seconds!";
  201|      0|            }
  202|      2|        }
  203|      2|    }
  204|      2|}
_ZN4bvar6detail7SamplerC2Ev:
  206|      8|Sampler::Sampler() : _used(true), _nborrow(0), _leaked(false) {}
_ZN4bvar6detail7Sampler8scheduleEv:
  217|      8|void Sampler::schedule() {
  218|       |    // since the SamplerCollector is initialized before the program starts
  219|       |    // flags will not take effect if used in the SamplerCollector constructor
  220|      8|    if (FLAGS_bvar_enable_sampling) {
  ------------------
  |  Branch (220:9): [True: 8, False: 0]
  ------------------
  221|      8|        *butil::get_leaky_singleton<SamplerCollector>() << this;
  222|      8|    }
  223|      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:
  173|      2|                    DisplayFilter display_filter) override {
  174|      2|        const int rc = Variable::expose_impl(prefix, n, display_filter);
  175|      2|        if (rc != 0) {
  ------------------
  |  Branch (175:13): [True: 0, False: 2]
  ------------------
  176|      0|            return rc;
  177|      0|        }
  178|      2|        if (_sampler != nullptr) {
  ------------------
  |  Branch (178:13): [True: 0, False: 2]
  ------------------
  179|      0|            _sampler->set_debug_name(name());
  180|      0|        }
  181|      2|        if (ADDITIVE &&
  ------------------
  |  Branch (181:13): [True: 2, Folded]
  ------------------
  182|      2|            _series_sampler == nullptr &&
  ------------------
  |  Branch (182:13): [True: 2, False: 0]
  ------------------
  183|      2|            FLAGS_save_series) {
  ------------------
  |  Branch (183:13): [True: 2, False: 0]
  ------------------
  184|      2|            _series_sampler = new SeriesSampler(this);
  185|      2|            _series_sampler->schedule();
  186|      2|        }
  187|      2|        return rc;
  188|      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:
  173|      4|                    DisplayFilter display_filter) override {
  174|      4|        const int rc = Variable::expose_impl(prefix, n, display_filter);
  175|      4|        if (rc != 0) {
  ------------------
  |  Branch (175:13): [True: 0, False: 4]
  ------------------
  176|      0|            return rc;
  177|      0|        }
  178|      4|        if (_sampler != nullptr) {
  ------------------
  |  Branch (178:13): [True: 0, False: 4]
  ------------------
  179|      0|            _sampler->set_debug_name(name());
  180|      0|        }
  181|      4|        if (ADDITIVE &&
  ------------------
  |  Branch (181:13): [True: 4, Folded]
  ------------------
  182|      4|            _series_sampler == nullptr &&
  ------------------
  |  Branch (182:13): [True: 4, False: 0]
  ------------------
  183|      4|            FLAGS_save_series) {
  ------------------
  |  Branch (183:13): [True: 4, False: 0]
  ------------------
  184|      4|            _series_sampler = new SeriesSampler(this);
  185|      4|            _series_sampler->schedule();
  186|      4|        }
  187|      4|        return rc;
  188|      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:
  173|      2|                    DisplayFilter display_filter) override {
  174|      2|        const int rc = Variable::expose_impl(prefix, n, display_filter);
  175|      2|        if (rc != 0) {
  ------------------
  |  Branch (175:13): [True: 0, False: 2]
  ------------------
  176|      0|            return rc;
  177|      0|        }
  178|      2|        if (_sampler != nullptr) {
  ------------------
  |  Branch (178:13): [True: 0, False: 2]
  ------------------
  179|      0|            _sampler->set_debug_name(name());
  180|      0|        }
  181|      2|        if (ADDITIVE &&
  ------------------
  |  Branch (181:13): [True: 2, Folded]
  ------------------
  182|      2|            _series_sampler == nullptr &&
  ------------------
  |  Branch (182:13): [True: 2, False: 0]
  ------------------
  183|      2|            FLAGS_save_series) {
  ------------------
  |  Branch (183:13): [True: 2, False: 0]
  ------------------
  184|      2|            _series_sampler = new SeriesSampler(this);
  185|      2|            _series_sampler->schedule();
  186|      2|        }
  187|      2|        return rc;
  188|      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_:
  211|      2|        : _combiner(std::make_shared<combiner_type>(identity, identity, op))
  212|      2|        , _sampler(nullptr) , _series_sampler(nullptr) , _inv_op(inv_op) {}
_ZN4bvar7ReducerIPNS_6detail7SamplerENS1_14CombineSamplerENS1_6VoidOpEE5resetEv:
  245|      2|    T reset() { return _combiner->reset_all_agents(); }
_ZN4bvar7ReducerIPNS_6detail7SamplerENS1_14CombineSamplerENS1_6VoidOpEElsERKS3_:
  320|      8|    typename butil::add_cr_non_integral<T>::type value) {
  321|       |    // It's wait-free for most time
  322|      8|    agent_type* agent = _combiner->get_or_create_tls_agent();
  323|      8|    if (__builtin_expect(!agent, 0)) {
  ------------------
  |  Branch (323:9): [True: 0, False: 8]
  ------------------
  324|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|      0|        return *this;
  326|      0|    }
  327|      8|    agent->element.modify(_combiner->op(), value);
  328|      8|    return *this;
  329|      8|}

_ZN4bvar8Variable11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESB_NS_13DisplayFilterE:
  129|      8|                          DisplayFilter display_filter) {
  130|      8|    if (name.empty()) {
  ------------------
  |  Branch (130:9): [True: 0, False: 8]
  ------------------
  131|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|      0|        return -1;
  133|      0|    }
  134|       |    // NOTE: It's impossible to atomically erase from a submap and insert into
  135|       |    // another submap without a global lock. When the to-be-exposed name
  136|       |    // already exists, there's a chance that we can't insert back previous
  137|       |    // name. But it should be fine generally because users are unlikely to
  138|       |    // expose a variable more than once and calls to expose() are unlikely
  139|       |    // to contend heavily.
  140|       |
  141|       |    // Remove previous exposure if needed (hide() waits for in-flight readers
  142|       |    // and invalidates `_ref`).
  143|       |    // Always start the new exposure with a fresh `_ref`,  because a previous
  144|       |    // hide() may have permanently hidden the old `_ref`.
  145|      8|    hide();
  146|      8|    _ref = detail::make_exposed_ref(this);
  147|       |
  148|       |    // Build the name.
  149|      8|    _name.clear();
  150|      8|    _name.reserve((prefix.size() + name.size()) * 5 / 4);
  151|      8|    if (!prefix.empty()) {
  ------------------
  |  Branch (151:9): [True: 0, False: 8]
  ------------------
  152|      0|        to_underscored_name(&_name, prefix);
  153|      0|        if (!_name.empty() && butil::back_char(_name) != '_') {
  ------------------
  |  Branch (153:13): [True: 0, False: 0]
  |  Branch (153:31): [True: 0, False: 0]
  ------------------
  154|      0|            _name.push_back('_');
  155|      0|        }
  156|      0|    }
  157|      8|    to_underscored_name(&_name, name);
  158|       |    
  159|      8|    VarMapWithLock& m = get_var_map(_name);
  160|      8|    {
  161|      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
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  162|      8|        VarEntry* entry = m.seek(_name);
  163|      8|        if (entry == nullptr) {
  ------------------
  |  Branch (163:13): [True: 8, False: 0]
  ------------------
  164|      8|            entry = &m[_name];
  165|      8|            entry->ref = _ref;
  166|      8|            entry->display_filter = display_filter;
  167|      8|            return 0;
  168|      8|        }
  169|      8|    }
  170|      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]
  |  |  ------------------
  ------------------
  171|      0|                           "Abort due to name conflict");
  172|      0|    if (!s_bvar_may_abort) {
  ------------------
  |  Branch (172:9): [True: 0, False: 0]
  ------------------
  173|       |        // Mark name conflict occurs, If this conflict happens before
  174|       |        // initialization of bvar_abort_on_same_name, the validator will
  175|       |        // abort the program if needed.
  176|      0|        s_bvar_may_abort = true;
  177|      0|    }
  178|       |        
  179|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|      0|               << describe_exposed(_name) << '\'';
  181|      0|    _name.clear();
  182|      0|    return -1;
  183|      0|}
_ZN4bvar8Variable4hideEv:
  189|      8|bool Variable::hide() {
  190|      8|    if (_name.empty()) {
  ------------------
  |  Branch (190:9): [True: 8, False: 0]
  ------------------
  191|      8|        return false;
  192|      8|    }
  193|      0|    VarMapWithLock& m = get_var_map(_name);
  194|      0|    {
  195|      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
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  196|      0|        VarEntry* entry = m.seek(_name);
  197|      0|        if (entry) {
  ------------------
  |  Branch (197:13): [True: 0, False: 0]
  ------------------
  198|      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()
  |  |  ------------------
  ------------------
  199|      0|        } else {
  200|      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 ". "
  ------------------
  201|      0|        }
  202|      0|    }
  203|      0|    _name.clear();
  204|       |    // Remove previous exposure if needed (hide() waits for in-flight readers
  205|       |    // and invalidates `_ref`).
  206|       |    // Always start the new exposure with a fresh `_ref`,  because a previous
  207|       |    // hide() may have permanently hidden the old `_ref`.
  208|      0|    if (_ref != nullptr) {
  ------------------
  |  Branch (208:9): [True: 0, False: 0]
  ------------------
  209|      0|        _ref->hide_and_wait();
  210|      0|    }
  211|      0|    return true;
  212|      8|}
_ZN4bvar19to_underscored_nameEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKN5butil16BasicStringPieceIS5_EE:
  987|      8|void to_underscored_name(std::string* name, const butil::StringPiece& src) {
  988|      8|    name->reserve(name->size() + src.size() + 8/*just guess*/);
  989|    170|    for (const char* p = src.data(); p != src.data() + src.size(); ++p) {
  ------------------
  |  Branch (989:38): [True: 162, False: 8]
  ------------------
  990|    162|        if (isalpha(*p)) {
  ------------------
  |  Branch (990:13): [True: 146, False: 16]
  ------------------
  991|    146|            if (*p < 'a') { // upper cases
  ------------------
  |  Branch (991:17): [True: 0, False: 146]
  ------------------
  992|      0|                if (p != src.data() && !isupper(p[-1]) &&
  ------------------
  |  Branch (992:21): [True: 0, False: 0]
  |  Branch (992:40): [True: 0, False: 0]
  ------------------
  993|      0|                    butil::back_char(*name) != '_') {
  ------------------
  |  Branch (993:21): [True: 0, False: 0]
  ------------------
  994|      0|                    name->push_back('_');
  995|      0|                }
  996|      0|                name->push_back(*p - 'A' + 'a');
  997|    146|            } else {
  998|    146|                name->push_back(*p);
  999|    146|            }
 1000|    146|        } else if (isdigit(*p)) {
  ------------------
  |  Branch (1000:20): [True: 0, False: 16]
  ------------------
 1001|      0|            name->push_back(*p);
 1002|     16|        } else if (name->empty() || butil::back_char(*name) != '_') {
  ------------------
  |  Branch (1002:20): [True: 0, False: 16]
  |  Branch (1002:37): [True: 16, False: 0]
  ------------------
 1003|     16|            name->push_back('_');
 1004|     16|        }
 1005|    162|    }
 1006|      8|}
_ZN4bvar11get_var_mapERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  117|      8|inline VarMapWithLock& get_var_map(const std::string& name) {
  118|      8|    VarMapWithLock& m = get_var_maps()[sub_map_index(name)];
  119|      8|    return m;
  120|      8|}
_ZN4bvar13sub_map_indexERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   99|      8|inline size_t sub_map_index(const std::string& str) {
  100|      8|    if (str.empty()) {
  ------------------
  |  Branch (100:9): [True: 0, False: 8]
  ------------------
  101|      0|        return 0;
  102|      0|    }
  103|      8|    size_t h = 0;
  104|       |    // We assume that str is ended with '\0', which may not be in general;
  105|       |    // otherwise the hash stops early.
  106|    170|    for (const char* p  = str.c_str(); *p; ++p) {
  ------------------
  |  Branch (106:40): [True: 162, False: 8]
  ------------------
  107|    162|        h = h * 5 + *p;
  108|    162|    }
  109|      8|    return h & (SUB_MAP_COUNT - 1);
  110|      8|}
_ZN4bvar12get_var_mapsEv:
  112|      8|inline VarMapWithLock* get_var_maps() {
  113|      8|    pthread_once(&s_var_maps_once, init_var_maps);
  114|      8|    return s_var_maps;
  115|      8|}
variable.cpp:_ZN4bvarL13init_var_mapsEv:
   93|      2|static void init_var_maps() {
   94|       |    // It's probably slow to initialize all sub maps, but rpc often expose 
   95|       |    // variables before user. So this should not be an issue to users.
   96|      2|    s_var_maps = new VarMapWithLock[SUB_MAP_COUNT];
   97|      2|}
_ZN4bvar14VarMapWithLockC2Ev:
   80|     64|    VarMapWithLock() {
   81|     64|        if (init(1024) != 0) {
  ------------------
  |  Branch (81:13): [True: 0, False: 64]
  ------------------
   82|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   83|      0|        }
   84|     64|        pthread_mutex_init(&mutex, nullptr);
   85|     64|    }
_ZN4bvar8VarEntryC2Ev:
   67|      8|    VarEntry() : display_filter(DISPLAY_ON_ALL) {}

_ZN4bvar8VariableC2Ev:
  124|     10|    Variable() = default;
_ZN4bvar8Variable6exposeERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEENS_13DisplayFilterE:
  159|      8|               DisplayFilter display_filter = DISPLAY_ON_ALL) {
  160|      8|        return expose_impl(butil::StringPiece(), name, display_filter);
  161|      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|   118k|    for (std::string::const_iterator it = content.begin(); it < content.end(); ++it, ++second) {
  ------------------
  |  Branch (88:60): [True: 97.6k, False: 20.4k]
  ------------------
   89|  97.6k|        if (*it != '_') {
  ------------------
  |  Branch (89:13): [True: 97.6k, False: 0]
  ------------------
   90|  97.6k|            continue;
   91|  97.6k|        }
   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.04k|    : base64_to_bytes(true)
   76|       |#endif
   77|  4.04k|    , array_to_single_repeated(false)
   78|  4.04k|    , allow_remaining_bytes_after_parsing(false) {
   79|  4.04k|}
_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.18k, False: 5.67k]
  ------------------
  546|  1.18k|        !(json_value.IsArray() && options.array_to_single_repeated && depth == 0)) {
  ------------------
  |  Branch (546:11): [True: 48, False: 1.13k]
  |  Branch (546:35): [True: 0, False: 48]
  |  Branch (546:71): [True: 0, False: 0]
  ------------------
  547|  1.18k|        J2PERROR_WITH_PB(message, err, "The input is not a json object");
  ------------------
  |  |   52|  1.18k|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 1.18k, False: 0]
  |  |  ------------------
  |  |   53|  1.18k|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 14, False: 1.17k]
  |  |  ------------------
  |  |   54|     14|            perr->append(", ", 2);                                      \
  |  |   55|     14|        }                                                               \
  |  |   56|  1.18k|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|  1.18k|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 1.18k, False: 0]
  |  |  ------------------
  |  |   58|  1.18k|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|  1.18k|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|  1.18k|        }                                                               \
  |  |   61|  1.18k|    } else { }
  ------------------
  548|  1.18k|        return false;
  549|  1.18k|    }
  550|       |
  551|  5.67k|    const google::protobuf::Reflection* reflection = message->GetReflection();
  552|       |    
  553|  5.67k|    std::vector<const google::protobuf::FieldDescriptor*> fields;
  554|  5.67k|    fields.reserve(64);
  555|  5.67k|    for (int i = 0; i < descriptor->extension_range_count(); ++i) {
  ------------------
  |  Branch (555:21): [True: 0, False: 5.67k]
  ------------------
  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.3k, False: 5.67k]
  ------------------
  572|  23.3k|        fields.push_back(descriptor->field(i));
  573|  23.3k|    }
  574|       |
  575|  5.67k|    if (json_value.IsArray()) {
  ------------------
  |  Branch (575:9): [True: 0, False: 5.67k]
  ------------------
  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.67k|    std::string field_name_str_temp; 
  585|  5.67k|    const BUTIL_RAPIDJSON_NAMESPACE::Value* value_ptr = nullptr;
  586|  24.7k|    for (size_t i = 0; i < fields.size(); ++i) {
  ------------------
  |  Branch (586:24): [True: 20.4k, False: 4.26k]
  ------------------
  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.75k]
  ------------------
  597|  10.7k|            if (field->is_required()) {
  ------------------
  |  Branch (597:17): [True: 672, False: 10.0k]
  ------------------
  598|    672|                J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  ------------------
  |  |   49|    672|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|    672|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 672, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|    672|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 223, False: 449]
  |  |  |  |  ------------------
  |  |  |  |   54|    223|            perr->append(", ", 2);                                      \
  |  |  |  |   55|    223|        }                                                               \
  |  |  |  |   56|    672|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|    672|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 672]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|    672|    } else { }
  |  |  ------------------
  ------------------
  599|    672|                return false;
  600|    672|            }
  601|  10.0k|            continue; 
  602|  10.7k|        }
  603|  9.75k|        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 == nullptr) {
  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.75k|        if (IsProtobufMap(field) && value_ptr->IsObject()) {
  ------------------
  |  Branch (617:13): [True: 0, False: 9.75k]
  |  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.75k|        } else {
  623|  9.75k|            if (!JsonValueToProtoField(*value_ptr, field, message, options, err, depth)) {
  ------------------
  |  Branch (623:17): [True: 742, False: 9.01k]
  ------------------
  624|    742|                return false;
  625|    742|            }
  626|  9.75k|        }
  627|  9.75k|    }
  628|  4.26k|    return true;
  629|  5.67k|}
_ZN7json2pb18JsonToProtoMessageERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN6google8protobuf7MessageEPS5_:
  712|  4.04k|                        std::string* error) {
  713|  4.04k|    return JsonToProtoMessageInline(json_string, message, Json2PbOptions(), error, nullptr);
  714|  4.04k|}
json_to_pb.cpp:_ZN7json2pbL21JsonValueToProtoFieldERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPKN6google8protobuf15FieldDescriptorEPNSC_7MessageERKNS_14Json2PbOptionsEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi:
  326|  9.75k|                                  int depth) {
  327|  9.75k|    if (value.IsNull()) {
  ------------------
  |  Branch (327:9): [True: 148, False: 9.60k]
  ------------------
  328|    148|        if (field->is_required()) {
  ------------------
  |  Branch (328:13): [True: 16, False: 132]
  ------------------
  329|     16|            J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  ------------------
  |  |   49|     16|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|     16|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 16, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|     16|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 12, False: 4]
  |  |  |  |  ------------------
  |  |  |  |   54|     12|            perr->append(", ", 2);                                      \
  |  |  |  |   55|     12|        }                                                               \
  |  |  |  |   56|     16|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|     16|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 16]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|     16|    } else { }
  |  |  ------------------
  ------------------
  330|     16|            return false;
  331|     16|        }
  332|    132|        return true;
  333|    148|    }
  334|       |        
  335|  9.60k|    if (field->is_repeated()) {
  ------------------
  |  Branch (335:9): [True: 651, False: 8.95k]
  ------------------
  336|    651|        if (!value.IsArray()) {
  ------------------
  |  Branch (336:13): [True: 22, False: 629]
  ------------------
  337|     22|            J2PERROR(err, "Invalid value for repeated field: %s",
  ------------------
  |  |   49|     22|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|     22|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 22, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|     22|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 11, False: 11]
  |  |  |  |  ------------------
  |  |  |  |   54|     11|            perr->append(", ", 2);                                      \
  |  |  |  |   55|     11|        }                                                               \
  |  |  |  |   56|     22|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|     22|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 22]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|     22|    } else { }
  |  |  ------------------
  ------------------
  338|     22|                     butil::EnsureString(field->full_name()).c_str());
  339|     22|            return false;
  340|     22|        }
  341|    651|    } 
  342|       |
  343|  9.58k|    const google::protobuf::Reflection* reflection = message->GetReflection();
  344|  9.58k|    switch (field->cpp_type()) {
  ------------------
  |  Branch (344:13): [True: 9.58k, 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.55k]
  |  |  ------------------
  |  |  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|    145|        CASE_FIELD_TYPE(UINT32, UInt32, Uint);
  ------------------
  |  |  346|    145|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 145, False: 9.43k]
  |  |  ------------------
  |  |  347|    145|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 0, False: 145]
  |  |  ------------------
  |  |  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|    145|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|    145|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|    145|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|    145|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 78, False: 67]
  |  |  |  |  ------------------
  |  |  |  |  312|     78|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|     78|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 0, False: 78]
  |  |  |  |  ------------------
  |  |  |  |  314|      0|                    return false;                                   \
  |  |  |  |  315|      0|                }                                                   \
  |  |  |  |  316|     78|            }                                                       \
  |  |  |  |  317|    145|            match_type;                                             \
  |  |  |  |  318|    145|        })
  |  |  ------------------
  |  |  |  Branch (355:24): [True: 67, False: 78]
  |  |  ------------------
  |  |  356|     67|                reflection->Set##method(message, field, value.Get##jsontype()); \
  |  |  357|     67|            }                                                           \
  |  |  358|    145|            break;                                                      \
  |  |  359|    145|        }                                                               \
  ------------------
  363|    960|        CASE_FIELD_TYPE(BOOL,   Bool,   Bool);
  ------------------
  |  |  346|    960|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 960, False: 8.62k]
  |  |  ------------------
  |  |  347|    960|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 0, False: 960]
  |  |  ------------------
  |  |  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|    960|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|    960|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|    960|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|    960|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 25, False: 935]
  |  |  |  |  ------------------
  |  |  |  |  312|     25|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|     25|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 25, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|     25|                    return false;                                   \
  |  |  |  |  315|     25|                }                                                   \
  |  |  |  |  316|     25|            }                                                       \
  |  |  |  |  317|    960|            match_type;                                             \
  |  |  |  |  318|    935|        })
  |  |  ------------------
  |  |  |  Branch (355:24): [True: 935, False: 25]
  |  |  ------------------
  |  |  356|    935|                reflection->Set##method(message, field, value.Get##jsontype()); \
  |  |  357|    935|            }                                                           \
  |  |  358|    960|            break;                                                      \
  |  |  359|    960|        }                                                               \
  ------------------
  364|      0|#undef CASE_FIELD_TYPE
  365|       |
  366|    474|    case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
  ------------------
  |  Branch (366:5): [True: 474, False: 9.11k]
  ------------------
  367|    474|        if (field->is_repeated()) {
  ------------------
  |  Branch (367:13): [True: 0, False: 474]
  ------------------
  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|    474|        } else if (!convert_int64_type(value, false, message, field, reflection,
  ------------------
  |  Branch (377:20): [True: 0, False: 474]
  ------------------
  378|    474|                                       err)) {
  379|      0|            return false;
  380|      0|        }
  381|    474|        break;
  382|       |
  383|    474|    case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
  ------------------
  |  Branch (383:5): [True: 0, False: 9.58k]
  ------------------
  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.43k|    case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
  ------------------
  |  Branch (400:5): [True: 3.43k, False: 6.15k]
  ------------------
  401|  3.43k|        if (field->is_repeated()) {
  ------------------
  |  Branch (401:13): [True: 0, False: 3.43k]
  ------------------
  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.43k|        } else if (!convert_float_type(value, false, message, field,
  ------------------
  |  Branch (410:20): [True: 24, False: 3.40k]
  ------------------
  411|  3.43k|                                       reflection, err)) {
  412|     24|            return false;
  413|     24|        }
  414|  3.40k|        break;
  415|       |
  416|  3.40k|    case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: 
  ------------------
  |  Branch (416:5): [True: 932, False: 8.65k]
  ------------------
  417|    932|        if (field->is_repeated()) {
  ------------------
  |  Branch (417:13): [True: 0, False: 932]
  ------------------
  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|    932|        } else if (!convert_double_type(value, false, message, field,
  ------------------
  |  Branch (426:20): [True: 162, False: 770]
  ------------------
  427|    932|                                        reflection, err)) {
  428|    162|            return false;
  429|    162|        }
  430|    770|        break;
  431|       |        
  432|  2.00k|    case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
  ------------------
  |  Branch (432:5): [True: 2.00k, False: 7.58k]
  ------------------
  433|  2.00k|        if (field->is_repeated()) {
  ------------------
  |  Branch (433:13): [True: 66, False: 1.93k]
  ------------------
  434|     66|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  435|    938|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|     66|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (435:65): [True: 872, False: 66]
  ------------------
  436|    872|                const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];
  437|    872|                if (TYPE_MATCH == J2PCHECKTYPE(item, string, String)) { 
  ------------------
  |  |  309|    872|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  310|    872|            MatchType match_type = TYPE_MATCH;                      \
  |  |  311|    872|            if (!value.Is##jsontype()) {                            \
  |  |  ------------------
  |  |  |  Branch (311:17): [True: 16, False: 856]
  |  |  ------------------
  |  |  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|    872|            match_type;                                             \
  |  |  318|    856|        })
  ------------------
  |  Branch (437:21): [True: 856, False: 16]
  ------------------
  438|    856|                    std::string str(item.GetString(), item.GetStringLength());
  439|    856|                    if (field->type() == google::protobuf::FieldDescriptor::TYPE_BYTES &&
  ------------------
  |  Branch (439:25): [True: 0, False: 856]
  ------------------
  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|    856|                    reflection->AddString(message, field, str);
  449|    856|                }  
  450|    872|            }
  451|  1.93k|        } else if (TYPE_MATCH == J2PCHECKTYPE(value, string, String)) {
  ------------------
  |  |  309|  1.93k|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  310|  1.93k|            MatchType match_type = TYPE_MATCH;                      \
  |  |  311|  1.93k|            if (!value.Is##jsontype()) {                            \
  |  |  ------------------
  |  |  |  Branch (311:17): [True: 1.07k, False: 860]
  |  |  ------------------
  |  |  312|  1.07k|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|  1.07k|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 1, False: 1.07k]
  |  |  ------------------
  |  |  314|      1|                    return false;                                   \
  |  |  315|      1|                }                                                   \
  |  |  316|  1.07k|            }                                                       \
  |  |  317|  1.93k|            match_type;                                             \
  |  |  318|  1.93k|        })
  ------------------
  |  Branch (451:20): [True: 860, False: 1.07k]
  ------------------
  452|    860|            std::string str(value.GetString(), value.GetStringLength());
  453|    860|            if (field->type() == google::protobuf::FieldDescriptor::TYPE_BYTES &&
  ------------------
  |  Branch (453:17): [True: 759, False: 101]
  ------------------
  454|    759|                options.base64_to_bytes) {
  ------------------
  |  Branch (454:17): [True: 759, False: 0]
  ------------------
  455|    759|                std::string str_decoded;
  456|    759|                if (!butil::Base64Decode(str, &str_decoded)) {
  ------------------
  |  Branch (456:21): [True: 62, False: 697]
  ------------------
  457|     62|                    J2PERROR_WITH_PB(message, err, "Fail to decode base64 string=%s", str.c_str());
  ------------------
  |  |   52|     62|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 62, False: 0]
  |  |  ------------------
  |  |   53|     62|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 12, False: 50]
  |  |  ------------------
  |  |   54|     12|            perr->append(", ", 2);                                      \
  |  |   55|     12|        }                                                               \
  |  |   56|     62|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|     62|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 62, False: 0]
  |  |  ------------------
  |  |   58|     62|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|     62|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|     62|        }                                                               \
  |  |   61|     62|    } else { }
  ------------------
  458|     62|                    return false;
  459|     62|                }
  460|    697|                str = str_decoded;
  461|    697|            }
  462|    798|            reflection->SetString(message, field, str);
  463|    798|        }
  464|  1.94k|        break;
  465|       |
  466|  1.94k|    case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
  ------------------
  |  Branch (466:5): [True: 276, False: 9.30k]
  ------------------
  467|    276|        if (field->is_repeated()) {
  ------------------
  |  Branch (467:13): [True: 0, False: 276]
  ------------------
  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|    276|        } else if (!convert_enum_type(value, false, message, field,
  ------------------
  |  Branch (476:20): [True: 0, False: 276]
  ------------------
  477|    276|                                      reflection, err)) {
  478|      0|            return false;
  479|      0|        }
  480|    276|        break;
  481|       |        
  482|  1.33k|    case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
  ------------------
  |  Branch (482:5): [True: 1.33k, False: 8.24k]
  ------------------
  483|  1.33k|        if (field->is_repeated()) {
  ------------------
  |  Branch (483:13): [True: 538, False: 800]
  ------------------
  484|    538|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  485|  3.71k|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|    538|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (485:65): [True: 3.40k, False: 311]
  ------------------
  486|  3.40k|                const BUTIL_RAPIDJSON_NAMESPACE::Value& item = value[index];
  487|  3.40k|                if (TYPE_MATCH == J2PCHECKTYPE(item, message, Object)) { 
  ------------------
  |  |  309|  3.40k|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  310|  3.40k|            MatchType match_type = TYPE_MATCH;                      \
  |  |  311|  3.40k|            if (!value.Is##jsontype()) {                            \
  |  |  ------------------
  |  |  |  Branch (311:17): [True: 76, False: 3.32k]
  |  |  ------------------
  |  |  312|     76|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|     76|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 76, False: 0]
  |  |  ------------------
  |  |  314|     76|                    return false;                                   \
  |  |  315|     76|                }                                                   \
  |  |  316|     76|            }                                                       \
  |  |  317|  3.40k|            match_type;                                             \
  |  |  318|  3.32k|        })
  ------------------
  |  Branch (487:21): [True: 3.32k, False: 76]
  ------------------
  488|  3.32k|                    if (!JsonValueToProtoMessage(
  ------------------
  |  Branch (488:25): [True: 227, False: 3.09k]
  ------------------
  489|  3.32k|                            item, reflection->AddMessage(message, field), options, err, depth + 1)) {
  490|    227|                        return false;
  491|    227|                    }
  492|  3.32k|                } 
  493|  3.40k|            }
  494|    800|        } else if (!JsonValueToProtoMessage(
  ------------------
  |  Branch (494:20): [True: 103, False: 697]
  ------------------
  495|    800|            value, reflection->MutableMessage(message, field), options, err, depth + 1)) {
  496|    103|            return false;
  497|    103|        }
  498|  1.00k|        break;
  499|  9.58k|    }
  500|  8.88k|    return true;
  501|  9.58k|}
_ZN7json2pb13value_invalidEPKN6google8protobuf15FieldDescriptorEPKcRKN5butil9rapidjson12GenericValueINS8_4UTF8IcEENS8_19MemoryPoolAllocatorINS8_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  121|  2.14k|                          const BUTIL_RAPIDJSON_NAMESPACE::Value& value, std::string* err) {
  122|  2.14k|    bool optional = !field->is_required() && !field->is_repeated();
  ------------------
  |  Branch (122:21): [True: 1.93k, False: 212]
  |  Branch (122:46): [True: 1.83k, False: 100]
  ------------------
  123|  2.14k|    if (err) {
  ------------------
  |  Branch (123:9): [True: 2.14k, False: 0]
  ------------------
  124|  2.14k|        if (!err->empty()) {
  ------------------
  |  Branch (124:13): [True: 1.31k, False: 831]
  ------------------
  125|  1.31k|            err->append(", ");
  126|  1.31k|        }
  127|  2.14k|        err->append("Invalid value `");
  128|  2.14k|        string_append_value(value, err);
  129|  2.14k|        butil::string_appendf(err, "' for %sfield `%s' which SHOULD be %s",
  130|  2.14k|                       optional ? "optional " : "",
  ------------------
  |  Branch (130:24): [True: 1.83k, False: 312]
  ------------------
  131|  2.14k|                       butil::EnsureString(field->full_name()).c_str(), type);
  132|  2.14k|    }
  133|  2.14k|    if (!optional) {
  ------------------
  |  Branch (133:9): [True: 312, False: 1.83k]
  ------------------
  134|    312|        return false;                                           
  135|    312|    } 
  136|  1.83k|    return true;
  137|  2.14k|}
json_to_pb.cpp:_ZN7json2pbL19string_append_valueERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   88|  2.14k|                                std::string* output) {
   89|  2.14k|    if (value.IsNull()) {
  ------------------
  |  Branch (89:9): [True: 12, False: 2.13k]
  ------------------
   90|     12|        output->append("null");
   91|  2.13k|    } else if (value.IsBool()) {
  ------------------
  |  Branch (91:16): [True: 88, False: 2.04k]
  ------------------
   92|     88|        output->append(value.GetBool() ? "true" : "false");
  ------------------
  |  Branch (92:24): [True: 87, False: 1]
  ------------------
   93|  2.04k|    } else if (value.IsInt()) {
  ------------------
  |  Branch (93:16): [True: 402, False: 1.64k]
  ------------------
   94|    402|        butil::string_appendf(output, "%d", value.GetInt());
   95|  1.64k|    } else if (value.IsUint()) {
  ------------------
  |  Branch (95:16): [True: 37, False: 1.60k]
  ------------------
   96|     37|        butil::string_appendf(output, "%u", value.GetUint());
   97|  1.60k|    } else if (value.IsInt64()) {
  ------------------
  |  Branch (97:16): [True: 34, False: 1.57k]
  ------------------
   98|     34|        butil::string_appendf(output, "%" PRId64, value.GetInt64());
   99|  1.57k|    } else if (value.IsUint64()) {
  ------------------
  |  Branch (99:16): [True: 34, False: 1.54k]
  ------------------
  100|     34|        butil::string_appendf(output, "%" PRIu64, value.GetUint64());
  101|  1.54k|    } else if (value.IsDouble()) {
  ------------------
  |  Branch (101:16): [True: 539, False: 1.00k]
  ------------------
  102|    539|        butil::string_appendf(output, "%f", value.GetDouble());
  103|  1.00k|    } else if (value.IsString()) {
  ------------------
  |  Branch (103:16): [True: 817, False: 184]
  ------------------
  104|    817|        output->push_back('"');
  105|    817|        output->append(value.GetString(), value.GetStringLength());
  106|    817|        output->push_back('"');
  107|    817|    } else if (value.IsArray()) {
  ------------------
  |  Branch (107:16): [True: 105, False: 79]
  ------------------
  108|    105|        output->append("array");
  109|    105|    } else if (value.IsObject()) {
  ------------------
  |  Branch (109:16): [True: 79, False: 0]
  ------------------
  110|     79|        output->append("object");
  111|     79|    }
  112|  2.14k|}
_ZN7json2pb18convert_int64_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  242|    474|                               std::string* err) { 
  243|       |  
  244|    474|    int64_t num;
  245|    474|    if (item.IsInt64()) {
  ------------------
  |  Branch (245:9): [True: 9, False: 465]
  ------------------
  246|      9|        if (repeated) {
  ------------------
  |  Branch (246:13): [True: 0, False: 9]
  ------------------
  247|      0|            reflection->AddInt64(message, field, item.GetInt64());
  248|      9|        } else {
  249|      9|            reflection->SetInt64(message, field, item.GetInt64());
  250|      9|        }
  251|    465|    } else if (item.IsString() &&
  ------------------
  |  Branch (251:16): [True: 410, False: 55]
  |  Branch (251:16): [True: 218, False: 247]
  ------------------
  252|    410|               butil::StringToInt64({item.GetString(), item.GetStringLength()},
  ------------------
  |  Branch (252:16): [True: 218, False: 192]
  ------------------
  253|    410|                                    &num)) {
  254|    218|        if (repeated) {
  ------------------
  |  Branch (254:13): [True: 0, False: 218]
  ------------------
  255|      0|            reflection->AddInt64(message, field, num);
  256|    218|        } else {
  257|    218|            reflection->SetInt64(message, field, num);
  258|    218|        }
  259|    247|    } else {
  260|    247|        return value_invalid(field, "INT64", item, err);
  261|    247|    }
  262|    227|    return true;
  263|    474|}
_ZN7json2pb18convert_float_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  172|  3.43k|                               std::string* err) { 
  173|  3.43k|    if (item.IsNumber()) {
  ------------------
  |  Branch (173:9): [True: 2.96k, False: 470]
  ------------------
  174|  2.96k|        if (repeated) {
  ------------------
  |  Branch (174:13): [True: 0, False: 2.96k]
  ------------------
  175|      0|            reflection->AddFloat(message, field, item.GetDouble());
  176|  2.96k|        } else {
  177|  2.96k|            reflection->SetFloat(message, field, item.GetDouble());
  178|  2.96k|        }
  179|  2.96k|    } else if (item.IsString()) {
  ------------------
  |  Branch (179:16): [True: 455, False: 15]
  ------------------
  180|    455|        if (!convert_string_to_double_float_type(
  ------------------
  |  Branch (180:13): [True: 10, False: 445]
  ------------------
  181|    455|                (repeated ? &google::protobuf::Reflection::AddFloat
  ------------------
  |  Branch (181:18): [True: 0, False: 455]
  ------------------
  182|    455|                 : &google::protobuf::Reflection::SetFloat),
  183|    455|                message, field, reflection, item, err)) { 
  184|     10|            return false;
  185|     10|        }                                                                               
  186|    455|    } else {                                         
  187|     15|        return value_invalid(field, "float", item, err);
  188|     15|    } 
  189|  3.40k|    return true;
  190|  3.43k|}
_ZN7json2pb35convert_string_to_double_float_typeIfEEbMN6google8protobuf10ReflectionEKFvPNS2_7MessageEPKNS2_15FieldDescriptorET_ES5_S8_PKS3_RKN5butil9rapidjson12GenericValueINSF_4UTF8IcEENSF_19MemoryPoolAllocatorINSF_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  148|    455|    std::string* err) {
  149|    455|    const char* limit_type = item.GetString();  // MUST be string here 
  150|    455|    if (std::numeric_limits<T>::has_quiet_NaN &&
  ------------------
  |  Branch (150:9): [True: 455, Folded]
  ------------------
  151|    455|        strcasecmp(limit_type, "NaN") == 0) { 
  ------------------
  |  Branch (151:9): [True: 93, False: 362]
  ------------------
  152|     93|        (reflection->*func)(message, field, std::numeric_limits<T>::quiet_NaN());
  153|     93|        return true;
  154|     93|    } 
  155|    362|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (155:9): [True: 362, Folded]
  ------------------
  156|    362|        strcasecmp(limit_type, "Infinity") == 0) {
  ------------------
  |  Branch (156:9): [True: 95, False: 267]
  ------------------
  157|     95|        (reflection->*func)(message, field, std::numeric_limits<T>::infinity());
  158|     95|        return true;
  159|     95|    } 
  160|    267|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (160:9): [True: 267, Folded]
  ------------------
  161|    267|        strcasecmp(limit_type, "-Infinity") == 0) { 
  ------------------
  |  Branch (161:9): [True: 66, False: 201]
  ------------------
  162|     66|        (reflection->*func)(message, field, -std::numeric_limits<T>::infinity());
  163|     66|        return true;
  164|     66|    }
  165|    201|    return value_invalid(field, typeid(T).name(), item, err);
  166|    267|}
_ZN7json2pb19convert_double_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  196|    932|                                std::string* err) {  
  197|    932|    if (item.IsNumber()) {
  ------------------
  |  Branch (197:9): [True: 767, False: 165]
  ------------------
  198|    767|        if (repeated) {
  ------------------
  |  Branch (198:13): [True: 0, False: 767]
  ------------------
  199|      0|            reflection->AddDouble(message, field, item.GetDouble());
  200|    767|        } else {
  201|    767|            reflection->SetDouble(message, field, item.GetDouble());
  202|    767|        }
  203|    767|    } else if (item.IsString()) {
  ------------------
  |  Branch (203:16): [True: 164, False: 1]
  ------------------
  204|    164|        if (!convert_string_to_double_float_type(
  ------------------
  |  Branch (204:13): [True: 161, False: 3]
  ------------------
  205|    164|                (repeated ? &google::protobuf::Reflection::AddDouble
  ------------------
  |  Branch (205:18): [True: 0, False: 164]
  ------------------
  206|    164|                 : &google::protobuf::Reflection::SetDouble),
  207|    164|                message, field, reflection, item, err)) { 
  208|    161|            return false; 
  209|    161|        }
  210|    164|    } else {
  211|      1|        return value_invalid(field, "double", item, err); 
  212|      1|    }
  213|    770|    return true;
  214|    932|}
_ZN7json2pb35convert_string_to_double_float_typeIdEEbMN6google8protobuf10ReflectionEKFvPNS2_7MessageEPKNS2_15FieldDescriptorET_ES5_S8_PKS3_RKN5butil9rapidjson12GenericValueINSF_4UTF8IcEENSF_19MemoryPoolAllocatorINSF_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  148|    164|    std::string* err) {
  149|    164|    const char* limit_type = item.GetString();  // MUST be string here 
  150|    164|    if (std::numeric_limits<T>::has_quiet_NaN &&
  ------------------
  |  Branch (150:9): [True: 164, Folded]
  ------------------
  151|    164|        strcasecmp(limit_type, "NaN") == 0) { 
  ------------------
  |  Branch (151:9): [True: 1, False: 163]
  ------------------
  152|      1|        (reflection->*func)(message, field, std::numeric_limits<T>::quiet_NaN());
  153|      1|        return true;
  154|      1|    } 
  155|    163|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (155:9): [True: 163, Folded]
  ------------------
  156|    163|        strcasecmp(limit_type, "Infinity") == 0) {
  ------------------
  |  Branch (156:9): [True: 1, False: 162]
  ------------------
  157|      1|        (reflection->*func)(message, field, std::numeric_limits<T>::infinity());
  158|      1|        return true;
  159|      1|    } 
  160|    162|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (160:9): [True: 162, Folded]
  ------------------
  161|    162|        strcasecmp(limit_type, "-Infinity") == 0) { 
  ------------------
  |  Branch (161:9): [True: 1, False: 161]
  ------------------
  162|      1|        (reflection->*func)(message, field, -std::numeric_limits<T>::infinity());
  163|      1|        return true;
  164|      1|    }
  165|    161|    return value_invalid(field, typeid(T).name(), item, err);
  166|    162|}
_ZN7json2pb17convert_enum_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  220|    276|                              std::string* err) {
  221|    276|    const google::protobuf::EnumValueDescriptor * enum_value_descriptor = nullptr; 
  222|    276|    if (item.IsInt()) {
  ------------------
  |  Branch (222:9): [True: 68, False: 208]
  ------------------
  223|     68|        enum_value_descriptor = field->enum_type()->FindValueByNumber(item.GetInt()); 
  224|    208|    } else if (item.IsString()) {                                          
  ------------------
  |  Branch (224:16): [True: 174, False: 34]
  ------------------
  225|    174|        enum_value_descriptor = field->enum_type()->FindValueByName(item.GetString()); 
  226|    174|    }                                                                      
  227|    276|    if (!enum_value_descriptor) {                                      
  ------------------
  |  Branch (227:9): [True: 242, False: 34]
  ------------------
  228|    242|        return value_invalid(field, "enum", item, err); 
  229|    242|    }                                                                  
  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|    276|}
_ZN7json2pb24JsonToProtoMessageInlineERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN6google8protobuf7MessageERKNS_14Json2PbOptionsEPS5_Pm:
  635|  4.04k|                        size_t* parsed_offset) {
  636|  4.04k|    if (error) {
  ------------------
  |  Branch (636:9): [True: 4.04k, False: 0]
  ------------------
  637|  4.04k|        error->clear();
  638|  4.04k|    }
  639|  4.04k|    BUTIL_RAPIDJSON_NAMESPACE::Document d;
  ------------------
  |  |  120|  4.04k|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  640|  4.04k|    if (options.allow_remaining_bytes_after_parsing) {
  ------------------
  |  Branch (640:9): [True: 0, False: 4.04k]
  ------------------
  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.04k|    } else {
  646|  4.04k|        d.Parse<RAPIDJSON_PARSE_FLAG_DEFAULT>(json_string.c_str());
  647|  4.04k|    }
  648|  4.04k|    if (d.HasParseError()) {
  ------------------
  |  Branch (648:9): [True: 1.30k, False: 2.73k]
  ------------------
  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.73k|    return JsonValueToProtoMessage(d, message, options, error, 0);
  660|  4.04k|}

_ZN7json2pb13IsProtobufMapEPKN6google8protobuf15FieldDescriptorE:
   26|  9.75k|bool IsProtobufMap(const FieldDescriptor* field) {
   27|  9.75k|    if (field->type() != FieldDescriptor::TYPE_MESSAGE || !field->is_repeated()) {
  ------------------
  |  Branch (27:9): [True: 8.32k, False: 1.43k]
  |  Branch (27:59): [True: 892, False: 539]
  ------------------
   28|  9.21k|        return false;
   29|  9.21k|    }
   30|    539|    const Descriptor* entry_desc = field->message_type();
   31|    539|    if (entry_desc == nullptr) {
  ------------------
  |  Branch (31:9): [True: 0, False: 539]
  ------------------
   32|      0|        return false;
   33|      0|    }
   34|    539|    if (entry_desc->field_count() != 2) {
  ------------------
  |  Branch (34:9): [True: 539, False: 0]
  ------------------
   35|    539|        return false;
   36|    539|    }
   37|      0|    const FieldDescriptor* key_desc = entry_desc->field(KEY_INDEX);
   38|      0|    if (nullptr == 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 (nullptr == 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.06k|{
   27|  4.06k|    if (size < kMinInputLength || size > kMaxInputLength){
  ------------------
  |  |   21|  8.13k|#define kMinInputLength 5
  ------------------
                  if (size < kMinInputLength || size > kMaxInputLength){
  ------------------
  |  |   22|  4.06k|#define kMaxInputLength 1024
  ------------------
  |  Branch (27:9): [True: 4, False: 4.06k]
  |  Branch (27:35): [True: 20, False: 4.04k]
  ------------------
   28|     24|        return 1;
   29|     24|    }
   30|       |
   31|  4.04k|    std::string error;
   32|  4.04k|    JsonContextBody jsondata;
   33|  4.04k|    std::string input_data((char *)data,size);
   34|  4.04k|    json2pb::JsonToProtoMessage(input_data, &jsondata, &error);
   35|       |
   36|  4.04k|    return 0;
   37|  4.06k|}

