_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|    812|  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
  264|    812|  SharedCtor(arena, is_message_owned);
  265|       |  // @@protoc_insertion_point(arena_constructor:Ext)
  266|    812|}
_ZN3ExtD2Ev:
  309|    812|Ext::~Ext() {
  310|       |  // @@protoc_insertion_point(destructor:Ext)
  311|    812|  if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) {
  ------------------
  |  Branch (311:13): [True: 0, False: 812]
  ------------------
  312|      0|  (void)arena;
  313|      0|    return;
  314|      0|  }
  315|    812|  SharedDtor();
  316|    812|}
_ZNK3Ext11GetMetadataEv:
  529|  2.89k|::PROTOBUF_NAMESPACE_ID::Metadata Ext::GetMetadata() const {
  530|  2.89k|  return ::_pbi::AssignDescriptors(
  531|  2.89k|      &descriptor_table_addressbook1_2eproto_getter, &descriptor_table_addressbook1_2eproto_once,
  532|  2.89k|      file_level_metadata_addressbook1_2eproto[0]);
  533|  2.89k|}
_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.20k|  : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) {
  874|  4.20k|  SharedCtor(arena, is_message_owned);
  875|       |  // @@protoc_insertion_point(arena_constructor:JsonContextBody)
  876|  4.20k|}
_ZN15JsonContextBodyD2Ev:
  915|  4.20k|JsonContextBody::~JsonContextBody() {
  916|       |  // @@protoc_insertion_point(destructor:JsonContextBody)
  917|  4.20k|  if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) {
  ------------------
  |  Branch (917:13): [True: 0, False: 4.20k]
  ------------------
  918|      0|  (void)arena;
  919|      0|    return;
  920|      0|  }
  921|  4.20k|  SharedDtor();
  922|  4.20k|}
_ZNK15JsonContextBody11GetMetadataEv:
 1268|  10.0k|::PROTOBUF_NAMESPACE_ID::Metadata JsonContextBody::GetMetadata() const {
 1269|  10.0k|  return ::_pbi::AssignDescriptors(
 1270|  10.0k|      &descriptor_table_addressbook1_2eproto_getter, &descriptor_table_addressbook1_2eproto_once,
 1271|  10.0k|      file_level_metadata_addressbook1_2eproto[2]);
 1272|  10.0k|}
_ZN6google8protobuf5Arena18CreateMaybeMessageI3ExtJEEEPT_PS1_DpOT0_:
 1775|    812|Arena::CreateMaybeMessage< ::Ext >(Arena* arena) {
 1776|    812|  return Arena::CreateMessageInternal< ::Ext >(arena);
 1777|    812|}
_ZN6google8protobuf5Arena18CreateMaybeMessageI7ContentJEEEPT_PS1_DpOT0_:
 1779|  3.32k|Arena::CreateMaybeMessage< ::Content >(Arena* arena) {
 1780|  3.32k|  return Arena::CreateMessageInternal< ::Content >(arena);
 1781|  3.32k|}
_ZN3Ext10SharedCtorEPN6google8protobuf5ArenaEb:
  293|    812|    ::_pb::Arena* arena, bool is_message_owned) {
  294|    812|  (void)arena;
  295|    812|  (void)is_message_owned;
  296|    812|  new (&_impl_) Impl_{
  297|    812|      decltype(_impl_._has_bits_){}
  298|    812|    , /*decltype(_impl_._cached_size_)*/{}
  299|    812|    , decltype(_impl_.databyte_){}
  300|    812|    , decltype(_impl_.age_){0u}
  301|    812|    , decltype(_impl_.enumtype_){1}
  302|    812|  };
  303|    812|  _impl_.databyte_.InitDefault();
  304|       |  #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
  305|       |    _impl_.databyte_.Set("", GetArenaForAllocation());
  306|       |  #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
  307|    812|}
_ZN3Ext10SharedDtorEv:
  318|    812|inline void Ext::SharedDtor() {
  319|       |  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
  ------------------
  |  Branch (319:3): [True: 812, False: 0]
  ------------------
  320|    812|  _impl_.databyte_.Destroy();
  321|    812|}
_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: 3.32k, False: 0]
  ------------------
  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.20k|    ::_pb::Arena* arena, bool is_message_owned) {
  900|  4.20k|  (void)arena;
  901|  4.20k|  (void)is_message_owned;
  902|  4.20k|  new (&_impl_) Impl_{
  903|  4.20k|      decltype(_impl_._has_bits_){}
  904|  4.20k|    , /*decltype(_impl_._cached_size_)*/{}
  905|  4.20k|    , decltype(_impl_.content_){arena}
  906|  4.20k|    , decltype(_impl_.data_){arena}
  907|  4.20k|    , decltype(_impl_.info_){arena}
  908|  4.20k|    , decltype(_impl_.type_){int64_t{0}}
  909|  4.20k|    , decltype(_impl_.spur_){0}
  910|  4.20k|    , decltype(_impl_.judge_){false}
  911|  4.20k|    , decltype(_impl_.text_){0}
  912|  4.20k|  };
  913|  4.20k|}
_ZN15JsonContextBody10SharedDtorEv:
  924|  4.20k|inline void JsonContextBody::SharedDtor() {
  925|       |  GOOGLE_DCHECK(GetArenaForAllocation() == nullptr);
  ------------------
  |  Branch (925:3): [True: 4.20k, False: 0]
  ------------------
  926|  4.20k|  _impl_.content_.~RepeatedPtrField();
  927|  4.20k|  _impl_.data_.~RepeatedField();
  928|  4.20k|  _impl_.info_.~RepeatedPtrField();
  929|  4.20k|}

_ZN15JsonContextBodyC2Ev:
  527|  4.20k|  inline JsonContextBody() : JsonContextBody(nullptr) {}
_ZNK3Ext3NewEPN6google8protobuf5ArenaE:
  178|    812|  Ext* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
  179|    812|    return CreateMaybeMessage<Ext>(arena);
  180|    812|  }
_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:
  119|      2|        : _epfd(-1)
  120|      2|        , _stop(false)
  121|      2|        , _tid(0) {
  122|      2|    }
_ZN7bthread9LazyArrayIPN5butil6atomicIiEELm262144ELm256EEC2Ev:
   56|      2|    LazyArray() {
   57|      2|        memset(static_cast<void*>(_blocks), 0, sizeof(butil::atomic<Block*>) * NBLOCK);
   58|      2|    }

key.cpp:_ZN7bthreadL13get_key_countEPv:
  417|      2|static int get_key_count(void*) {
  418|      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
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  419|      2|    return (int)nkey - (int)nfreekey;
  420|      2|}
key.cpp:_ZN7bthreadL18get_keytable_countEPv:
  421|      2|static size_t get_keytable_count(void*) {
  422|      2|    return nkeytable.load(butil::memory_order_relaxed);
  423|      2|}
key.cpp:_ZN7bthreadL19get_keytable_memoryEPv:
  424|      2|static size_t get_keytable_memory(void*) {
  425|      2|    const size_t n = nkeytable.load(butil::memory_order_relaxed);
  426|      2|    const size_t nsub = nsubkeytable.load(butil::memory_order_relaxed);
  427|      2|    return n * sizeof(KeyTable) + nsub * sizeof(SubKeyTable);
  428|      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:
 1299|    190|                       const pthread_mutexattr_t* __restrict mutexattr) {
 1300|    190|    INIT_MUTEX_OWNER_MAP_ENTRY(mutex, mutexattr);
  ------------------
  |  |  787|    190|#define INIT_MUTEX_OWNER_MAP_ENTRY(mutex, mutexattr) ((void)0)
  ------------------
 1301|    190|    return bthread::sys_pthread_mutex_init(mutex, mutexattr);
 1302|    190|}
pthread_mutex_lock:
 1309|    718|int pthread_mutex_lock(pthread_mutex_t* mutex) {
 1310|    718|    return bthread::pthread_mutex_lock_impl(mutex);
 1311|    718|}
pthread_mutex_unlock:
 1324|    718|int pthread_mutex_unlock(pthread_mutex_t* mutex) {
 1325|    718|    return bthread::pthread_mutex_unlock_impl(mutex);
 1326|    718|}
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|}
_ZN7bthread23pthread_mutex_lock_implEP15pthread_mutex_t:
  973|    718|BUTIL_FORCE_INLINE int pthread_mutex_lock_impl(pthread_mutex_t* mutex) {
  974|       |    return internal::pthread_mutex_lock_impl(mutex, NULL);
  975|    718|}
_ZN7bthread8internal23pthread_mutex_lock_implI15pthread_mutex_tEEiPT_PK8timespec:
  870|    718|BUTIL_FORCE_INLINE int pthread_mutex_lock_impl(Mutex* mutex, const struct timespec* abstime) {
  871|       |    // Don't change behavior of lock when profiler is off.
  872|    718|    if (!g_cp ||
  ------------------
  |  Branch (872:9): [True: 718, False: 0]
  ------------------
  873|       |        // collecting code including backtrace() and submit() may call
  874|       |        // pthread_mutex_lock and cause deadlock. Don't sample.
  875|    718|        tls_inside_lock) {
  ------------------
  |  Branch (875:9): [True: 0, False: 0]
  ------------------
  876|    718|        return pthread_mutex_lock_internal(mutex, abstime);
  877|    718|    }
  878|       |    // Don't slow down non-contended locks.
  879|      0|    int rc = pthread_mutex_trylock_internal(mutex);
  880|      0|    if (rc != EBUSY) {
  ------------------
  |  Branch (880:9): [True: 0, False: 0]
  ------------------
  881|      0|        return rc;
  882|      0|    }
  883|       |    // Ask bvar::Collector if this (contended) locking should be sampled
  884|      0|    const size_t sampling_range = bvar::is_collectable(&g_cp_sl);
  885|       |
  886|      0|    bthread_contention_site_t* csite = NULL;
  887|      0|#ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
  888|      0|    TLSPthreadContentionSites& fast_alt = tls_csites;
  889|      0|    if (fast_alt.cp_version != g_cp_version) {
  ------------------
  |  Branch (889:9): [True: 0, False: 0]
  ------------------
  890|      0|        fast_alt.cp_version = g_cp_version;
  891|      0|        fast_alt.count = 0;
  892|      0|    }
  893|      0|    if (fast_alt.count < TLS_MAX_COUNT) {
  ------------------
  |  Branch (893:9): [True: 0, False: 0]
  ------------------
  894|      0|        MutexAndContentionSite& entry = fast_alt.list[fast_alt.count++];
  895|      0|        entry.mutex = mutex;
  896|      0|        csite = &entry.csite;
  897|      0|        if (!bvar::is_sampling_range_valid(sampling_range)) {
  ------------------
  |  Branch (897:13): [True: 0, False: 0]
  ------------------
  898|      0|            make_contention_site_invalid(&entry.csite);
  899|      0|            return pthread_mutex_lock_internal(mutex, abstime);
  900|      0|        }
  901|      0|    }
  902|      0|#endif
  903|      0|    if (!bvar::is_sampling_range_valid(sampling_range)) {  // don't sample
  ------------------
  |  Branch (903:9): [True: 0, False: 0]
  ------------------
  904|      0|        return pthread_mutex_lock_internal(mutex, abstime);
  905|      0|    }
  906|       |    // Lock and monitor the waiting time.
  907|      0|    const int64_t start_ns = butil::cpuwide_time_ns();
  908|      0|    rc = pthread_mutex_lock_internal(mutex, abstime);
  909|      0|    if (!rc) { // Inside lock
  ------------------
  |  Branch (909:9): [True: 0, False: 0]
  ------------------
  910|      0|        if (!csite) {
  ------------------
  |  Branch (910:13): [True: 0, False: 0]
  ------------------
  911|      0|            csite = add_pthread_contention_site(mutex);
  912|      0|            if (csite == NULL) {
  ------------------
  |  Branch (912:17): [True: 0, False: 0]
  ------------------
  913|      0|                return rc;
  914|      0|            }
  915|      0|        }
  916|      0|        csite->duration_ns = butil::cpuwide_time_ns() - start_ns;
  917|      0|        csite->sampling_range = sampling_range;
  918|      0|    } // else rare
  919|      0|    return rc;
  920|      0|}
_ZN7bthread8internal27pthread_mutex_lock_internalEP15pthread_mutex_tPK8timespec:
  798|    718|                                                   const struct timespec* abstime) {
  799|    718|    int rc = 0;
  800|    718|    if (NULL == abstime) {
  ------------------
  |  Branch (800:9): [True: 718, False: 0]
  ------------------
  801|    718|        FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex);
  ------------------
  |  |  789|    718|#define FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex) ((void)0)
  ------------------
  802|    718|        SYS_PTHREAD_MUTEX_CHECK_OWNER;
  ------------------
  |  |  790|    718|#define SYS_PTHREAD_MUTEX_CHECK_OWNER ((void)0)
  ------------------
  803|    718|        rc = sys_pthread_mutex_lock(mutex);
  804|    718|        if (0 == rc) {
  ------------------
  |  Branch (804:13): [True: 718, False: 0]
  ------------------
  805|    718|            SYS_PTHREAD_MUTEX_SET_OWNER;
  ------------------
  |  |  791|    718|#define SYS_PTHREAD_MUTEX_SET_OWNER ((void)0)
  ------------------
  806|    718|        }
  807|    718|    } else {
  808|      0|        rc = sys_pthread_mutex_timedlock(mutex, abstime);
  809|      0|        if (0 == rc) {
  ------------------
  |  Branch (809:13): [True: 0, False: 0]
  ------------------
  810|      0|            FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex);
  ------------------
  |  |  789|      0|#define FIND_SYS_PTHREAD_MUTEX_OWNER_MAP_ENTRY(mutex) ((void)0)
  ------------------
  811|      0|            SYS_PTHREAD_MUTEX_SET_OWNER;
  ------------------
  |  |  791|      0|#define SYS_PTHREAD_MUTEX_SET_OWNER ((void)0)
  ------------------
  812|      0|        }
  813|      0|    }
  814|    718|    if (0 == rc) {
  ------------------
  |  Branch (814:9): [True: 718, False: 0]
  ------------------
  815|    718|        ADD_TLS_PTHREAD_LOCK_COUNT;
  ------------------
  |  |  554|    718|#define ADD_TLS_PTHREAD_LOCK_COUNT ((void)0)
  ------------------
  816|    718|    }
  817|    718|    return rc;
  818|    718|}
_ZN7bthread25pthread_mutex_unlock_implEP15pthread_mutex_t:
  988|    718|BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(pthread_mutex_t* mutex) {
  989|    718|    return internal::pthread_mutex_unlock_impl(mutex);
  990|    718|}
_ZN7bthread8internal25pthread_mutex_unlock_implI15pthread_mutex_tEEiPT_:
  928|    718|BUTIL_FORCE_INLINE int pthread_mutex_unlock_impl(Mutex* mutex) {
  929|       |    // Don't change behavior of unlock when profiler is off.
  930|    718|    if (!g_cp || tls_inside_lock) {
  ------------------
  |  Branch (930:9): [True: 718, False: 0]
  |  Branch (930:18): [True: 0, False: 0]
  ------------------
  931|       |        // This branch brings an issue that an entry created by
  932|       |        // add_pthread_contention_site may not be cleared. Thus we add a
  933|       |        // 16-bit rolling version in the entry to find out such entry.
  934|    718|        return pthread_mutex_unlock_internal(mutex);
  935|    718|    }
  936|      0|    int64_t unlock_start_ns = 0;
  937|      0|    bool miss_in_tls = true;
  938|      0|    bthread_contention_site_t saved_csite = {0,0};
  939|      0|#ifndef DONT_SPEEDUP_PTHREAD_CONTENTION_PROFILER_WITH_TLS
  940|      0|    TLSPthreadContentionSites& fast_alt = tls_csites;
  941|      0|    for (int i = fast_alt.count - 1; i >= 0; --i) {
  ------------------
  |  Branch (941:38): [True: 0, False: 0]
  ------------------
  942|      0|        if (fast_alt.list[i].mutex == mutex) {
  ------------------
  |  Branch (942:13): [True: 0, False: 0]
  ------------------
  943|      0|            if (is_contention_site_valid(fast_alt.list[i].csite)) {
  ------------------
  |  Branch (943:17): [True: 0, False: 0]
  ------------------
  944|      0|                saved_csite = fast_alt.list[i].csite;
  945|      0|                unlock_start_ns = butil::cpuwide_time_ns();
  946|      0|            }
  947|      0|            fast_alt.list[i] = fast_alt.list[--fast_alt.count];
  948|      0|            miss_in_tls = false;
  949|      0|            break;
  950|      0|        }
  951|      0|    }
  952|      0|#endif
  953|       |    // Check the map to see if the lock is sampled. Notice that we're still
  954|       |    // inside critical section.
  955|      0|    if (miss_in_tls) {
  ------------------
  |  Branch (955:9): [True: 0, False: 0]
  ------------------
  956|      0|        if (remove_pthread_contention_site(mutex, &saved_csite)) {
  ------------------
  |  Branch (956:13): [True: 0, False: 0]
  ------------------
  957|      0|            unlock_start_ns = butil::cpuwide_time_ns();
  958|      0|        }
  959|      0|    }
  960|      0|    const int rc = pthread_mutex_unlock_internal(mutex);
  961|       |    // [Outside lock]
  962|      0|    if (unlock_start_ns) {
  ------------------
  |  Branch (962:9): [True: 0, False: 0]
  ------------------
  963|      0|        const int64_t unlock_end_ns = butil::cpuwide_time_ns();
  964|      0|        saved_csite.duration_ns += unlock_end_ns - unlock_start_ns;
  965|      0|        submit_contention(saved_csite, unlock_end_ns);
  966|      0|    }
  967|      0|    return rc;
  968|    718|}
_ZN7bthread8internal29pthread_mutex_unlock_internalEP15pthread_mutex_t:
  843|    718|BUTIL_FORCE_INLINE int pthread_mutex_unlock_internal(pthread_mutex_t* mutex) {
  844|    718|    SYS_PTHREAD_MUTEX_RESET_OWNER(mutex);
  ------------------
  |  |  792|    718|#define SYS_PTHREAD_MUTEX_RESET_OWNER(mutex) ((void)0)
  ------------------
  845|    718|    SUB_TLS_PTHREAD_LOCK_COUNT;
  ------------------
  |  |  555|    718|#define SUB_TLS_PTHREAD_LOCK_COUNT ((void)0)
  ------------------
  846|    718|    return sys_pthread_mutex_unlock(mutex);
  847|    718|}

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

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

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

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

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

_ZN5butil9nullopt_tC2ENS_8internal20optional_forbidden_tE:
   59|     12|    explicit nullopt_t(internal::optional_forbidden_t) noexcept {}
_ZN5butil8optionalINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEEC2EOSG_:
  198|     64|    optional(T&& value) : _engaged(true) {
  199|     64|        _storage.Init(std::move(value));
  200|     64|    }
_ZNK5butil8optionalINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEE9has_valueEv:
  309|     64|    bool has_value() const { return _engaged; }
_ZN5butil8optionalINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEEptEv:
  300|    192|    T* operator->() {
  301|    192|        return _storage.get();
  302|    192|    }
_ZN5butil8optionalINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEED2Ev:
  233|     64|    ~optional() {
  234|     64|        reset();
  235|     64|    }
_ZN5butil8optionalINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEE5resetEv:
  377|     64|    void reset() {
  378|     64|        if (_engaged) {
  ------------------
  |  Branch (378:13): [True: 64, False: 0]
  ------------------
  379|     64|            _storage.Destroy();
  380|     64|            _engaged = false;
  381|     64|        }
  382|     64|    }

_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|}

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

_ZN5butil17ManualConstructorINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEE4InitIJSG_EEEvDpOT_:
   62|     64|    void Init(Args&&... args) {
   63|     64|        new (_space.void_data()) Type(std::forward<Args>(args)...);
   64|     64|    }
_ZN5butil17ManualConstructorINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEE3getEv:
   47|    256|    Type* get() {
   48|    256|        return _space.template data_as<Type>();
   49|    256|    }
_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|    }
_ZN5butil17ManualConstructorINS_7FlatMapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN4bvar8VarEntryENS_13DefaultHasherIS7_EENS_14DefaultEqualToIS7_EELb0ENS_11PtAllocatorELb0EE14NewBucketsInfoEE7DestroyEv:
   66|     64|     void Destroy() { get()->~Type(); }

_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): [True: 0, Folded]
  |  |  |  |  |  |  |  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|      8|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:7): [True: 2, False: 0]
  |  |  |  |  |  Branch (472:7): [True: 2, False: 0]
  |  |  |  |  |  Branch (472:7): [True: 2, Folded]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  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|     22|#if !defined(NDEBUG)
  157|     22|        const int rc = pthread_mutex_lock(_pmutex);
  158|     22|        if (rc) {
  ------------------
  |  Branch (158:13): [True: 0, False: 22]
  ------------------
  159|      0|            LOG(FATAL) << "Fail to lock pthread_mutex_t=" << _pmutex << ", " << 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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|      0|            _pmutex = NULL;
  161|      0|        }
  162|       |#else
  163|       |        pthread_mutex_lock(_pmutex);
  164|       |#endif  // NDEBUG
  165|     22|    }
_ZNSt10lock_guardI15pthread_mutex_tED2Ev:
  167|     22|    ~lock_guard() {
  168|     22|#ifndef NDEBUG
  169|     22|        if (_pmutex) {
  ------------------
  |  Branch (169:13): [True: 22, False: 0]
  ------------------
  170|     22|            pthread_mutex_unlock(_pmutex);
  171|     22|        }
  172|       |#else
  173|       |        pthread_mutex_unlock(_pmutex);
  174|       |#endif
  175|     22|    }

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

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

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

_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2EPKc:
  186|      8|      : ptr_(str),
  187|      8|        length_((str == NULL) ? 0 : STRING_TYPE::traits_type::length(str)) {}
  ------------------
  |  Branch (187:17): [True: 0, False: 8]
  ------------------
_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2Ev:
  184|      8|  BasicStringPiece() : ptr_(NULL), length_(0) {}
_ZN5butil9back_charERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  468|     16|inline char back_char(const std::string& s) { return s[s.size() - 1]; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4dataEv:
  208|    946|  const value_type* data() const { return ptr_; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE4sizeEv:
  209|  1.73k|  size_type size() const { return length_; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5beginEv:
  274|    408|  const_iterator begin() const { return ptr_; }
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE3endEv:
  275|    408|  const_iterator end() const { return ptr_ + length_; }
_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2ERKS6_:
  194|    768|      : ptr_(str.data()), length_(str.size()) {}
_ZN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC2EPKcm:
  196|    408|      : ptr_(offset), length_(len) {}
_ZNK5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5emptyEv:
  211|     16|  bool empty() const { return length_ == 0; }

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

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

modp_b64_decode:
  190|    768|{
  191|    768|    if (len == 0) return 0;
  ------------------
  |  Branch (191:9): [True: 489, False: 279]
  ------------------
  192|       |
  193|    279|#ifdef DOPAD
  194|       |    /*
  195|       |     * if padding is used, then the message must be at least
  196|       |     * 4 chars and be a multiple of 4
  197|       |     */
  198|    279|    if (len < 4 || (len % 4 != 0)) return MODP_B64_ERROR; /* error */
  ------------------
  |  |  131|     17|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (198:9): [True: 7, False: 272]
  |  Branch (198:20): [True: 10, False: 262]
  ------------------
  199|       |    /* there can be at most 2 pad chars at the end */
  200|    262|    if (src[len-1] == CHARPAD) {
  ------------------
  |  |    6|    262|#define CHARPAD '='
  ------------------
  |  Branch (200:9): [True: 151, False: 111]
  ------------------
  201|    151|        len--;
  202|    151|        if (src[len -1] == CHARPAD) {
  ------------------
  |  |    6|    151|#define CHARPAD '='
  ------------------
  |  Branch (202:13): [True: 48, False: 103]
  ------------------
  203|     48|            len--;
  204|     48|        }
  205|    151|    }
  206|    262|#endif
  207|       |
  208|    262|    size_t i;
  209|    262|    int leftover = len % 4;
  210|    262|    size_t chunks = (leftover == 0) ? len / 4 - 1 : len /4;
  ------------------
  |  Branch (210:21): [True: 111, False: 151]
  ------------------
  211|       |
  212|    262|    uint8_t* p = (uint8_t*)dest;
  213|    262|    uint32_t x = 0;
  214|    262|    uint32_t* destInt = (uint32_t*) p;
  215|    262|    uint32_t* srcInt = (uint32_t*) src;
  216|    262|    uint32_t y = *srcInt++;
  217|  1.00k|    for (i = 0; i < chunks; ++i) {
  ------------------
  |  Branch (217:17): [True: 752, False: 256]
  ------------------
  218|    752|        x = d0[y & 0xff] |
  219|    752|            d1[(y >> 8) & 0xff] |
  220|    752|            d2[(y >> 16) & 0xff] |
  221|    752|            d3[(y >> 24) & 0xff];
  222|       |
  223|    752|        if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   61|    752|#define BADCHAR 0x01FFFFFF
  ------------------
                      if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  131|      6|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (223:13): [True: 6, False: 746]
  ------------------
  224|    746|        *destInt = x ;
  225|    746|        p += 3;
  226|    746|        destInt = (uint32_t*)p;
  227|    746|        y = *srcInt++;}
  228|       |
  229|       |
  230|    256|    switch (leftover) {
  231|    109|    case 0:
  ------------------
  |  Branch (231:5): [True: 109, False: 147]
  ------------------
  232|    109|        x = d0[y & 0xff] |
  233|    109|            d1[(y >> 8) & 0xff] |
  234|    109|            d2[(y >> 16) & 0xff] |
  235|    109|            d3[(y >> 24) & 0xff];
  236|       |
  237|    109|        if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   61|    109|#define BADCHAR 0x01FFFFFF
  ------------------
                      if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  131|      8|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (237:13): [True: 8, False: 101]
  ------------------
  238|    101|        *p++ =  ((uint8_t*)(&x))[0];
  239|    101|        *p++ =  ((uint8_t*)(&x))[1];
  240|    101|        *p =    ((uint8_t*)(&x))[2];
  241|    101|        return (chunks+1)*3;
  242|      0|        break;
  243|      0|    case 1:  /* with padding this is an impossible case */
  ------------------
  |  Branch (243:5): [True: 0, False: 256]
  ------------------
  244|      0|        x = d0[y & 0xff];
  245|      0|        *p = *((uint8_t*)(&x)); // i.e. first char/byte in int
  246|      0|        break;
  247|     48|    case 2: // * case 2, 1  output byte */
  ------------------
  |  Branch (247:5): [True: 48, False: 208]
  ------------------
  248|     48|        x = d0[y & 0xff] | d1[y >> 8 & 0xff];
  249|     48|        *p = *((uint8_t*)(&x)); // i.e. first char
  250|     48|        break;
  251|     99|    default: /* case 3, 2 output bytes */
  ------------------
  |  Branch (251:5): [True: 99, False: 157]
  ------------------
  252|     99|        x = d0[y & 0xff] |
  253|     99|            d1[y >> 8 & 0xff ] |
  254|     99|            d2[y >> 16 & 0xff];  /* 0x3c */
  255|     99|        *p++ =  ((uint8_t*)(&x))[0];
  256|     99|        *p =  ((uint8_t*)(&x))[1];
  257|     99|        break;
  258|    256|    }
  259|       |
  260|    147|    if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |   61|    147|#define BADCHAR 0x01FFFFFF
  ------------------
                  if (x >= BADCHAR) return MODP_B64_ERROR;
  ------------------
  |  |  131|     13|#define MODP_B64_ERROR ((size_t)-1)
  ------------------
  |  Branch (260:9): [True: 13, False: 134]
  ------------------
  261|       |
  262|    134|    return 3*chunks + (6*leftover)/8;
  263|    147|}

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

_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsNullEv:
  765|  11.9k|    bool IsNull()   const { return flags_ == kNullFlag; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE4SizeEv:
 1255|    634|    SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }
  ------------------
  |  |  351|    634|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1255:29): [True: 634, False: 0]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEixEj:
 1284|  5.84k|    const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEixEj:
 1279|  5.84k|    GenericValue& operator[](SizeType index) {
 1280|  5.84k|        RAPIDJSON_ASSERT(IsArray());
  ------------------
  |  |  351|  5.84k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1280:9): [True: 5.84k, False: 0]
  ------------------
 1281|  5.84k|        RAPIDJSON_ASSERT(index < data_.a.size);
  ------------------
  |  |  351|  5.84k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1281:9): [True: 5.84k, False: 0]
  ------------------
 1282|  5.84k|        return data_.a.elements[index];
 1283|  5.84k|    }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE5IsIntEv:
  772|  3.62k|    bool IsInt()    const { return (flags_ & kIntFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7IsInt64Ev:
  774|  2.14k|    bool IsInt64()  const { return (flags_ & kInt64Flag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8GetInt64Ev:
 1427|     45|    int64_t GetInt64() const    { RAPIDJSON_ASSERT(flags_ & kInt64Flag); return data_.n.i64; }
  ------------------
  |  |  351|     45|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1427:35): [True: 45, False: 0]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsUint64Ev:
  775|  1.62k|    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)
  ------------------
  |  Branch (1428:35): [True: 34, False: 0]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsDoubleEv:
  776|  1.59k|    bool IsDouble() const { return (flags_ & kDoubleFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9GetDoubleEv:
 1430|  4.22k|    double GetDouble() const {
 1431|  4.22k|        RAPIDJSON_ASSERT(IsNumber());
  ------------------
  |  |  351|  4.22k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1431:9): [True: 4.22k, False: 0]
  ------------------
 1432|  4.22k|        if ((flags_ & kDoubleFlag) != 0)                return data_.n.d;   // exact type, no conversion.
  ------------------
  |  Branch (1432:13): [True: 594, False: 3.63k]
  ------------------
 1433|  3.63k|        if ((flags_ & kIntFlag) != 0)                   return data_.n.i.i; // int -> double
  ------------------
  |  Branch (1433:13): [True: 3.46k, 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)
  ------------------
  |  Branch (1436:9): [True: 35, False: 0]
  ------------------
 1437|     35|    }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsNumberEv:
  771|  8.56k|    bool IsNumber() const { return (flags_ & kNumberFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6GetIntEv:
 1425|  1.68k|    int GetInt() const          { RAPIDJSON_ASSERT(flags_ & kIntFlag);   return data_.n.i.i;   }
  ------------------
  |  |  351|  1.68k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1425:35): [True: 1.68k, False: 0]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsUintEv:
  773|  1.85k|    bool IsUint()   const { return (flags_ & kUintFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7GetUintEv:
 1426|     97|    unsigned GetUint() const    { RAPIDJSON_ASSERT(flags_ & kUintFlag);  return data_.n.u.u;   }
  ------------------
  |  |  351|     97|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1426:35): [True: 97, False: 0]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE6IsBoolEv:
  768|  4.15k|    bool IsBool()   const { return (flags_ & kBoolFlag) != 0; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7GetBoolEv:
  791|  1.01k|    bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return flags_ == kTrueFlag; }
  ------------------
  |  |  351|  1.01k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (791:28): [True: 1.01k, False: 0]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsStringEv:
  777|   212k|    bool IsString() const { return (flags_ & kStringFlag) != 0; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7SetNullEv:
  784|  4.20k|    GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEED2Ev:
  564|  28.8k|    ~GenericValue() {
  565|  28.8k|        if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
  ------------------
  |  Branch (565:13): [Folded, False: 28.8k]
  ------------------
  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.8k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ev:
  440|  8.96k|    GenericValue() RAPIDJSON_NOEXCEPT : data_(), flags_(kNullFlag) {}
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E16ClearStackOnExitC2ERS7_:
 1933|  4.20k|        explicit ClearStackOnExit(GenericDocument& d) : d_(d) {}
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E11StartObjectEv:
 1964|  7.66k|    bool StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2ENS0_4TypeE:
  460|  80.4k|    explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_(), flags_() {
  461|  80.4k|        static const unsigned defaultFlags[7] = {
  462|  80.4k|            kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
  463|  80.4k|            kNumberAnyFlag
  464|  80.4k|        };
  465|  80.4k|        RAPIDJSON_ASSERT(type <= kNumberType);
  ------------------
  |  |  351|  80.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (465:9): [True: 80.4k, False: 0]
  ------------------
  466|  80.4k|        flags_ = defaultFlags[type];
  467|       |
  468|       |        // Use ShortString to store empty string.
  469|  80.4k|        if (type == kStringType)
  ------------------
  |  Branch (469:13): [True: 0, False: 80.4k]
  ------------------
  470|      0|            data_.ss.SetLength(0);
  471|  80.4k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11ShortString9SetLengthEj:
 1609|  15.6k|        inline void     SetLength(SizeType len) { str[LenPos] = (Ch)(MaxSize -  len); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E10StartArrayEv:
 1974|  72.7k|    bool StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); return true; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E3KeyEPKcjb:
 1966|  12.0k|    bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6StringEPKcjb:
 1956|  16.2k|    bool String(const Ch* str, SizeType length, bool copy) { 
 1957|  16.2k|        if (copy) 
  ------------------
  |  Branch (1957:13): [True: 16.2k, False: 0]
  ------------------
 1958|  16.2k|            new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
 1959|      0|        else
 1960|      0|            new (stack_.template Push<ValueType>()) ValueType(str, length);
 1961|  16.2k|        return true;
 1962|  16.2k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E12GetAllocatorEv:
 1925|  25.3k|    Allocator& GetAllocator() { return *allocator_; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2EPKcjRS6_:
  549|  16.2k|    GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_(), flags_() { SetStringRaw(StringRef(s, length), allocator); }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE12SetStringRawENS0_16GenericStringRefIcEERS6_:
 1691|  16.2k|    void SetStringRaw(StringRefType s, Allocator& allocator) {
 1692|  16.2k|        Ch* str = NULL;
 1693|  16.2k|        if(ShortString::Usable(s.length)) {
  ------------------
  |  Branch (1693:12): [True: 15.6k, False: 572]
  ------------------
 1694|  15.6k|            flags_ = kShortStringFlag;
 1695|  15.6k|            data_.ss.SetLength(s.length);
 1696|  15.6k|            str = data_.ss.str;
 1697|  15.6k|        } else {
 1698|    572|            flags_ = kCopyStringFlag;
 1699|    572|            data_.s.length = s.length;
 1700|    572|            str = (Ch *)allocator.Malloc((s.length + 1) * sizeof(Ch));
 1701|    572|            data_.s.str = str;
 1702|    572|        }
 1703|  16.2k|        std::memcpy(str, s, s.length * sizeof(Ch));
 1704|  16.2k|        str[s.length] = '\0';
 1705|  16.2k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11ShortString6UsableEj:
 1608|  16.2k|        inline static bool Usable(SizeType len) { return            (MaxSize >= len); }
_ZNK5butil9rapidjson16GenericStringRefIcEcvPKcEv:
  323|  36.6k|    operator const Ch *() const { return s; }
_ZN5butil9rapidjson9StringRefIcEENS0_16GenericStringRefIT_EEPKS3_m:
  369|  16.2k|inline GenericStringRef<CharType> StringRef(const CharType* str, size_t length) {
  370|  16.2k|    return GenericStringRef<CharType>(str, SizeType(length));
  371|  16.2k|}
_ZN5butil9rapidjson16GenericStringRefIcEC2EPKcj:
  316|  36.6k|        : s(str), length(len) { RAPIDJSON_ASSERT(s != NULL); }
  ------------------
  |  |  351|  36.6k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (316:33): [True: 36.6k, False: 0]
  ------------------
_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|    557|    bool Null() { new (stack_.template Push<ValueType>()) ValueType(); return true; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E4BoolEb:
 1949|  1.92k|    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.92k|        : data_(), flags_(b ? kTrueFlag : kFalseFlag) {
  ------------------
  |  Branch (495:27): [True: 1.49k, False: 439]
  ------------------
  496|       |            // safe-guard against failing SFINAE
  497|  1.92k|            RAPIDJSON_STATIC_ASSERT((internal::IsSame<bool,T>::Value));
  ------------------
  |  |  383|  1.92k|    typedef ::BUTIL_RAPIDJSON_NAMESPACE::StaticAssertTest< \
  |  |  384|  1.92k|      sizeof(::BUTIL_RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE<bool(x) >)> \
  |  |  385|  1.92k|    RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE
  ------------------
  498|  1.92k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6DoubleEd:
 1954|  4.66k|    bool Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ed:
  540|  4.66k|    explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberDoubleFlag) { data_.n.d = d; }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E8AddInt64El:
 1952|    512|    bool AddInt64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2El:
  515|    512|    explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberInt64Flag) {
  516|    512|        data_.n.i64 = i64;
  517|    512|        if (i64 >= 0) {
  ------------------
  |  Branch (517:13): [True: 0, False: 512]
  ------------------
  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|    512|        else if (i64 >= static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
  ------------------
  |  |  268|    512|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (524:18): [True: 0, False: 512]
  ------------------
  525|      0|            flags_ |= kIntFlag;
  526|    512|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E9AddUint64Em:
 1953|    690|    bool AddUint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Em:
  529|    690|    explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUint64Flag) {
  530|    690|        data_.n.u64 = u64;
  531|    690|        if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000)))
  ------------------
  |  |  268|    690|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (531:13): [True: 401, False: 289]
  ------------------
  532|    401|            flags_ |= kInt64Flag;
  533|    690|        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
  ------------------
  |  |  268|    690|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (533:13): [True: 0, False: 690]
  ------------------
  534|      0|            flags_ |= kUintFlag;
  535|    690|        if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
  ------------------
  |  |  268|    690|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (535:13): [True: 0, False: 690]
  ------------------
  536|      0|            flags_ |= kIntFlag;
  537|    690|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E6AddIntEi:
 1950|  1.00k|    bool AddInt(int i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ei:
  501|  1.00k|    explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberIntFlag) {
  502|  1.00k|        data_.n.i64 = i;
  503|  1.00k|        if (i >= 0)
  ------------------
  |  Branch (503:13): [True: 377, False: 624]
  ------------------
  504|    377|            flags_ |= kUintFlag | kUint64Flag;
  505|  1.00k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E7AddUintEj:
 1951|  11.0k|    bool AddUint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2Ej:
  508|  11.0k|    explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_(), flags_(kNumberUintFlag) {
  509|  11.0k|        data_.n.u64 = u; 
  510|  11.0k|        if (!(u & 0x80000000))
  ------------------
  |  Branch (510:13): [True: 10.8k, False: 223]
  ------------------
  511|  10.8k|            flags_ |= kIntFlag | kInt64Flag;
  512|  11.0k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E9EndObjectEj:
 1968|  6.75k|    bool EndObject(SizeType memberCount) {
 1969|  6.75k|        typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
 1970|  6.75k|        stack_.template Top<ValueType>()->SetObjectRaw(members, (SizeType)memberCount, GetAllocator());
 1971|  6.75k|        return true;
 1972|  6.75k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE12SetObjectRawEPNS0_13GenericMemberIS3_S6_EEjRS6_:
 1672|  6.75k|    void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) {
 1673|  6.75k|        flags_ = kObjectFlag;
 1674|  6.75k|        if (count) {
  ------------------
  |  Branch (1674:13): [True: 6.11k, False: 646]
  ------------------
 1675|  6.11k|            data_.o.members = (Member*)allocator.Malloc(count * sizeof(Member));
 1676|  6.11k|            std::memcpy(static_cast<void*>(data_.o.members), members, count * sizeof(Member));
 1677|  6.11k|        }
 1678|    646|        else
 1679|    646|            data_.o.members = NULL;
 1680|  6.75k|        data_.o.size = data_.o.capacity = count;
 1681|  6.75k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E8EndArrayEj:
 1976|  2.37k|    bool EndArray(SizeType elementCount) {
 1977|  2.37k|        ValueType* elements = stack_.template Pop<ValueType>(elementCount);
 1978|  2.37k|        stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
 1979|  2.37k|        return true;
 1980|  2.37k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11SetArrayRawEPS7_jRS6_:
 1660|  2.37k|    void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) {
 1661|  2.37k|        flags_ = kArrayFlag;
 1662|  2.37k|        if (count) {
  ------------------
  |  Branch (1662:13): [True: 1.95k, False: 421]
  ------------------
 1663|  1.95k|            data_.a.elements = (GenericValue*)allocator.Malloc(count * sizeof(GenericValue));
 1664|  1.95k|            std::memcpy(static_cast<void*>(data_.a.elements), values, count * sizeof(GenericValue));
 1665|  1.95k|        }
 1666|    421|        else
 1667|    421|            data_.a.elements = NULL;
 1668|  2.37k|        data_.a.size = data_.a.capacity = count;
 1669|  2.37k|    }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9RawAssignERS7_:
 1708|  2.69k|    void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT {
 1709|  2.69k|        data_ = rhs.data_;
 1710|  2.69k|        flags_ = rhs.flags_;
 1711|  2.69k|        rhs.flags_ = kNullFlag;
 1712|  2.69k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E16ClearStackOnExitD2Ev:
 1934|  4.20k|        ~ClearStackOnExit() { d_.ClearStack(); }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E10ClearStackEv:
 1999|  4.20k|    void ClearStack() {
 2000|  4.20k|        if (Allocator::kNeedFree)
  ------------------
  |  Branch (2000:13): [Folded, False: 4.20k]
  ------------------
 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.20k|        else
 2004|  4.20k|            stack_.Clear();
 2005|  4.20k|        stack_.ShrinkToFit();
 2006|  4.20k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E5ParseILj4EEERS7_PKc:
 1898|  4.20k|    GenericDocument& Parse(const Ch* str) {
 1899|  4.20k|        return Parse<parseFlags, Encoding>(str);
 1900|  4.20k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E5ParseILj4ES3_EERS7_PKc:
 1887|  4.20k|    GenericDocument& Parse(const Ch* str) {
 1888|  4.20k|        RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
  ------------------
  |  |  351|  4.20k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1888:9): [True: 4.20k, Folded]
  ------------------
 1889|  4.20k|        GenericStringStream<SourceEncoding> s(str);
 1890|  4.20k|        return ParseStream<parseFlags, SourceEncoding>(s);
 1891|  4.20k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E11ParseStreamILj4ES3_NS0_19GenericStringStreamIS3_EEEERS7_RT1_:
 1821|  4.20k|    GenericDocument& ParseStream(InputStream& is) {
 1822|  4.20k|        ValueType::SetNull(); // Remove existing root if exist
 1823|  4.20k|        GenericReader<SourceEncoding, Encoding, StackAllocator> reader(&stack_.GetAllocator());
 1824|  4.20k|        ClearStackOnExit scope(*this);
 1825|  4.20k|        parseResult_ = reader.template Parse<parseFlags>(is, *this);
 1826|  4.20k|        if (parseResult_) {
  ------------------
  |  Branch (1826:13): [True: 2.69k, False: 1.51k]
  ------------------
 1827|  2.69k|            RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
  ------------------
  |  |  351|  2.69k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1827:13): [True: 2.69k, False: 0]
  ------------------
 1828|  2.69k|            this->RawAssign(*stack_.template Pop<ValueType>(1));    // Add this-> to prevent issue 13.
 1829|  2.69k|        }
 1830|  4.20k|        return *this;
 1831|  4.20k|    }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9GetStringEv:
 1450|  39.6k|    const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return ((flags_ & kInlineStrFlag) ? data_.ss.str : data_.s.str); }
  ------------------
  |  |  351|  39.6k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1450:35): [True: 39.6k, False: 0]
  |  Branch (1450:73): [True: 21.3k, False: 18.3k]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE15GetStringLengthEv:
 1455|  75.1k|    SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((flags_ & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); }
  ------------------
  |  |  351|  75.1k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1455:40): [True: 75.1k, False: 0]
  |  Branch (1455:78): [True: 38.5k, False: 36.6k]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11ShortString9GetLengthEv:
 1610|  38.5k|        inline SizeType GetLength() const       { return  (SizeType)(MaxSize -  str[LenPos]); }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE7IsArrayEv:
  770|  14.1k|    bool IsArray()  const { return flags_ == kArrayFlag; }
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE8IsObjectEv:
  769|   118k|    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)
  ------------------
  |  Branch (862:47): [True: 20.4k, False: 0]
  ------------------
_ZNK5butil9rapidjson21GenericMemberIteratorILb1ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEptEv:
  189|  9.77k|    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)
  ------------------
  |  Branch (320:46): [True: 20.4k, False: 0]
  ------------------
_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)
  ------------------
  |  Branch (938:9): [True: 20.4k, False: 0]
  ------------------
  939|  20.4k|        RAPIDJSON_ASSERT(name.IsString());
  ------------------
  |  |  351|  20.4k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (939:9): [True: 20.4k, False: 0]
  ------------------
  940|  20.4k|        MemberIterator member = MemberBegin();
  941|  46.5k|        for ( ; member != MemberEnd(); ++member)
  ------------------
  |  Branch (941:17): [True: 35.9k, False: 10.6k]
  ------------------
  942|  35.9k|            if (name.StringEqual(member->name))
  ------------------
  |  Branch (942:17): [True: 9.77k, False: 26.1k]
  ------------------
  943|  9.77k|                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)
  ------------------
  |  Branch (865:47): [True: 20.4k, False: 0]
  ------------------
_ZN5butil9rapidjson21GenericMemberIteratorILb0ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2EPNS0_13GenericMemberIS3_S6_EE:
  198|  66.9k|    explicit GenericMemberIterator(Pointer p) : ptr_(p) {}
_ZNK5butil9rapidjson21GenericMemberIteratorILb0ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEneENS1_ILb1ES3_S6_EE:
  179|  46.5k|    bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; }
_ZN5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE9MemberEndEv:
  868|  46.5k|    MemberIterator MemberEnd()              { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(data_.o.members + data_.o.size); }
  ------------------
  |  |  351|  46.5k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (868:47): [True: 46.5k, False: 0]
  ------------------
_ZNK5butil9rapidjson12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEE11StringEqualIS6_EEbRKNS1_IS3_T_EE:
 1715|  35.9k|    bool StringEqual(const GenericValue<Encoding, SourceAllocator>& rhs) const {
 1716|  35.9k|        RAPIDJSON_ASSERT(IsString());
  ------------------
  |  |  351|  35.9k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1716:9): [True: 35.9k, False: 0]
  ------------------
 1717|  35.9k|        RAPIDJSON_ASSERT(rhs.IsString());
  ------------------
  |  |  351|  35.9k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1717:9): [True: 35.9k, False: 0]
  ------------------
 1718|       |
 1719|  35.9k|        const SizeType len1 = GetStringLength();
 1720|  35.9k|        const SizeType len2 = rhs.GetStringLength();
 1721|  35.9k|        if(len1 != len2) { return false; }
  ------------------
  |  Branch (1721:12): [True: 18.1k, 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|  35.9k|    Pointer   operator->() const { return ptr_; }
_ZN5butil9rapidjson21GenericMemberIteratorILb0ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEppEv:
  161|  26.1k|    Iterator& operator++(){ ++ptr_; return *this; }
_ZN5butil9rapidjson21GenericMemberIteratorILb1ENS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEEEC2ERKNS1_ILb0ES3_S6_EE:
  157|  66.9k|    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.20k|        allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
 1762|  4.20k|    {
 1763|  4.20k|        if (!allocator_)
  ------------------
  |  Branch (1763:13): [True: 4.20k, False: 0]
  ------------------
 1764|  4.20k|            ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  4.20k|#define RAPIDJSON_NEW(x) new x
  ------------------
 1765|  4.20k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_ED2Ev:
 1782|  4.20k|    ~GenericDocument() {
 1783|  4.20k|        Destroy();
 1784|  4.20k|    }
_ZN5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E7DestroyEv:
 2008|  4.20k|    void Destroy() {
 2009|  4.20k|        RAPIDJSON_DELETE(ownAllocator_);
  ------------------
  |  |  495|  4.20k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
 2010|  4.20k|    }
_ZNK5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E13HasParseErrorEv:
 1914|  4.20k|    bool HasParseError() const { return parseResult_.IsError(); }
_ZNK5butil9rapidjson15GenericDocumentINS0_4UTF8IcEENS0_19MemoryPoolAllocatorINS0_12CrtAllocatorEEES5_E13GetParseErrorEv:
 1917|  1.51k|    ParseErrorCode GetParseError() const { return parseResult_.Code(); }

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

_ZN5butil9rapidjson16GetParseError_EnENS0_14ParseErrorCodeE:
   30|  1.51k|inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) {
   31|  1.51k|    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.51k]
  ------------------
   33|       |
   34|     13|        case kParseErrorDocumentEmpty:                  return RAPIDJSON_ERROR_STRING("The document is empty.");
  ------------------
  |  |   47|     13|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (34:9): [True: 13, False: 1.49k]
  ------------------
   35|     84|        case kParseErrorDocumentRootNotSingular:        return RAPIDJSON_ERROR_STRING("The document root must not follow by other values.");
  ------------------
  |  |   47|     84|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (35:9): [True: 84, False: 1.42k]
  ------------------
   36|       |    
   37|    160|        case kParseErrorValueInvalid:                   return RAPIDJSON_ERROR_STRING("Invalid value.");
  ------------------
  |  |   47|    160|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (37:9): [True: 160, False: 1.35k]
  ------------------
   38|       |    
   39|     48|        case kParseErrorObjectMissName:                 return RAPIDJSON_ERROR_STRING("Missing a name for object member.");
  ------------------
  |  |   47|     48|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (39:9): [True: 48, False: 1.46k]
  ------------------
   40|     27|        case kParseErrorObjectMissColon:                return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member.");
  ------------------
  |  |   47|     27|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (40:9): [True: 27, False: 1.48k]
  ------------------
   41|     10|        case kParseErrorObjectMissCommaOrCurlyBracket:  return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member.");
  ------------------
  |  |   47|     10|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (41:9): [True: 10, False: 1.50k]
  ------------------
   42|       |    
   43|    457|        case kParseErrorArrayMissCommaOrSquareBracket:  return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element.");
  ------------------
  |  |   47|    457|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (43:9): [True: 457, False: 1.05k]
  ------------------
   44|       |
   45|    177|        case kParseErrorStringUnicodeEscapeInvalidHex:  return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string.");
  ------------------
  |  |   47|    177|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (45:9): [True: 177, False: 1.33k]
  ------------------
   46|     57|        case kParseErrorStringUnicodeSurrogateInvalid:  return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid.");
  ------------------
  |  |   47|     57|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (46:9): [True: 57, False: 1.45k]
  ------------------
   47|     17|        case kParseErrorStringEscapeInvalid:            return RAPIDJSON_ERROR_STRING("Invalid escape character in string.");
  ------------------
  |  |   47|     17|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (47:9): [True: 17, False: 1.49k]
  ------------------
   48|    308|        case kParseErrorStringMissQuotationMark:        return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string.");
  ------------------
  |  |   47|    308|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (48:9): [True: 308, False: 1.20k]
  ------------------
   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.51k]
  ------------------
   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.50k]
  ------------------
   52|     14|        case kParseErrorNumberMissFraction:             return RAPIDJSON_ERROR_STRING("Miss fraction part in number.");
  ------------------
  |  |   47|     14|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (52:9): [True: 14, False: 1.49k]
  ------------------
   53|     74|        case kParseErrorNumberMissExponent:             return RAPIDJSON_ERROR_STRING("Miss exponent in number.");
  ------------------
  |  |   47|     74|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (53:9): [True: 74, False: 1.43k]
  ------------------
   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.51k]
  ------------------
   56|     63|        case kParseErrorUnspecificSyntaxError:          return RAPIDJSON_ERROR_STRING("Unspecific syntax error.");
  ------------------
  |  |   47|     63|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
  |  Branch (56:9): [True: 63, False: 1.44k]
  ------------------
   57|       |
   58|      0|        default:
  ------------------
  |  Branch (58:9): [True: 0, False: 1.51k]
  ------------------
   59|      0|            return RAPIDJSON_ERROR_STRING("Unknown error.");
  ------------------
  |  |   47|      0|#define RAPIDJSON_ERROR_STRING(x) x
  ------------------
   60|  1.51k|    }
   61|  1.51k|}

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

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

_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE12GetAllocatorEv:
  127|  4.20k|    Allocator& GetAllocator() { return *allocator_; }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEEC2EPS3_m:
   34|  8.41k|    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.41k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (35:9): [True: 8.41k, False: 0]
  ------------------
   36|  8.41k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEED2Ev:
   56|  8.41k|    ~Stack() {
   57|  8.41k|        Destroy();
   58|  8.41k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE7DestroyEv:
  159|  8.41k|    void Destroy() {
  160|  8.41k|        Allocator::Free(stack_);
  161|  8.41k|        RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack
  ------------------
  |  |  495|  8.41k|#define RAPIDJSON_DELETE(x) delete x
  ------------------
  162|  8.41k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushIjEEPT_m:
  101|   160k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|   160k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 3.62k, False: 157k]
  ------------------
  104|  3.62k|            Expand<T>(count);
  105|       |
  106|   160k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|   160k|        stackTop_ += sizeof(T) * count;
  108|   160k|        return ret;
  109|   160k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandIjEEvm:
  134|  3.62k|    void Expand(size_t count) {
  135|       |        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.
  136|  3.62k|        size_t newCapacity;
  137|  3.62k|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 2.47k, False: 1.15k]
  ------------------
  138|  2.47k|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 2.47k, False: 0]
  ------------------
  139|  2.47k|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  2.47k|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|  2.47k|            newCapacity = initialCapacity_;
  141|  2.47k|        } else {
  142|  1.15k|            newCapacity = GetCapacity();
  143|  1.15k|            newCapacity += (newCapacity + 1) / 2;
  144|  1.15k|        }
  145|  3.62k|        size_t newSize = GetSize() + sizeof(T) * count;
  146|  3.62k|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 3.62k]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|  3.62k|        Resize(newCapacity);
  150|  3.62k|    }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE11GetCapacityEv:
  130|  12.1k|    size_t GetCapacity() const { return static_cast<size_t>(stackEnd_ - stack_); }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ResizeEm:
  152|  9.27k|    void Resize(size_t newCapacity) {
  153|  9.27k|        const size_t size = GetSize();  // Backup the current size
  154|  9.27k|        stack_ = (char*)allocator_->Realloc(stack_, GetCapacity(), newCapacity);
  155|  9.27k|        stackTop_ = stack_ + size;
  156|  9.27k|        stackEnd_ = stack_ + newCapacity;
  157|  9.27k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_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: 5.08k, False: 111k]
  ------------------
  104|  5.08k|            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_12CrtAllocatorEE6ExpandINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEvm:
  134|  5.08k|    void Expand(size_t count) {
  135|       |        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.
  136|  5.08k|        size_t newCapacity;
  137|  5.08k|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 3.64k, False: 1.44k]
  ------------------
  138|  3.64k|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 3.64k, False: 0]
  ------------------
  139|  3.64k|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|  3.64k|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|  3.64k|            newCapacity = initialCapacity_;
  141|  3.64k|        } else {
  142|  1.44k|            newCapacity = GetCapacity();
  143|  1.44k|            newCapacity += (newCapacity + 1) / 2;
  144|  1.44k|        }
  145|  5.08k|        size_t newSize = GetSize() + sizeof(T) * count;
  146|  5.08k|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 5.08k]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|  5.08k|        Resize(newCapacity);
  150|  5.08k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE4PushIcEEPT_m:
  101|   119k|    RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) {
  102|       |         // Expand the stack if needed
  103|   119k|        if (stackTop_ + sizeof(T) * count >= stackEnd_)
  ------------------
  |  Branch (103:13): [True: 569, False: 118k]
  ------------------
  104|    569|            Expand<T>(count);
  105|       |
  106|   119k|        T* ret = reinterpret_cast<T*>(stackTop_);
  107|   119k|        stackTop_ += sizeof(T) * count;
  108|   119k|        return ret;
  109|   119k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE6ExpandIcEEvm:
  134|    569|    void Expand(size_t count) {
  135|       |        // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity.
  136|    569|        size_t newCapacity;
  137|    569|        if (stack_ == 0) {
  ------------------
  |  Branch (137:13): [True: 273, False: 296]
  ------------------
  138|    273|            if (!allocator_)
  ------------------
  |  Branch (138:17): [True: 273, False: 0]
  ------------------
  139|    273|                ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator());
  ------------------
  |  |  491|    273|#define RAPIDJSON_NEW(x) new x
  ------------------
  140|    273|            newCapacity = initialCapacity_;
  141|    296|        } else {
  142|    296|            newCapacity = GetCapacity();
  143|    296|            newCapacity += (newCapacity + 1) / 2;
  144|    296|        }
  145|    569|        size_t newSize = GetSize() + sizeof(T) * count;
  146|    569|        if (newCapacity < newSize)
  ------------------
  |  Branch (146:13): [True: 0, False: 569]
  ------------------
  147|      0|            newCapacity = newSize;
  148|       |
  149|    569|        Resize(newCapacity);
  150|    569|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopIcEEPT_m:
  112|  16.2k|    T* Pop(size_t count) {
  113|  16.2k|        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  16.2k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (113:9): [True: 16.2k, False: 0]
  ------------------
  114|  16.2k|        stackTop_ -= count * sizeof(T);
  115|  16.2k|        return reinterpret_cast<T*>(stackTop_);
  116|  16.2k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3TopIjEEPT_v:
  119|  44.7k|    T* Top() { 
  120|  44.7k|        RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
  ------------------
  |  |  351|  44.7k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (120:9): [True: 44.7k, False: 0]
  ------------------
  121|  44.7k|        return reinterpret_cast<T*>(stackTop_ - sizeof(T));
  122|  44.7k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopIjEEPT_m:
  112|  18.2k|    T* Pop(size_t count) {
  113|  18.2k|        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  18.2k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (113:9): [True: 18.2k, False: 0]
  ------------------
  114|  18.2k|        stackTop_ -= count * sizeof(T);
  115|  18.2k|        return reinterpret_cast<T*>(stackTop_);
  116|  18.2k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopINS0_13GenericMemberINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_m:
  112|  6.75k|    T* Pop(size_t count) {
  113|  6.75k|        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  6.75k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (113:9): [True: 6.75k, False: 0]
  ------------------
  114|  6.75k|        stackTop_ -= count * sizeof(T);
  115|  6.75k|        return reinterpret_cast<T*>(stackTop_);
  116|  6.75k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3TopINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_v:
  119|  9.13k|    T* Top() { 
  120|  9.13k|        RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
  ------------------
  |  |  351|  9.13k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (120:9): [True: 9.13k, False: 0]
  ------------------
  121|  9.13k|        return reinterpret_cast<T*>(stackTop_ - sizeof(T));
  122|  9.13k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE5ClearEv:
   84|  8.41k|    void Clear() { stackTop_ = stack_; }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE7GetSizeEv:
  129|   121k|    size_t GetSize() const { return static_cast<size_t>(stackTop_ - stack_); }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE3PopINS0_12GenericValueINS0_4UTF8IcEENS0_19MemoryPoolAllocatorIS3_EEEEEEPT_m:
  112|  5.07k|    T* Pop(size_t count) {
  113|  5.07k|        RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
  ------------------
  |  |  351|  5.07k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (113:9): [True: 5.07k, False: 0]
  ------------------
  114|  5.07k|        stackTop_ -= count * sizeof(T);
  115|  5.07k|        return reinterpret_cast<T*>(stackTop_);
  116|  5.07k|    }
_ZN5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE11ShrinkToFitEv:
   86|  4.20k|    void ShrinkToFit() { 
   87|  4.20k|        if (Empty()) {
  ------------------
  |  Branch (87:13): [True: 4.20k, False: 0]
  ------------------
   88|       |            // If the stack is empty, completely deallocate the memory.
   89|  4.20k|            Allocator::Free(stack_);
   90|  4.20k|            stack_ = 0;
   91|  4.20k|            stackTop_ = 0;
   92|  4.20k|            stackEnd_ = 0;
   93|  4.20k|        }
   94|      0|        else
   95|      0|            Resize(GetSize());
   96|  4.20k|    }
_ZNK5butil9rapidjson8internal5StackINS0_12CrtAllocatorEE5EmptyEv:
  128|  4.20k|    bool Empty() const { return stackTop_ == stack_; }

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

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

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

_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEEC2EPS4_m:
  397|  4.20k|        : stack_(stackAllocator, stackCapacity), parseResult_() {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE16ClearStackOnExitC2ERS5_:
  477|  4.20k|        explicit ClearStackOnExit(GenericReader& r) : r_(r) {}
_ZN5butil9rapidjson14SkipWhitespaceINS0_19GenericStringStreamINS0_4UTF8IcEEEEEEvRT_:
  261|   164k|void SkipWhitespace(InputStream& is) {
  262|   164k|    internal::StreamLocalCopy<InputStream> copy(is);
  263|   164k|    InputStream& s(copy.s);
  264|       |
  265|   166k|    while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t')
  ------------------
  |  Branch (265:12): [True: 415, False: 165k]
  |  Branch (265:31): [True: 395, False: 165k]
  |  Branch (265:51): [True: 114, False: 165k]
  |  Branch (265:71): [True: 285, False: 164k]
  ------------------
  266|  1.20k|        s.Take();
  267|   164k|}
_ZN5butil9rapidjson8internal15StreamLocalCopyINS0_19GenericStringStreamINS0_4UTF8IcEEEELi1EEC2ERS6_:
  228|   199k|    StreamLocalCopy(Stream& original) : s(original), original_(original) {}
_ZN5butil9rapidjson8internal15StreamLocalCopyINS0_19GenericStringStreamINS0_4UTF8IcEEEELi1EED2Ev:
  229|   199k|    ~StreamLocalCopy() { original_ = s; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE8TokenizeEc:
 1165|   161k|    RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
 1166|       |
 1167|       |//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
 1168|   161k|#define N NumberToken
 1169|   161k|#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|   161k|        static const unsigned char tokenMap[256] = {
 1172|   161k|            N16, // 00~0F
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
 1173|   161k|            N16, // 10~1F
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
 1174|   161k|            N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
 1175|   161k|            N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
 1176|   161k|            N16, // 40~4F
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
 1177|   161k|            N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
 1178|   161k|            N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
 1179|   161k|            N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
                          N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F
  ------------------
  |  | 1168|   161k|#define N NumberToken
  ------------------
 1180|   161k|            N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
                          N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF
  ------------------
  |  | 1169|   161k|#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  |  |               #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
  |  |  ------------------
  |  |  |  | 1168|   161k|#define N NumberToken
  |  |  ------------------
  ------------------
 1181|   161k|        };
 1182|   161k|#undef N
 1183|   161k|#undef N16
 1184|       |//!@endcond
 1185|       |        
 1186|   161k|        if (sizeof(Ch) == 1 || unsigned(c) < 256)
  ------------------
  |  Branch (1186:13): [True: 161k, Folded]
  |  Branch (1186:32): [True: 0, False: 0]
  ------------------
 1187|   161k|            return (Token)tokenMap[(unsigned char)c];
 1188|      0|        else
 1189|      0|            return NumberToken;
 1190|   161k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE7PredictENS5_21IterativeParsingStateENS5_5TokenE:
 1192|   161k|    RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
 1193|       |        // current state x one lookahead token -> new state
 1194|   161k|        static const char G[cIterativeParsingStateCount][kTokenCount] = {
 1195|       |            // Start
 1196|   161k|            {
 1197|   161k|                IterativeParsingArrayInitialState,  // Left bracket
 1198|   161k|                IterativeParsingErrorState,         // Right bracket
 1199|   161k|                IterativeParsingObjectInitialState, // Left curly bracket
 1200|   161k|                IterativeParsingErrorState,         // Right curly bracket
 1201|   161k|                IterativeParsingErrorState,         // Comma
 1202|   161k|                IterativeParsingErrorState,         // Colon
 1203|   161k|                IterativeParsingValueState,         // String
 1204|   161k|                IterativeParsingValueState,         // False
 1205|   161k|                IterativeParsingValueState,         // True
 1206|   161k|                IterativeParsingValueState,         // Null
 1207|   161k|                IterativeParsingValueState          // Number
 1208|   161k|            },
 1209|       |            // Finish(sink state)
 1210|   161k|            {
 1211|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1212|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1213|   161k|                IterativeParsingErrorState
 1214|   161k|            },
 1215|       |            // Error(sink state)
 1216|   161k|            {
 1217|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1218|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1219|   161k|                IterativeParsingErrorState
 1220|   161k|            },
 1221|       |            // ObjectInitial
 1222|   161k|            {
 1223|   161k|                IterativeParsingErrorState,         // Left bracket
 1224|   161k|                IterativeParsingErrorState,         // Right bracket
 1225|   161k|                IterativeParsingErrorState,         // Left curly bracket
 1226|   161k|                IterativeParsingObjectFinishState,  // Right curly bracket
 1227|   161k|                IterativeParsingErrorState,         // Comma
 1228|   161k|                IterativeParsingErrorState,         // Colon
 1229|   161k|                IterativeParsingMemberKeyState,     // String
 1230|   161k|                IterativeParsingErrorState,         // False
 1231|   161k|                IterativeParsingErrorState,         // True
 1232|   161k|                IterativeParsingErrorState,         // Null
 1233|   161k|                IterativeParsingErrorState          // Number
 1234|   161k|            },
 1235|       |            // MemberKey
 1236|   161k|            {
 1237|   161k|                IterativeParsingErrorState,             // Left bracket
 1238|   161k|                IterativeParsingErrorState,             // Right bracket
 1239|   161k|                IterativeParsingErrorState,             // Left curly bracket
 1240|   161k|                IterativeParsingErrorState,             // Right curly bracket
 1241|   161k|                IterativeParsingErrorState,             // Comma
 1242|   161k|                IterativeParsingKeyValueDelimiterState, // Colon
 1243|   161k|                IterativeParsingErrorState,             // String
 1244|   161k|                IterativeParsingErrorState,             // False
 1245|   161k|                IterativeParsingErrorState,             // True
 1246|   161k|                IterativeParsingErrorState,             // Null
 1247|   161k|                IterativeParsingErrorState              // Number
 1248|   161k|            },
 1249|       |            // KeyValueDelimiter
 1250|   161k|            {
 1251|   161k|                IterativeParsingArrayInitialState,      // Left bracket(push MemberValue state)
 1252|   161k|                IterativeParsingErrorState,             // Right bracket
 1253|   161k|                IterativeParsingObjectInitialState,     // Left curly bracket(push MemberValue state)
 1254|   161k|                IterativeParsingErrorState,             // Right curly bracket
 1255|   161k|                IterativeParsingErrorState,             // Comma
 1256|   161k|                IterativeParsingErrorState,             // Colon
 1257|   161k|                IterativeParsingMemberValueState,       // String
 1258|   161k|                IterativeParsingMemberValueState,       // False
 1259|   161k|                IterativeParsingMemberValueState,       // True
 1260|   161k|                IterativeParsingMemberValueState,       // Null
 1261|   161k|                IterativeParsingMemberValueState        // Number
 1262|   161k|            },
 1263|       |            // MemberValue
 1264|   161k|            {
 1265|   161k|                IterativeParsingErrorState,             // Left bracket
 1266|   161k|                IterativeParsingErrorState,             // Right bracket
 1267|   161k|                IterativeParsingErrorState,             // Left curly bracket
 1268|   161k|                IterativeParsingObjectFinishState,      // Right curly bracket
 1269|   161k|                IterativeParsingMemberDelimiterState,   // Comma
 1270|   161k|                IterativeParsingErrorState,             // Colon
 1271|   161k|                IterativeParsingErrorState,             // String
 1272|   161k|                IterativeParsingErrorState,             // False
 1273|   161k|                IterativeParsingErrorState,             // True
 1274|   161k|                IterativeParsingErrorState,             // Null
 1275|   161k|                IterativeParsingErrorState              // Number
 1276|   161k|            },
 1277|       |            // MemberDelimiter
 1278|   161k|            {
 1279|   161k|                IterativeParsingErrorState,         // Left bracket
 1280|   161k|                IterativeParsingErrorState,         // Right bracket
 1281|   161k|                IterativeParsingErrorState,         // Left curly bracket
 1282|   161k|                IterativeParsingErrorState,         // Right curly bracket
 1283|   161k|                IterativeParsingErrorState,         // Comma
 1284|   161k|                IterativeParsingErrorState,         // Colon
 1285|   161k|                IterativeParsingMemberKeyState,     // String
 1286|   161k|                IterativeParsingErrorState,         // False
 1287|   161k|                IterativeParsingErrorState,         // True
 1288|   161k|                IterativeParsingErrorState,         // Null
 1289|   161k|                IterativeParsingErrorState          // Number
 1290|   161k|            },
 1291|       |            // ObjectFinish(sink state)
 1292|   161k|            {
 1293|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1294|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1295|   161k|                IterativeParsingErrorState
 1296|   161k|            },
 1297|       |            // ArrayInitial
 1298|   161k|            {
 1299|   161k|                IterativeParsingArrayInitialState,      // Left bracket(push Element state)
 1300|   161k|                IterativeParsingArrayFinishState,       // Right bracket
 1301|   161k|                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)
 1302|   161k|                IterativeParsingErrorState,             // Right curly bracket
 1303|   161k|                IterativeParsingErrorState,             // Comma
 1304|   161k|                IterativeParsingErrorState,             // Colon
 1305|   161k|                IterativeParsingElementState,           // String
 1306|   161k|                IterativeParsingElementState,           // False
 1307|   161k|                IterativeParsingElementState,           // True
 1308|   161k|                IterativeParsingElementState,           // Null
 1309|   161k|                IterativeParsingElementState            // Number
 1310|   161k|            },
 1311|       |            // Element
 1312|   161k|            {
 1313|   161k|                IterativeParsingErrorState,             // Left bracket
 1314|   161k|                IterativeParsingArrayFinishState,       // Right bracket
 1315|   161k|                IterativeParsingErrorState,             // Left curly bracket
 1316|   161k|                IterativeParsingErrorState,             // Right curly bracket
 1317|   161k|                IterativeParsingElementDelimiterState,  // Comma
 1318|   161k|                IterativeParsingErrorState,             // Colon
 1319|   161k|                IterativeParsingErrorState,             // String
 1320|   161k|                IterativeParsingErrorState,             // False
 1321|   161k|                IterativeParsingErrorState,             // True
 1322|   161k|                IterativeParsingErrorState,             // Null
 1323|   161k|                IterativeParsingErrorState              // Number
 1324|   161k|            },
 1325|       |            // ElementDelimiter
 1326|   161k|            {
 1327|   161k|                IterativeParsingArrayInitialState,      // Left bracket(push Element state)
 1328|   161k|                IterativeParsingErrorState,             // Right bracket
 1329|   161k|                IterativeParsingObjectInitialState,     // Left curly bracket(push Element state)
 1330|   161k|                IterativeParsingErrorState,             // Right curly bracket
 1331|   161k|                IterativeParsingErrorState,             // Comma
 1332|   161k|                IterativeParsingErrorState,             // Colon
 1333|   161k|                IterativeParsingElementState,           // String
 1334|   161k|                IterativeParsingElementState,           // False
 1335|   161k|                IterativeParsingElementState,           // True
 1336|   161k|                IterativeParsingElementState,           // Null
 1337|   161k|                IterativeParsingElementState            // Number
 1338|   161k|            },
 1339|       |            // ArrayFinish(sink state)
 1340|   161k|            {
 1341|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1342|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1343|   161k|                IterativeParsingErrorState
 1344|   161k|            },
 1345|       |            // Single Value (sink state)
 1346|   161k|            {
 1347|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1348|   161k|                IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
 1349|   161k|                IterativeParsingErrorState
 1350|   161k|            }
 1351|   161k|        }; // End of G
 1352|       |
 1353|   161k|        return (IterativeParsingState)G[state][token];
 1354|   161k|    }
_ZNK5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE13HasParseErrorEv:
  457|  63.2k|    bool HasParseError() const { return parseResult_.IsError(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcEC2ERNS0_8internal5StackIS4_EE:
  637|  16.8k|        StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcE3PutEc:
  638|   119k|        RAPIDJSON_FORCEINLINE void Put(Ch c) {
  639|   119k|            *stack_.template Push<Ch>() = c;
  640|   119k|            ++length_;
  641|   119k|        }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseHex4INS0_19GenericStringStreamIS3_EEEEjRT_:
  612|  3.59k|    unsigned ParseHex4(InputStream& is) {
  613|  3.59k|        unsigned codepoint = 0;
  614|  17.5k|        for (int i = 0; i < 4; i++) {
  ------------------
  |  Branch (614:25): [True: 14.1k, False: 3.42k]
  ------------------
  615|  14.1k|            Ch c = is.Take();
  616|  14.1k|            codepoint <<= 4;
  617|  14.1k|            codepoint += static_cast<unsigned>(c);
  618|  14.1k|            if (c >= '0' && c <= '9')
  ------------------
  |  Branch (618:17): [True: 14.0k, False: 118]
  |  Branch (618:29): [True: 5.80k, False: 8.25k]
  ------------------
  619|  5.80k|                codepoint -= '0';
  620|  8.36k|            else if (c >= 'A' && c <= 'F')
  ------------------
  |  Branch (620:22): [True: 8.23k, False: 135]
  |  Branch (620:34): [True: 3.72k, False: 4.51k]
  ------------------
  621|  3.72k|                codepoint -= 'A' - 10;
  622|  4.64k|            else if (c >= 'a' && c <= 'f')
  ------------------
  |  Branch (622:22): [True: 4.49k, False: 157]
  |  Branch (622:34): [True: 4.47k, False: 20]
  ------------------
  623|  4.47k|                codepoint -= 'a' - 10;
  624|    177|            else {
  625|    177|                RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, is.Tell() - 1);
  ------------------
  |  |   91|    177|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    177|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   92|    177|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  ------------------
  |  |  |  |  351|    177|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  ------------------
  |  |   93|    177|    SetParseError(parseErrorCode, offset); \
  |  |   94|    177|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    177|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    177|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 177]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (625:17): [True: 177, False: 0]
  ------------------
  626|    177|                RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
  ------------------
  |  |   51|    354|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    177|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |   52|    354|    if (HasParseError()) { return value; } \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 177, False: 0]
  |  |  ------------------
  |  |   53|    354|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    177|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    177|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  627|    177|            }
  628|  14.1k|        }
  629|  3.42k|        return codepoint;
  630|  3.59k|    }
_ZNK5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcE6LengthEv:
  647|  16.2k|        size_t Length() const { return length_; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11StackStreamIcE3PopEv:
  648|  16.2k|        Ch* Pop() {
  649|  16.2k|            return stack_.template Pop<Ch>(length_);
  650|  16.2k|        }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EEC2ERS5_RS8_:
  850|  18.0k|        NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader;  }
_ZNK5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4PeekEv:
  853|   246k|        RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4TakeEv:
  855|  14.8k|        RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE8TakePushEv:
  854|  56.5k|        RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE4TellEv:
  856|    133|        size_t Tell() { return is.Tell(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE6LengthEv:
  857|  35.9k|        size_t Length() { return 0; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EE3PopEv:
  858|  17.9k|        const char* Pop() { return 0; }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE12NumberStreamINS0_19GenericStringStreamIS3_EELb0EED2Ev:
  851|  18.0k|        ~NumberStream() {}
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11HandleErrorINS0_19GenericStringStreamIS3_EEEEvNS5_21IterativeParsingStateERT_:
 1501|  2.35k|    void HandleError(IterativeParsingState src, InputStream& is) {
 1502|  2.35k|        if (HasParseError()) {
  ------------------
  |  Branch (1502:13): [True: 1.65k, False: 702]
  ------------------
 1503|       |            // Error flag has been set.
 1504|  1.65k|            return;
 1505|  1.65k|        }
 1506|       |        
 1507|    702|        switch (src) {
 1508|     13|        case IterativeParsingStartState:            RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return;
  ------------------
  |  |  110|     13|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     13|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     13|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     13|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     13|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     13|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     13|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     13|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     13|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     13|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     13|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 13]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     13|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     13|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     26|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     13|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     26|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 13, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     26|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     13|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     13|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     13|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     13|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     13|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1508:9): [True: 13, False: 689]
  |  Branch (1508:53): [True: 13, False: 0]
  ------------------
 1509|     84|        case IterativeParsingFinishState:           RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return;
  ------------------
  |  |  110|     84|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     84|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     84|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     84|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     84|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     84|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     84|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     84|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     84|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     84|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     84|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 84]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     84|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     84|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    168|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     84|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    168|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 84, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    168|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     84|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     84|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     84|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     84|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     84|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1509:9): [True: 84, False: 618]
  |  Branch (1509:53): [True: 84, False: 0]
  ------------------
 1510|     40|        case IterativeParsingObjectInitialState:
  ------------------
  |  Branch (1510:9): [True: 40, False: 662]
  ------------------
 1511|     48|        case IterativeParsingMemberDelimiterState:  RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return;
  ------------------
  |  |  110|     48|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     48|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     48|    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|     48|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     48|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     96|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     48|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     96|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 48, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     96|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     48|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     48|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     48|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     48|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     48|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1511:9): [True: 8, False: 694]
  |  Branch (1511:53): [True: 48, False: 0]
  ------------------
 1512|     27|        case IterativeParsingMemberKeyState:        RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return;
  ------------------
  |  |  110|     27|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     27|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     27|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     27|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     27|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     27|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     27|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     27|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     27|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     27|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     27|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 27]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     27|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     27|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     54|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     27|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     54|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 27, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     54|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     27|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     27|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     27|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     27|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     27|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1512:9): [True: 27, False: 675]
  |  Branch (1512:53): [True: 27, False: 0]
  ------------------
 1513|     10|        case IterativeParsingMemberValueState:      RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return;
  ------------------
  |  |  110|     10|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     10|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     10|    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|     10|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     10|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     20|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     10|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     20|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 10, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     20|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     10|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     10|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     10|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     10|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     10|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1513:9): [True: 10, False: 692]
  |  Branch (1513:53): [True: 10, False: 0]
  ------------------
 1514|    457|        case IterativeParsingElementState:          RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return;
  ------------------
  |  |  110|    457|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    457|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    457|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|    457|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    457|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|    457|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|    457|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|    457|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|    457|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    457|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    457|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 457]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    457|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|    457|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    914|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|    457|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    914|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 457, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    914|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|    457|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|    457|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    457|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    457|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    457|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1514:9): [True: 457, False: 245]
  |  Branch (1514:53): [True: 457, False: 0]
  ------------------
 1515|     63|        default:                                    RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell());
  ------------------
  |  |  110|     63|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     63|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     63|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     63|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     63|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     63|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     63|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     63|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     63|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     63|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     63|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 63]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     63|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     63|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    126|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     63|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    126|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 63, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    126|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     63|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     63|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     63|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     63|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     63|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1515:9): [True: 63, False: 639]
  |  Branch (1515:53): [True: 63, False: 0]
  ------------------
 1516|    702|        }       
 1517|    702|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE13SetParseErrorENS0_14ParseErrorCodeEm:
  466|  1.51k|    void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE16ClearStackOnExitD2Ev:
  478|  4.20k|        ~ClearStackOnExit() { r_.ClearStack(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ClearStackEv:
  473|  4.20k|    void ClearStack() { stack_.Clear(); }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE5ParseILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEENS0_11ParseResultERT0_RT1_:
  408|  4.20k|    ParseResult Parse(InputStream& is, Handler& handler) {
  409|  4.20k|        if (parseFlags & kParseIterativeFlag)
  ------------------
  |  Branch (409:13): [True: 4.20k, Folded]
  ------------------
  410|  4.20k|            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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (419:13): [True: 0, 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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (430:21): [True: 0, 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.20k|    ParseResult IterativeParse(InputStream& is, Handler& handler) {
 1521|  4.20k|        parseResult_.Clear();
 1522|  4.20k|        ClearStackOnExit scope(*this);
 1523|  4.20k|        IterativeParsingState state = IterativeParsingStartState;
 1524|       |
 1525|  4.20k|        SkipWhitespace(is);
 1526|   164k|        while (is.Peek() != '\0') {
  ------------------
  |  Branch (1526:16): [True: 161k, False: 3.27k]
  ------------------
 1527|   161k|            Token t = Tokenize(is.Peek());
 1528|   161k|            IterativeParsingState n = Predict(state, t);
 1529|   161k|            IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
 1530|       |
 1531|   161k|            if (d == IterativeParsingErrorState) {
  ------------------
  |  Branch (1531:17): [True: 928, False: 160k]
  ------------------
 1532|    928|                HandleError(state, is);
 1533|    928|                break;
 1534|    928|            }
 1535|       |
 1536|   160k|            state = d;
 1537|       |
 1538|       |            // Do not further consume streams if a root JSON has been parsed.
 1539|   160k|            if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) {
  ------------------
  |  Branch (1539:17): [Folded, False: 160k]
  |  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|   160k|            SkipWhitespace(is);
 1549|   160k|        }
 1550|       |
 1551|       |        // Handle the end of file.
 1552|  4.20k|        if (state != IterativeParsingFinishState)
  ------------------
  |  Branch (1552:13): [True: 1.42k, False: 2.77k]
  ------------------
 1553|  1.42k|            HandleError(state, is);
 1554|       |
 1555|  4.20k|        return parseResult_;
 1556|  4.20k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE7TransitILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEENS5_21IterativeParsingStateESD_NS5_5TokenESD_RT0_RT1_:
 1359|   161k|    RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
 1360|   161k|        (void)token;
 1361|       |
 1362|   161k|        switch (dst) {
 1363|    119|        case IterativeParsingErrorState:
  ------------------
  |  Branch (1363:9): [True: 119, False: 161k]
  ------------------
 1364|    119|            return dst;
 1365|       |
 1366|  7.66k|        case IterativeParsingObjectInitialState:
  ------------------
  |  Branch (1366:9): [True: 7.66k, False: 153k]
  ------------------
 1367|  80.4k|        case IterativeParsingArrayInitialState:
  ------------------
  |  Branch (1367:9): [True: 72.7k, False: 88.8k]
  ------------------
 1368|  80.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|  80.4k|            IterativeParsingState n = src;
 1372|  80.4k|            if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
  ------------------
  |  Branch (1372:17): [True: 71.0k, False: 9.30k]
  |  Branch (1372:61): [True: 4.00k, False: 5.30k]
  ------------------
 1373|  75.0k|                n = IterativeParsingElementState;
 1374|  5.30k|            else if (src == IterativeParsingKeyValueDelimiterState)
  ------------------
  |  Branch (1374:22): [True: 2.82k, False: 2.47k]
  ------------------
 1375|  2.82k|                n = IterativeParsingMemberValueState;
 1376|       |            // Push current state.
 1377|  80.4k|            *stack_.template Push<SizeType>(1) = n;
 1378|       |            // Initialize and push the member/element count.
 1379|  80.4k|            *stack_.template Push<SizeType>(1) = 0;
 1380|       |            // Call handler
 1381|  80.4k|            bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
  ------------------
  |  Branch (1381:23): [True: 7.66k, False: 72.7k]
  ------------------
 1382|       |            // On handler short circuits the parsing.
 1383|  80.4k|            if (!hr) {
  ------------------
  |  Branch (1383:17): [True: 0, False: 80.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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1384:17): [True: 0, False: 0]
  ------------------
 1385|      0|                return IterativeParsingErrorState;
 1386|      0|            }
 1387|  80.4k|            else {
 1388|  80.4k|                is.Take();
 1389|  80.4k|                return dst;
 1390|  80.4k|            }
 1391|  80.4k|        }
 1392|       |
 1393|  12.1k|        case IterativeParsingMemberKeyState:
  ------------------
  |  Branch (1393:9): [True: 12.1k, False: 149k]
  ------------------
 1394|  12.1k|            ParseString<parseFlags>(is, handler, true);
 1395|  12.1k|            if (HasParseError())
  ------------------
  |  Branch (1395:17): [True: 75, False: 12.0k]
  ------------------
 1396|     75|                return IterativeParsingErrorState;
 1397|  12.0k|            else
 1398|  12.0k|                return dst;
 1399|       |
 1400|  12.0k|        case IterativeParsingKeyValueDelimiterState:
  ------------------
  |  Branch (1400:9): [True: 12.0k, False: 149k]
  ------------------
 1401|  12.0k|            RAPIDJSON_ASSERT(token == ColonToken);
  ------------------
  |  |  351|  12.0k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1401:13): [True: 12.0k, False: 0]
  ------------------
 1402|  12.0k|            is.Take();
 1403|  12.0k|            return dst;
 1404|       |
 1405|  9.22k|        case IterativeParsingMemberValueState:
  ------------------
  |  Branch (1405:9): [True: 9.22k, False: 152k]
  ------------------
 1406|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1407|  9.22k|            ParseValue<parseFlags>(is, handler);
 1408|  9.22k|            if (HasParseError()) {
  ------------------
  |  Branch (1408:17): [True: 3, False: 9.22k]
  ------------------
 1409|      3|                return IterativeParsingErrorState;
 1410|      3|            }
 1411|  9.22k|            return dst;
 1412|       |
 1413|  14.3k|        case IterativeParsingElementState:
  ------------------
  |  Branch (1413:9): [True: 14.3k, False: 147k]
  ------------------
 1414|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1415|  14.3k|            ParseValue<parseFlags>(is, handler);
 1416|  14.3k|            if (HasParseError()) {
  ------------------
  |  Branch (1416:17): [True: 178, False: 14.1k]
  ------------------
 1417|    178|                return IterativeParsingErrorState;
 1418|    178|            }
 1419|  14.1k|            return dst;
 1420|       |
 1421|  5.18k|        case IterativeParsingMemberDelimiterState:
  ------------------
  |  Branch (1421:9): [True: 5.18k, False: 156k]
  ------------------
 1422|  22.3k|        case IterativeParsingElementDelimiterState:
  ------------------
  |  Branch (1422:9): [True: 17.2k, False: 144k]
  ------------------
 1423|  22.3k|            is.Take();
 1424|       |            // Update member/element count.
 1425|  22.3k|            *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
 1426|  22.3k|            return dst;
 1427|       |
 1428|  6.75k|        case IterativeParsingObjectFinishState:
  ------------------
  |  Branch (1428:9): [True: 6.75k, False: 154k]
  ------------------
 1429|  6.75k|        {
 1430|       |            // Get member count.
 1431|  6.75k|            SizeType c = *stack_.template Pop<SizeType>(1);
 1432|       |            // If the object is not empty, count the last member.
 1433|  6.75k|            if (src == IterativeParsingMemberValueState)
  ------------------
  |  Branch (1433:17): [True: 6.11k, False: 646]
  ------------------
 1434|  6.11k|                ++c;
 1435|       |            // Restore the state.
 1436|  6.75k|            IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));
 1437|       |            // Transit to Finish state if this is the topmost scope.
 1438|  6.75k|            if (n == IterativeParsingStartState)
  ------------------
  |  Branch (1438:17): [True: 1.56k, False: 5.19k]
  ------------------
 1439|  1.56k|                n = IterativeParsingFinishState;
 1440|       |            // Call handler
 1441|  6.75k|            bool hr = handler.EndObject(c);
 1442|       |            // On handler short circuits the parsing.
 1443|  6.75k|            if (!hr) {
  ------------------
  |  Branch (1443:17): [True: 0, False: 6.75k]
  ------------------
 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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1444:17): [True: 0, False: 0]
  ------------------
 1445|      0|                return IterativeParsingErrorState;
 1446|      0|            }
 1447|  6.75k|            else {
 1448|  6.75k|                is.Take();
 1449|  6.75k|                return n;
 1450|  6.75k|            }
 1451|  6.75k|        }
 1452|       |
 1453|  2.37k|        case IterativeParsingArrayFinishState:
  ------------------
  |  Branch (1453:9): [True: 2.37k, False: 159k]
  ------------------
 1454|  2.37k|        {
 1455|       |            // Get element count.
 1456|  2.37k|            SizeType c = *stack_.template Pop<SizeType>(1);
 1457|       |            // If the array is not empty, count the last element.
 1458|  2.37k|            if (src == IterativeParsingElementState)
  ------------------
  |  Branch (1458:17): [True: 1.95k, False: 421]
  ------------------
 1459|  1.95k|                ++c;
 1460|       |            // Restore the state.
 1461|  2.37k|            IterativeParsingState n = static_cast<IterativeParsingState>(*stack_.template Pop<SizeType>(1));
 1462|       |            // Transit to Finish state if this is the topmost scope.
 1463|  2.37k|            if (n == IterativeParsingStartState)
  ------------------
  |  Branch (1463:17): [True: 54, False: 2.32k]
  ------------------
 1464|     54|                n = IterativeParsingFinishState;
 1465|       |            // Call handler
 1466|  2.37k|            bool hr = handler.EndArray(c);
 1467|       |            // On handler short circuits the parsing.
 1468|  2.37k|            if (!hr) {
  ------------------
  |  Branch (1468:17): [True: 0, False: 2.37k]
  ------------------
 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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1469:17): [True: 0, False: 0]
  ------------------
 1470|      0|                return IterativeParsingErrorState;
 1471|      0|            }
 1472|  2.37k|            else {
 1473|  2.37k|                is.Take();
 1474|  2.37k|                return n;
 1475|  2.37k|            }
 1476|  2.37k|        }
 1477|       |
 1478|  1.71k|        default:
  ------------------
  |  Branch (1478:9): [True: 1.71k, False: 159k]
  ------------------
 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.71k|            RAPIDJSON_ASSERT(dst == IterativeParsingValueState);
  ------------------
  |  |  351|  1.71k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (1489:13): [True: 1.71k, False: 0]
  ------------------
 1490|       |
 1491|       |            // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state.
 1492|  1.71k|            ParseValue<parseFlags>(is, handler);
 1493|  1.71k|            if (HasParseError()) {
  ------------------
  |  Branch (1493:17): [True: 553, False: 1.16k]
  ------------------
 1494|    553|                return IterativeParsingErrorState;
 1495|    553|            }
 1496|  1.16k|            return IterativeParsingFinishState;
 1497|   161k|        }
 1498|   161k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11ParseStringILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_b:
  662|  16.8k|    void ParseString(InputStream& is, Handler& handler, bool isKey = false) {
  663|  16.8k|        internal::StreamLocalCopy<InputStream> copy(is);
  664|  16.8k|        InputStream& s(copy.s);
  665|       |
  666|  16.8k|        bool success = false;
  667|  16.8k|        if (parseFlags == kParseDefaultFlags && is_same<SourceEncoding, TargetEncoding>::value) { 
  ------------------
  |  Branch (667:13): [Folded, False: 16.8k]
  |  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|  16.8k|        else if (parseFlags & kParseInsituFlag) {
  ------------------
  |  Branch (675:18): [Folded, False: 16.8k]
  ------------------
  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)
  ------------------
  |  Branch (680:13): [True: 0, False: 0]
  ------------------
  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|  16.8k|        else {
  685|  16.8k|            StackStream<typename TargetEncoding::Ch> stackStream(stack_);
  686|  16.8k|            ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
  687|  16.8k|            RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|  16.8k|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|  16.8k|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  16.8k|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|  16.8k|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 559, False: 16.2k]
  |  |  |  |  ------------------
  |  |  |  |   53|  16.8k|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|  16.8k|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|  16.8k|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 16.2k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  688|  16.2k|            SizeType length = static_cast<SizeType>(stackStream.Length()) - 1;
  689|  16.2k|            const typename TargetEncoding::Ch* const str = stackStream.Pop();
  690|  16.2k|            success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true));
  ------------------
  |  Branch (690:24): [True: 12.0k, False: 4.16k]
  ------------------
  691|  16.2k|        }
  692|  16.2k|        if (!success)
  ------------------
  |  Branch (692:13): [True: 0, False: 16.2k]
  ------------------
  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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (693:13): [True: 0, False: 0]
  ------------------
  694|  16.2k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE19ParseStringToStreamILj4ES3_S3_NS0_19GenericStringStreamIS3_EENS5_11StackStreamIcEEEEvRT2_RT3_:
  784|  16.8k|    RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) {
  785|       |//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN
  786|  16.8k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  787|  16.8k|        static const char escape[256] = {
  788|  16.8k|            Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', 
  ------------------
  |  |  786|  16.8k|#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|  16.8k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
  789|  16.8k|            Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, 
  ------------------
  |  |  786|  16.8k|#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|  16.8k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
  790|  16.8k|            0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, 
  791|  16.8k|            0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  792|  16.8k|            Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
  ------------------
  |  |  786|  16.8k|#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|  16.8k|#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|  16.8k|#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|  16.8k|#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|  16.8k|#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|  16.8k|#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|  16.8k|#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|  16.8k|#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  ------------------
  793|  16.8k|        };
  794|  16.8k|#undef Z16
  795|       |//!@endcond
  796|       |
  797|  16.8k|        RAPIDJSON_ASSERT(is.Peek() == '\"');
  ------------------
  |  |  351|  16.8k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (797:9): [True: 16.8k, False: 0]
  ------------------
  798|  16.8k|        is.Take();  // Skip '\"'
  799|       |
  800|   115k|        for (;;) {
  801|   115k|            Ch c = is.Peek();
  802|   115k|            if (c == '\\') {    // Escape
  ------------------
  |  Branch (802:17): [True: 3.27k, False: 112k]
  ------------------
  803|  3.27k|                is.Take();
  804|  3.27k|                Ch e = is.Take();
  805|  3.27k|                if ((sizeof(Ch) == 1 || unsigned(e) < 256) && escape[(unsigned char)e]) {
  ------------------
  |  Branch (805:22): [True: 3.27k, Folded]
  |  Branch (805:41): [True: 0, False: 0]
  |  Branch (805:63): [True: 221, False: 3.05k]
  ------------------
  806|    221|                    os.Put(escape[(unsigned char)e]);
  807|    221|                }
  808|  3.05k|                else if (e == 'u') {    // Unicode
  ------------------
  |  Branch (808:26): [True: 3.04k, False: 11]
  ------------------
  809|  3.04k|                    unsigned codepoint = ParseHex4(is);
  810|  3.04k|                    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|  3.04k|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|  3.04k|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|  3.04k|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|  3.04k|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 159, False: 2.88k]
  |  |  |  |  ------------------
  |  |  |  |   53|  3.04k|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|  3.04k|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|  3.04k|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 2.88k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  811|  2.88k|                    if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
  ------------------
  |  Branch (811:25): [True: 1.30k, False: 1.58k]
  |  Branch (811:48): [True: 589, False: 711]
  ------------------
  812|       |                        // Handle UTF-16 surrogate pair
  813|    589|                        if (is.Take() != '\\' || is.Take() != 'u')
  ------------------
  |  Branch (813:29): [True: 22, False: 567]
  |  Branch (813:50): [True: 11, False: 556]
  ------------------
  814|    589|                            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|     66|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     33|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     66|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 33, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     66|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     33|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     33|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     33|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     33|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     33|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (814:29): [True: 33, False: 0]
  ------------------
  815|    556|                        unsigned codepoint2 = ParseHex4(is);
  816|    556|                        RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
  ------------------
  |  |   56|    556|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  ------------------
  |  |  |  |   51|    556|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    556|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   52|    556|    if (HasParseError()) { return value; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 18, False: 538]
  |  |  |  |  ------------------
  |  |  |  |   53|    556|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    556|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    556|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 538]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  817|    538|                        if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
  ------------------
  |  Branch (817:29): [True: 19, False: 519]
  |  Branch (817:52): [True: 5, False: 514]
  ------------------
  818|    538|                            RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, is.Tell() - 2);
  ------------------
  |  |  110|     48|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     24|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     48|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     24|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     24|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     24|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     24|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     24|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     24|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     24|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     24|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 24]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     48|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     24|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     48|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     24|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     48|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 24, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     48|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     24|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     24|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     24|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     24|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     24|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (818:29): [True: 24, False: 0]
  ------------------
  819|    514|                        codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
  820|    514|                    }
  821|  2.80k|                    TEncoding::Encode(os, codepoint);
  822|  2.80k|                }
  823|     11|                else
  824|  3.05k|                    RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     22|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     11|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     22|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     11|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     11|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     11|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     11|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     11|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     11|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     11|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     11|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 11]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     22|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     11|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     22|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     11|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     22|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 11, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     22|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     11|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     11|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     11|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     11|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     11|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (824:21): [True: 11, False: 0]
  ------------------
  825|  3.27k|            }
  826|   112k|            else if (c == '"') {    // Closing double quote
  ------------------
  |  Branch (826:22): [True: 16.2k, False: 96.2k]
  ------------------
  827|  16.2k|                is.Take();
  828|  16.2k|                os.Put('\0');   // null-terminate the string
  829|  16.2k|                return;
  830|  16.2k|            }
  831|  96.2k|            else if (c == '\0')
  ------------------
  |  Branch (831:22): [True: 308, False: 95.9k]
  ------------------
  832|  96.2k|                RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell() - 1);
  ------------------
  |  |  110|    616|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|    308|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    616|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|    308|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|    308|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|    308|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|    308|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|    308|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|    308|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|    308|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|    308|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 308]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    616|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|    308|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    616|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|    308|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    616|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 308, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    616|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|    308|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|    308|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|    308|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|    308|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|    308|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (832:17): [True: 308, False: 0]
  ------------------
  833|  95.9k|            else if ((unsigned)c < 0x20) // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
  ------------------
  |  Branch (833:22): [True: 6, False: 95.8k]
  ------------------
  834|  95.9k|                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|     12|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      6|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     12|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 6, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     12|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      6|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      6|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      6|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      6|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      6|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (834:17): [True: 6, False: 0]
  ------------------
  835|  95.8k|            else {
  836|  95.8k|                if (parseFlags & kParseValidateEncodingFlag ? 
  ------------------
  |  Branch (836:21): [Folded, False: 95.8k]
  |  Branch (836:21): [True: 0, False: 95.8k]
  ------------------
  837|      0|                    !Transcoder<SEncoding, TEncoding>::Validate(is, os) : 
  838|  95.8k|                    !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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (839:21): [True: 0, False: 0]
  ------------------
  840|  95.8k|            }
  841|   115k|        }
  842|  16.8k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ParseValueILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
 1105|  25.3k|    void ParseValue(InputStream& is, Handler& handler) {
 1106|  25.3k|        switch (is.Peek()) {
 1107|    587|            case 'n': ParseNull  <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1107:13): [True: 587, False: 24.7k]
  ------------------
 1108|  1.53k|            case 't': ParseTrue  <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1108:13): [True: 1.53k, False: 23.7k]
  ------------------
 1109|    486|            case 'f': ParseFalse <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1109:13): [True: 486, False: 24.8k]
  ------------------
 1110|  4.65k|            case '"': ParseString<parseFlags>(is, handler); break;
  ------------------
  |  Branch (1110:13): [True: 4.65k, False: 20.6k]
  ------------------
 1111|      0|            case '{': ParseObject<parseFlags>(is, handler); break;
  ------------------
  |  Branch (1111:13): [True: 0, False: 25.3k]
  ------------------
 1112|      0|            case '[': ParseArray <parseFlags>(is, handler); break;
  ------------------
  |  Branch (1112:13): [True: 0, False: 25.3k]
  ------------------
 1113|  18.0k|            default : ParseNumber<parseFlags>(is, handler);
  ------------------
  |  Branch (1113:13): [True: 18.0k, False: 7.25k]
  ------------------
 1114|  25.3k|        }
 1115|  25.3k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseNullILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  572|    587|    void ParseNull(InputStream& is, Handler& handler) {
  573|    587|        RAPIDJSON_ASSERT(is.Peek() == 'n');
  ------------------
  |  |  351|    587|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (573:9): [True: 587, False: 0]
  ------------------
  574|    587|        is.Take();
  575|       |
  576|    587|        if (is.Take() == 'u' && is.Take() == 'l' && is.Take() == 'l') {
  ------------------
  |  Branch (576:13): [True: 578, False: 9]
  |  Branch (576:33): [True: 567, False: 11]
  |  Branch (576:53): [True: 557, False: 10]
  ------------------
  577|    557|            if (!handler.Null())
  ------------------
  |  Branch (577:17): [True: 0, False: 557]
  ------------------
  578|    557|                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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (578:17): [True: 0, False: 0]
  ------------------
  579|    557|        }
  580|     30|        else
  581|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  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|     60|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     30|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     60|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 30, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     60|    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 (581:13): [True: 30, False: 0]
  ------------------
  582|    587|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE9ParseTrueILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  585|  1.53k|    void ParseTrue(InputStream& is, Handler& handler) {
  586|  1.53k|        RAPIDJSON_ASSERT(is.Peek() == 't');
  ------------------
  |  |  351|  1.53k|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (586:9): [True: 1.53k, False: 0]
  ------------------
  587|  1.53k|        is.Take();
  588|       |
  589|  1.53k|        if (is.Take() == 'r' && is.Take() == 'u' && is.Take() == 'e') {
  ------------------
  |  Branch (589:13): [True: 1.51k, False: 18]
  |  Branch (589:33): [True: 1.50k, False: 11]
  |  Branch (589:53): [True: 1.49k, False: 11]
  ------------------
  590|  1.49k|            if (!handler.Bool(true))
  ------------------
  |  Branch (590:17): [True: 0, False: 1.49k]
  ------------------
  591|  1.49k|                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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (591:17): [True: 0, False: 0]
  ------------------
  592|  1.49k|        }
  593|     40|        else
  594|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     80|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     40|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     80|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     40|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     40|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     40|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     40|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     40|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     40|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     40|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     40|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 40]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     80|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     40|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     80|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     40|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     80|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 40, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     80|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     40|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     40|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     40|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     40|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     40|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (594:13): [True: 40, False: 0]
  ------------------
  595|  1.53k|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE10ParseFalseILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  598|    486|    void ParseFalse(InputStream& is, Handler& handler) {
  599|    486|        RAPIDJSON_ASSERT(is.Peek() == 'f');
  ------------------
  |  |  351|    486|#define RAPIDJSON_ASSERT(x) assert(x)
  ------------------
  |  Branch (599:9): [True: 486, False: 0]
  ------------------
  600|    486|        is.Take();
  601|       |
  602|    486|        if (is.Take() == 'a' && is.Take() == 'l' && is.Take() == 's' && is.Take() == 'e') {
  ------------------
  |  Branch (602:13): [True: 472, False: 14]
  |  Branch (602:33): [True: 460, False: 12]
  |  Branch (602:53): [True: 449, False: 11]
  |  Branch (602:73): [True: 439, False: 10]
  ------------------
  603|    439|            if (!handler.Bool(false))
  ------------------
  |  Branch (603:17): [True: 0, False: 439]
  ------------------
  604|    439|                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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (604:17): [True: 0, False: 0]
  ------------------
  605|    439|        }
  606|     47|        else
  607|       |            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1);
  ------------------
  |  |  110|     94|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     47|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     94|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     47|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     47|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     47|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     47|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     47|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     47|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     47|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     47|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 47]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     94|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     47|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     94|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     47|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     94|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 47, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     94|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     47|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     47|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     47|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     47|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     47|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (607:13): [True: 47, False: 0]
  ------------------
  608|    486|    }
_ZN5butil9rapidjson13GenericReaderINS0_4UTF8IcEES3_NS0_12CrtAllocatorEE11ParseNumberILj4ENS0_19GenericStringStreamIS3_EENS0_15GenericDocumentIS3_NS0_19MemoryPoolAllocatorIS4_EES4_EEEEvRT0_RT1_:
  890|  18.0k|    void ParseNumber(InputStream& is, Handler& handler) {
  891|  18.0k|        internal::StreamLocalCopy<InputStream> copy(is);
  892|  18.0k|        NumberStream<InputStream, (parseFlags & kParseFullPrecisionFlag) != 0> s(*this, copy.s);
  893|       |
  894|       |        // Parse minus
  895|  18.0k|        bool minus = false;
  896|  18.0k|        if (s.Peek() == '-') {
  ------------------
  |  Branch (896:13): [True: 2.05k, False: 15.9k]
  ------------------
  897|  2.05k|            minus = true;
  898|  2.05k|            s.Take();
  899|  2.05k|        }
  900|       |
  901|       |        // Parse int: zero / ( digit1-9 *DIGIT )
  902|  18.0k|        unsigned i = 0;
  903|  18.0k|        uint64_t i64 = 0;
  904|  18.0k|        bool use64bit = false;
  905|  18.0k|        int significandDigit = 0;
  906|  18.0k|        if (s.Peek() == '0') {
  ------------------
  |  Branch (906:13): [True: 4.42k, False: 13.6k]
  ------------------
  907|  4.42k|            i = 0;
  908|  4.42k|            s.TakePush();
  909|  4.42k|        }
  910|  13.6k|        else if (s.Peek() >= '1' && s.Peek() <= '9') {
  ------------------
  |  Branch (910:18): [True: 13.5k, False: 33]
  |  Branch (910:37): [True: 13.5k, False: 10]
  ------------------
  911|  13.5k|            i = static_cast<unsigned>(s.TakePush() - '0');
  912|       |
  913|  13.5k|            if (minus)
  ------------------
  |  Branch (913:17): [True: 1.66k, False: 11.9k]
  ------------------
  914|  9.41k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (914:24): [True: 8.80k, False: 612]
  |  Branch (914:43): [True: 8.51k, False: 292]
  ------------------
  915|  8.51k|                    if (i >= 214748364) { // 2^31 = 2147483648
  ------------------
  |  Branch (915:25): [True: 831, False: 7.68k]
  ------------------
  916|    831|                        if (i != 214748364 || s.Peek() > '8') {
  ------------------
  |  Branch (916:29): [True: 683, False: 148]
  |  Branch (916:47): [True: 78, False: 70]
  ------------------
  917|    761|                            i64 = i;
  918|    761|                            use64bit = true;
  919|    761|                            break;
  920|    761|                        }
  921|    831|                    }
  922|  7.75k|                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');
  923|  7.75k|                    significandDigit++;
  924|  7.75k|                }
  925|  11.9k|            else
  926|  26.3k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (926:24): [True: 19.7k, False: 6.61k]
  |  Branch (926:43): [True: 15.8k, False: 3.91k]
  ------------------
  927|  15.8k|                    if (i >= 429496729) { // 2^32 - 1 = 4294967295
  ------------------
  |  Branch (927:25): [True: 1.46k, False: 14.3k]
  ------------------
  928|  1.46k|                        if (i != 429496729 || s.Peek() > '5') {
  ------------------
  |  Branch (928:29): [True: 1.30k, False: 160]
  |  Branch (928:47): [True: 88, False: 72]
  ------------------
  929|  1.39k|                            i64 = i;
  930|  1.39k|                            use64bit = true;
  931|  1.39k|                            break;
  932|  1.39k|                        }
  933|  1.46k|                    }
  934|  14.4k|                    i = i * 10 + static_cast<unsigned>(s.TakePush() - '0');
  935|  14.4k|                    significandDigit++;
  936|  14.4k|                }
  937|  13.5k|        }
  938|     43|        else
  939|  13.6k|            RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
  ------------------
  |  |  110|     86|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     86|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     43|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     43|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     43|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     43|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     43|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 43]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     86|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     43|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     86|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     43|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     86|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 43, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     86|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     43|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     43|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     43|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (939:13): [True: 43, False: 0]
  ------------------
  940|       |
  941|       |        // Parse 64bit int
  942|  18.0k|        bool useDouble = false;
  943|  18.0k|        double d = 0.0;
  944|  18.0k|        if (use64bit) {
  ------------------
  |  Branch (944:13): [True: 2.15k, False: 15.8k]
  ------------------
  945|  2.15k|            if (minus) 
  ------------------
  |  Branch (945:17): [True: 761, False: 1.39k]
  ------------------
  946|  5.00k|                while (s.Peek() >= '0' && s.Peek() <= '9') {                    
  ------------------
  |  Branch (946:24): [True: 4.52k, False: 483]
  |  Branch (946:43): [True: 4.44k, False: 76]
  ------------------
  947|  4.44k|                     if (i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC)) // 2^63 = 9223372036854775808
  ------------------
  |  |  268|  4.44k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (947:26): [True: 276, False: 4.17k]
  ------------------
  948|    276|                        if (i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8') {
  ------------------
  |  |  268|    552|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (948:29): [True: 135, False: 141]
  |  Branch (948:83): [True: 67, False: 74]
  ------------------
  949|    202|                            d = i64;
  950|    202|                            useDouble = true;
  951|    202|                            break;
  952|    202|                        }
  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.80k|                while (s.Peek() >= '0' && s.Peek() <= '9') {                    
  ------------------
  |  Branch (957:24): [True: 8.97k, False: 831]
  |  Branch (957:43): [True: 8.73k, False: 240]
  ------------------
  958|  8.73k|                    if (i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999)) // 2^64 - 1 = 18446744073709551615
  ------------------
  |  |  268|  8.73k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (958:25): [True: 390, False: 8.34k]
  ------------------
  959|    390|                        if (i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5') {
  ------------------
  |  |  268|    780|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (959:29): [True: 254, False: 136]
  |  Branch (959:83): [True: 67, False: 69]
  ------------------
  960|    321|                            d = i64;
  961|    321|                            useDouble = true;
  962|    321|                            break;
  963|    321|                        }
  964|  8.41k|                    i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  965|  8.41k|                    significandDigit++;
  966|  8.41k|                }
  967|  2.15k|        }
  968|       |
  969|       |        // Force double for big integer
  970|  18.0k|        if (useDouble) {
  ------------------
  |  Branch (970:13): [True: 523, False: 17.4k]
  ------------------
  971|  1.56k|            while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (971:20): [True: 1.11k, False: 451]
  |  Branch (971:39): [True: 1.03k, False: 71]
  ------------------
  972|  1.03k|                if (d >= 1.7976931348623157e307) // DBL_MAX / 10.0
  ------------------
  |  Branch (972:21): [True: 1, False: 1.03k]
  ------------------
  973|  1.03k|                    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|      2|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      1|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      2|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 1, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      2|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      1|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      1|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      1|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      1|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      1|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (973:21): [True: 1, False: 0]
  ------------------
  974|  1.03k|                d = d * 10 + (s.TakePush() - '0');
  975|  1.03k|            }
  976|    523|        }
  977|       |
  978|       |        // Parse frac = decimal-point 1*DIGIT
  979|  18.0k|        int expFrac = 0;
  980|  18.0k|        size_t decimalPosition;
  981|  18.0k|        if (s.Peek() == '.') {
  ------------------
  |  Branch (981:13): [True: 1.27k, False: 16.7k]
  ------------------
  982|  1.27k|            s.Take();
  983|  1.27k|            decimalPosition = s.Length();
  984|       |
  985|  1.27k|            if (!(s.Peek() >= '0' && s.Peek() <= '9'))
  ------------------
  |  Branch (985:19): [True: 1.26k, False: 10]
  |  Branch (985:38): [True: 1.25k, False: 4]
  ------------------
  986|  1.27k|                RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell());
  ------------------
  |  |  110|     28|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     14|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|     28|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     14|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     14|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     14|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     14|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     14|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     14|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     14|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     14|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 14]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|     28|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     14|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|     28|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     14|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|     28|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 14, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     28|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     14|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     14|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     14|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     14|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     14|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (986:17): [True: 14, False: 0]
  ------------------
  987|       |
  988|  1.25k|            if (!useDouble) {
  ------------------
  |  Branch (988:17): [True: 1.19k, False: 66]
  ------------------
  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: 312]
  ------------------
  992|    881|                    i64 = i;
  993|       |        
  994|  3.27k|                while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (994:24): [True: 2.65k, False: 618]
  |  Branch (994:43): [True: 2.21k, False: 441]
  ------------------
  995|  2.21k|                    if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path
  ------------------
  |  |  268|  2.21k|#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast<uint64_t>(high32) << 32) | static_cast<uint64_t>(low32))
  ------------------
  |  Branch (995:25): [True: 134, False: 2.08k]
  ------------------
  996|    134|                        break;
  997|  2.08k|                    else {
  998|  2.08k|                        i64 = i64 * 10 + static_cast<unsigned>(s.TakePush() - '0');
  999|  2.08k|                        --expFrac;
 1000|  2.08k|                        if (i64 != 0)
  ------------------
  |  Branch (1000:29): [True: 1.44k, False: 642]
  ------------------
 1001|  1.44k|                            significandDigit++;
 1002|  2.08k|                    }
 1003|  2.21k|                }
 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.87k|            while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1013:20): [True: 1.05k, False: 817]
  |  Branch (1013:39): [True: 614, False: 442]
  ------------------
 1014|    614|                if (significandDigit < 17) {
  ------------------
  |  Branch (1014:21): [True: 158, False: 456]
  ------------------
 1015|    158|                    d = d * 10.0 + (s.TakePush() - '0');
 1016|    158|                    --expFrac;
 1017|    158|                    if (d > 0.0)
  ------------------
  |  Branch (1017:25): [True: 158, False: 0]
  ------------------
 1018|    158|                        significandDigit++;
 1019|    158|                }
 1020|    456|                else
 1021|    456|                    s.TakePush();
 1022|    614|            }
 1023|  1.25k|        }
 1024|  16.7k|        else
 1025|  16.7k|            decimalPosition = s.Length(); // decimal position at the end of integer.
 1026|       |
 1027|       |        // Parse exp = e [ minus / plus ] 1*DIGIT
 1028|  17.9k|        int exp = 0;
 1029|  17.9k|        if (s.Peek() == 'e' || s.Peek() == 'E') {
  ------------------
  |  Branch (1029:13): [True: 2.10k, False: 15.8k]
  |  Branch (1029:32): [True: 1.18k, False: 14.7k]
  ------------------
 1030|  3.28k|            if (!useDouble) {
  ------------------
  |  Branch (1030:17): [True: 3.02k, False: 263]
  ------------------
 1031|  3.02k|                d = use64bit ? i64 : i;
  ------------------
  |  Branch (1031:21): [True: 116, False: 2.90k]
  ------------------
 1032|  3.02k|                useDouble = true;
 1033|  3.02k|            }
 1034|  3.28k|            s.Take();
 1035|       |
 1036|  3.28k|            bool expMinus = false;
 1037|  3.28k|            if (s.Peek() == '+')
  ------------------
  |  Branch (1037:17): [True: 202, False: 3.08k]
  ------------------
 1038|    202|                s.Take();
 1039|  3.08k|            else if (s.Peek() == '-') {
  ------------------
  |  Branch (1039:22): [True: 1.07k, False: 2.00k]
  ------------------
 1040|  1.07k|                s.Take();
 1041|  1.07k|                expMinus = true;
 1042|  1.07k|            }
 1043|       |
 1044|  3.28k|            if (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1044:17): [True: 3.21k, False: 69]
  |  Branch (1044:36): [True: 3.20k, False: 5]
  ------------------
 1045|  3.20k|                exp = s.Take() - '0';
 1046|  3.20k|                if (expMinus) {
  ------------------
  |  Branch (1046:21): [True: 1.06k, False: 2.14k]
  ------------------
 1047|  3.57k|                    while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1047:28): [True: 2.51k, False: 1.06k]
  |  Branch (1047:47): [True: 2.51k, False: 1]
  ------------------
 1048|  2.51k|                        exp = exp * 10 + (s.Take() - '0');
 1049|  2.51k|                        if (exp >= 214748364) {                         // Issue #313: prevent overflow exponent
  ------------------
  |  Branch (1049:29): [True: 85, False: 2.42k]
  ------------------
 1050|    279|                            while (s.Peek() >= '0' && s.Peek() <= '9')  // Consume the rest of exponent
  ------------------
  |  Branch (1050:36): [True: 194, False: 85]
  |  Branch (1050:55): [True: 194, False: 0]
  ------------------
 1051|    194|                                s.Take();
 1052|     85|                        }
 1053|  2.51k|                    }
 1054|  1.06k|                }
 1055|  2.14k|                else {  // positive exp
 1056|  2.14k|                    int maxExp = 308 - expFrac;
 1057|  3.20k|                    while (s.Peek() >= '0' && s.Peek() <= '9') {
  ------------------
  |  Branch (1057:28): [True: 1.37k, False: 1.82k]
  |  Branch (1057:47): [True: 1.06k, False: 315]
  ------------------
 1058|  1.06k|                        exp = exp * 10 + (s.Take() - '0');
 1059|  1.06k|                        if (exp > maxExp)
  ------------------
  |  Branch (1059:29): [True: 1, False: 1.06k]
  ------------------
 1060|  1.06k|                            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|      2|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|      1|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|      2|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 1, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|      2|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|      1|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|      1|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      1|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|      1|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|      1|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1060:29): [True: 1, False: 0]
  ------------------
 1061|  1.06k|                    }
 1062|  2.14k|                }
 1063|  3.20k|            }
 1064|     74|            else
 1065|  3.28k|                RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell());
  ------------------
  |  |  110|    148|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  ------------------
  |  |  |  |  393|     74|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  ------------------
  |  |  111|    148|    RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
  |  |  ------------------
  |  |  |  |   91|     74|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  ------------------
  |  |  |  |  |  |  393|     74|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  ------------------
  |  |  |  |   92|     74|    RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \
  |  |  |  |  ------------------
  |  |  |  |  |  |  351|     74|#define RAPIDJSON_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  |   93|     74|    SetParseError(parseErrorCode, offset); \
  |  |  |  |   94|     74|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  394|     74|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  395|     74|} while((void)0, 0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 74]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|    148|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
  |  |  ------------------
  |  |  |  |   56|     74|    RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
  |  |  |  |  ------------------
  |  |  |  |  |  |   51|    148|    RAPIDJSON_MULTILINEMACRO_BEGIN \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  393|     74|#define RAPIDJSON_MULTILINEMACRO_BEGIN do {  
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   52|    148|    if (HasParseError()) { return value; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (52:9): [True: 74, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   53|    148|    RAPIDJSON_MULTILINEMACRO_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  394|     74|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  |  |  |  |  395|     74|} while((void)0, 0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|     74|    RAPIDJSON_MULTILINEMACRO_END
  |  |  ------------------
  |  |  |  |  394|     74|#define RAPIDJSON_MULTILINEMACRO_END \
  |  |  |  |  395|     74|} while((void)0, 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (395:9): [Folded, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1065:17): [True: 74, False: 0]
  ------------------
 1066|       |
 1067|  3.20k|            if (expMinus)
  ------------------
  |  Branch (1067:17): [True: 1.06k, False: 2.14k]
  ------------------
 1068|  1.06k|                exp = -exp;
 1069|  3.20k|        }
 1070|       |
 1071|       |        // Finish parsing, call event according to the type of number.
 1072|  17.9k|        bool cont = true;
 1073|  17.9k|        size_t length = s.Length();
 1074|  17.9k|        const char* decimal = s.Pop();  // Pop stack no matter if it will be used or not.
 1075|       |
 1076|  17.9k|        if (useDouble) {
  ------------------
  |  Branch (1076:13): [True: 4.66k, False: 13.2k]
  ------------------
 1077|  4.66k|            int p = exp + expFrac;
 1078|  4.66k|            if (parseFlags & kParseFullPrecisionFlag)
  ------------------
  |  Branch (1078:17): [Folded, False: 4.66k]
  ------------------
 1079|      0|                d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp);
 1080|  4.66k|            else
 1081|  4.66k|                d = internal::StrtodNormalPrecision(d, p);
 1082|       |
 1083|  4.66k|            cont = handler.Double(minus ? -d : d);
  ------------------
  |  Branch (1083:35): [True: 525, False: 4.13k]
  ------------------
 1084|  4.66k|        }
 1085|  13.2k|        else {
 1086|  13.2k|            if (use64bit) {
  ------------------
  |  Branch (1086:17): [True: 1.20k, False: 12.0k]
  ------------------
 1087|  1.20k|                if (minus)
  ------------------
  |  Branch (1087:21): [True: 512, False: 690]
  ------------------
 1088|    512|                    cont = handler.AddInt64(static_cast<int64_t>(~i64 + 1));
 1089|    690|                else
 1090|    690|                    cont = handler.AddUint64(i64);
 1091|  1.20k|            }
 1092|  12.0k|            else {
 1093|  12.0k|                if (minus)
  ------------------
  |  Branch (1093:21): [True: 1.00k, False: 11.0k]
  ------------------
 1094|  1.00k|                    cont = handler.AddInt(static_cast<int32_t>(~i + 1));
 1095|  11.0k|                else
 1096|  11.0k|                    cont = handler.AddUint(i);
 1097|  12.0k|            }
 1098|  13.2k|        }
 1099|  17.9k|        if (!cont)
  ------------------
  |  Branch (1099:13): [True: 0, False: 17.9k]
  ------------------
 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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1100:13): [True: 0, False: 0]
  ------------------
 1101|  17.9k|    }

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

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

_ZN5butil15gettimeofday_usEv:
  338|      4|inline int64_t gettimeofday_us() {
  339|      4|    timeval now;
  340|       |    gettimeofday(&now, NULL);
  341|      4|    return now.tv_sec * 1000000L + now.tv_usec;
  342|      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 NULL;
  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 NULL;
  134|      0|        }
  135|      2|        if (_s_tls_blocks == NULL) {
  ------------------
  |  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 == NULL, 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 NULL;
  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 == NULL) {
  ------------------
  |  Branch (149:13): [True: 2, False: 0]
  ------------------
  150|      2|            ThreadBlock *new_block = new (std::nothrow) ThreadBlock;
  151|      2|            if (__builtin_expect(new_block == NULL, 0)) {
  ------------------
  |  Branch (151:17): [True: 0, False: 2]
  ------------------
  152|      0|                return NULL;
  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|    }
_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|    }
_ZNK4bvar6detail13AgentCombinerIPNS0_7SamplerES3_NS0_14CombineSamplerEE2opEv:
  335|      8|    const BinaryOp& op() const { return _op; }
_ZN4bvar6detail13AgentCombinerIPNS0_7SamplerES3_NS0_14CombineSamplerEE16reset_all_agentsEv:
  261|      2|    ResultTp reset_all_agents() {
  262|      2|        ElementTp prev;
  263|      2|        butil::AutoLock guard(_lock);
  264|      2|        ResultTp tmp = _global_result;
  265|      2|        _global_result = _result_identity;
  266|      2|        for (butil::LinkNode<Agent>* node = _agents.head();
  267|      4|             node != _agents.end(); node = node->next()) {
  ------------------
  |  Branch (267:14): [True: 2, False: 2]
  ------------------
  268|      2|            node->value()->element.exchange(&prev, _element_identity);
  269|      2|            call_op_returning_void(_op, tmp, prev);
  270|      2|        }
  271|      2|        return tmp;
  272|      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:
  300|      8|    Agent* get_or_create_tls_agent() {
  301|      8|        Agent* agent = AgentGroup::get_tls_agent(_id);
  302|      8|        if (!agent) {
  ------------------
  |  Branch (302:13): [True: 2, False: 6]
  ------------------
  303|       |            // Create the agent
  304|      2|            agent = AgentGroup::get_or_create_tls_agent(_id);
  305|      2|            if (NULL == agent) {
  ------------------
  |  Branch (305:17): [True: 0, False: 2]
  ------------------
  306|      0|                LOG(FATAL) << "Fail to create agent";
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  307|      0|                return NULL;
  308|      0|            }
  309|      2|        }
  310|      8|        if (!agent->combiner.expired()) {
  ------------------
  |  Branch (310:13): [True: 6, False: 2]
  ------------------
  311|      6|            return agent;
  312|      6|        }
  313|      2|        agent->reset(_element_identity, this->shared_from_this());
  314|       |        // TODO: Is uniqueness-checking necessary here?
  315|      2|        {
  316|      2|            butil::AutoLock guard(_lock);
  317|      2|            _agents.Append(agent);
  318|      2|        }
  319|      2|        return agent;
  320|      8|    }
_ZN4bvar6detail16ElementContainerIPNS0_7SamplerEvE6modifyINS0_14CombineSamplerES3_EEvRKT_RKT0_:
   93|      8|    void modify(const Op &op, const T1 &value2) {
   94|      8|        butil::AutoLock guard(_lock);
   95|      8|        call_op_returning_void(op, _value, value2);
   96|      8|    }

_ZN4bvar6detail16SamplerCollector3runEv:
  135|      2|void SamplerCollector::run() {
  136|      2|    ::usleep(FLAGS_bvar_sampler_thread_start_delay_us);
  137|       |    
  138|       |#ifndef UNIT_TEST
  139|       |    // NOTE:
  140|       |    // * Following vars can't be created on thread's stack since this thread
  141|       |    //   may be abandoned at any time after forking.
  142|       |    // * They can't created inside the constructor of SamplerCollector as well,
  143|       |    //   which results in deadlock.
  144|       |    if (s_cumulated_time_bvar == NULL) {
  145|       |        s_cumulated_time_bvar =
  146|       |            new PassiveStatus<double>(get_cumulated_time, this);
  147|       |    }
  148|       |    if (s_sampling_thread_usage_bvar == NULL) {
  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::gettimeofday_us();
  159|      2|        Sampler* s = this->reset();
  160|      2|        if (s) {
  ------------------
  |  Branch (160:13): [True: 2, False: 0]
  ------------------
  161|      2|            s->InsertBeforeAsList(&root);
  162|      2|        }
  163|     10|        for (butil::LinkNode<Sampler>* p = root.next(); p != &root;) {
  ------------------
  |  Branch (163:57): [True: 8, False: 2]
  ------------------
  164|       |            // We may remove p from the list, save next first.
  165|      8|            butil::LinkNode<Sampler>* saved_next = p->next();
  166|      8|            Sampler* s = p->value();
  167|      8|            s->_mutex.lock();
  168|      8|            if (!s->_used) {
  ------------------
  |  Branch (168:17): [True: 0, False: 8]
  ------------------
  169|      0|                s->_mutex.unlock();
  170|      0|                p->RemoveFromList();
  171|      0|                delete s;
  172|      8|            } else {
  173|      8|                s->take_sample();
  174|      8|                s->_mutex.unlock();
  175|      8|            }
  176|      8|            p = saved_next;
  177|      8|        }
  178|      2|        bool slept = false;
  179|      2|        int64_t now = butil::gettimeofday_us();
  180|      2|        _cumulated_time_us += now - abstime;
  181|      2|        abstime += 1000000L;
  182|      4|        while (abstime > now) {
  ------------------
  |  Branch (182:16): [True: 2, False: 2]
  ------------------
  183|      2|            ::usleep(abstime - now);
  184|      2|            slept = true;
  185|      2|            now = butil::gettimeofday_us();
  186|      2|        }
  187|      2|        if (slept) {
  ------------------
  |  Branch (187:13): [True: 0, False: 2]
  ------------------
  188|      0|            consecutive_nosleep = 0;
  189|      2|        } else {            
  190|      2|            if (++consecutive_nosleep >= WARN_NOSLEEP_THRESHOLD) {
  ------------------
  |  Branch (190:17): [True: 0, False: 2]
  ------------------
  191|      0|                consecutive_nosleep = 0;
  192|      0|                LOG(WARNING) << "bvar is busy at sampling for "
  ------------------
  |  |  485|      0|    BAIDU_LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
  |  |  ------------------
  |  |  |  |  472|      0|    !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (472:5): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|      0|                             << WARN_NOSLEEP_THRESHOLD << " seconds!";
  194|      0|            }
  195|      2|        }
  196|      2|    }
  197|      2|}
_ZN4bvar6detail7SamplerC2Ev:
  199|      8|Sampler::Sampler() : _used(true) {}
_ZN4bvar6detail7Sampler8scheduleEv:
  205|      8|void Sampler::schedule() {
  206|       |    // since the SamplerCollector is initialized before the program starts
  207|       |    // flags will not take effect if used in the SamplerCollector constructor
  208|      8|    if (FLAGS_bvar_enable_sampling) {
  ------------------
  |  Branch (208:9): [True: 8, False: 0]
  ------------------
  209|      8|        *butil::get_leaky_singleton<SamplerCollector>() << this;
  210|      8|    }
  211|      8|}
_ZN4bvar6detail16SamplerCollectorC2Ev:
   66|      2|        : _created(false)
   67|      2|        , _stop(false)
   68|      2|        , _cumulated_time_us(0) {
   69|      2|        create_sampling_thread();
   70|      2|    }
_ZN4bvar6detail16SamplerCollector22create_sampling_threadEv:
   91|      2|    void create_sampling_thread() {
   92|      2|        const int rc = pthread_create(&_tid, NULL, 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(NULL, NULL, 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|       |        return NULL;
  115|      2|    }
_ZNK4bvar6detail14CombineSamplerclERPNS0_7SamplerES3_:
   36|     10|    void operator()(Sampler* & s1, Sampler* s2) const {
   37|     10|        if (s2 == NULL) {
  ------------------
  |  Branch (37:13): [True: 0, False: 10]
  ------------------
   38|      0|            return;
   39|      0|        }
   40|     10|        if (s1 == NULL) {
  ------------------
  |  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|       |        pthread_mutex_init(&_mutex, NULL);
  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|       |        pthread_mutex_init(&_mutex, NULL);
  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|       |        pthread_mutex_init(&_mutex, NULL);
  109|      2|    }
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE4DataC2Ev:
  127|      2|        Data() {
  128|       |            // is_pod does not work for gcc 3.4
  129|      2|            if (butil::is_integral<T>::value ||
  ------------------
  |  Branch (129:17): [True: 2, Folded]
  ------------------
  130|      2|                butil::is_floating_point<T>::value) {
  ------------------
  |  Branch (130:17): [Folded, False: 0]
  ------------------
  131|      2|                memset(static_cast<void*>(_array), 0, sizeof(_array));
  132|      2|            }
  133|      2|        }
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE6appendERKi:
  114|      2|    void append(const T& value) {
  115|      2|        BAIDU_SCOPED_LOCK(_mutex);
  ------------------
  |  |   47|      2|    decltype(::butil::detail::get_lock_guard<decltype(ref_of_lock)>()) \
  |  |   48|      2|    BAIDU_CONCAT(scoped_locker_dummy_at_line_, __LINE__)(ref_of_lock)
  |  |  ------------------
  |  |  |  |   88|      2|# define BAIDU_CONCAT(a, b) BAIDU_CONCAT_HELPER(a, b)
  |  |  |  |  ------------------
  |  |  |  |  |  |   89|      2|# define BAIDU_CONCAT_HELPER(a, b) a##b
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|      2|        return append_second(value, _op);
  117|      2|    }
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE13append_secondERKiRKS3_:
  161|      2|void SeriesBase<T, Op>::append_second(const T& value, const Op& op) {
  162|      2|    _data.second(_nsecond) = value;
  163|      2|    ++_nsecond;
  164|      2|    if (_nsecond >= 60) {
  ------------------
  |  Branch (164:9): [True: 0, False: 2]
  ------------------
  165|      0|        _nsecond = 0;
  166|      0|        T tmp = _data.second(0);
  167|      0|        for (int i = 1; i < 60; ++i) {
  ------------------
  |  Branch (167:25): [True: 0, False: 0]
  ------------------
  168|      0|            call_op_returning_void(op, tmp, _data.second(i));
  169|      0|        }
  170|      0|        DivideOnAddition<T, Op>::inplace_divide(tmp, op, 60);
  171|      0|        append_minute(tmp, op);
  172|      0|    }
  173|      2|}
_ZN4bvar6detail10SeriesBaseIiNS0_5AddToIiEEE4Data6secondEi:
  135|      2|        T& second(int index) { return _array[index]; }

_ZNK4bvar13PassiveStatusIlE9get_valueEv:
  139|      2|    Tp get_value() const {
  140|      2|        return (_getfn ? _getfn(_arg) : Tp());
  ------------------
  |  Branch (140:17): [True: 2, False: 0]
  ------------------
  141|      2|    }
_ZN4bvar13PassiveStatusIlE11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESC_NS_13DisplayFilterE:
  172|      2|                    DisplayFilter display_filter) override {
  173|      2|        const int rc = Variable::expose_impl(prefix, name, display_filter);
  174|      2|        if (ADDITIVE &&
  ------------------
  |  Branch (174:13): [True: 2, Folded]
  ------------------
  175|      2|            rc == 0 &&
  ------------------
  |  Branch (175:13): [True: 2, False: 0]
  ------------------
  176|      2|            _series_sampler == NULL &&
  ------------------
  |  Branch (176:13): [True: 2, False: 0]
  ------------------
  177|      2|            FLAGS_save_series) {
  ------------------
  |  Branch (177:13): [True: 2, False: 0]
  ------------------
  178|      2|            _series_sampler = new SeriesSampler(this);
  179|      2|            _series_sampler->schedule();
  180|      2|        }
  181|      2|        return rc;
  182|      2|    }
_ZN4bvar13PassiveStatusIlE13SeriesSamplerC2EPS1_:
   58|      2|            : _owner(owner), _vector_names(NULL), _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(NULL)
   84|      2|        , _series_sampler(NULL) {
   85|      2|        expose(name);
   86|      2|    }
_ZNK4bvar13PassiveStatusImE9get_valueEv:
  139|      4|    Tp get_value() const {
  140|      4|        return (_getfn ? _getfn(_arg) : Tp());
  ------------------
  |  Branch (140:17): [True: 4, False: 0]
  ------------------
  141|      4|    }
_ZN4bvar13PassiveStatusImE11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESC_NS_13DisplayFilterE:
  172|      4|                    DisplayFilter display_filter) override {
  173|      4|        const int rc = Variable::expose_impl(prefix, name, display_filter);
  174|      4|        if (ADDITIVE &&
  ------------------
  |  Branch (174:13): [True: 4, Folded]
  ------------------
  175|      4|            rc == 0 &&
  ------------------
  |  Branch (175:13): [True: 4, False: 0]
  ------------------
  176|      4|            _series_sampler == NULL &&
  ------------------
  |  Branch (176:13): [True: 4, False: 0]
  ------------------
  177|      4|            FLAGS_save_series) {
  ------------------
  |  Branch (177:13): [True: 4, False: 0]
  ------------------
  178|      4|            _series_sampler = new SeriesSampler(this);
  179|      4|            _series_sampler->schedule();
  180|      4|        }
  181|      4|        return rc;
  182|      4|    }
_ZN4bvar13PassiveStatusImE13SeriesSamplerC2EPS1_:
   58|      4|            : _owner(owner), _vector_names(NULL), _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(NULL)
   84|      2|        , _series_sampler(NULL) {
   85|      2|        expose(name);
   86|      2|    }
_ZNK4bvar13PassiveStatusIiE9get_valueEv:
  139|      2|    Tp get_value() const {
  140|      2|        return (_getfn ? _getfn(_arg) : Tp());
  ------------------
  |  Branch (140:17): [True: 2, False: 0]
  ------------------
  141|      2|    }
_ZN4bvar13PassiveStatusIiE11expose_implERKN5butil16BasicStringPieceINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESC_NS_13DisplayFilterE:
  172|      2|                    DisplayFilter display_filter) override {
  173|      2|        const int rc = Variable::expose_impl(prefix, name, display_filter);
  174|      2|        if (ADDITIVE &&
  ------------------
  |  Branch (174:13): [True: 2, Folded]
  ------------------
  175|      2|            rc == 0 &&
  ------------------
  |  Branch (175:13): [True: 2, False: 0]
  ------------------
  176|      2|            _series_sampler == NULL &&
  ------------------
  |  Branch (176:13): [True: 2, False: 0]
  ------------------
  177|      2|            FLAGS_save_series) {
  ------------------
  |  Branch (177:13): [True: 2, False: 0]
  ------------------
  178|      2|            _series_sampler = new SeriesSampler(this);
  179|      2|            _series_sampler->schedule();
  180|      2|        }
  181|      2|        return rc;
  182|      2|    }
_ZN4bvar13PassiveStatusIiE13SeriesSamplerC2EPS1_:
   58|      2|            : _owner(owner), _vector_names(NULL), _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(NULL)
   84|      4|        , _series_sampler(NULL) {
   85|      4|        expose(name);
   86|      4|    }

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

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

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

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

_ZN7json2pb14Json2PbOptionsC2Ev:
   75|  4.20k|    : base64_to_bytes(true)
   76|       |#endif
   77|  4.20k|    , array_to_single_repeated(false)
   78|  4.20k|    , allow_remaining_bytes_after_parsing(false) {
   79|  4.20k|}
_ZN7json2pb23JsonValueToProtoMessageERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPN6google8protobuf7MessageERKNS_14Json2PbOptionsEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi:
  539|  6.83k|                             int depth) {
  540|  6.83k|    if (depth > FLAGS_json2pb_max_recursion_depth) {
  ------------------
  |  Branch (540:9): [True: 0, False: 6.83k]
  ------------------
  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.83k|    const google::protobuf::Descriptor* descriptor = message->GetDescriptor();
  545|  6.83k|    if (!json_value.IsObject() &&
  ------------------
  |  Branch (545:9): [True: 1.16k, False: 5.66k]
  ------------------
  546|  1.16k|        !(json_value.IsArray() && options.array_to_single_repeated && depth == 0)) {
  ------------------
  |  Branch (546:11): [True: 53, False: 1.10k]
  |  Branch (546:35): [True: 0, False: 53]
  |  Branch (546:71): [True: 0, False: 0]
  ------------------
  547|  1.16k|        J2PERROR_WITH_PB(message, err, "The input is not a json object");
  ------------------
  |  |   52|  1.16k|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 1.16k, False: 0]
  |  |  ------------------
  |  |   53|  1.16k|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 17, False: 1.14k]
  |  |  ------------------
  |  |   54|     17|            perr->append(", ", 2);                                      \
  |  |   55|     17|        }                                                               \
  |  |   56|  1.16k|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|  1.16k|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 1.16k, False: 0]
  |  |  ------------------
  |  |   58|  1.16k|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|  1.16k|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|  1.16k|        }                                                               \
  |  |   61|  1.16k|    } else { }
  ------------------
  548|  1.16k|        return false;
  549|  1.16k|    }
  550|       |
  551|  5.66k|    const google::protobuf::Reflection* reflection = message->GetReflection();
  552|       |    
  553|  5.66k|    std::vector<const google::protobuf::FieldDescriptor*> fields;
  554|  5.66k|    fields.reserve(64);
  555|  5.66k|    for (int i = 0; i < descriptor->extension_range_count(); ++i) {
  ------------------
  |  Branch (555:21): [True: 0, False: 5.66k]
  ------------------
  556|      0|        const google::protobuf::Descriptor::ExtensionRange*
  557|      0|            ext_range = descriptor->extension_range(i);
  558|      0|#if GOOGLE_PROTOBUF_VERSION < 4024000
  559|      0|        for (int tag_number = ext_range->start; tag_number < ext_range->end; ++tag_number)
  ------------------
  |  Branch (559:49): [True: 0, False: 0]
  ------------------
  560|       |#else
  561|       |        for (int tag_number = ext_range->start_number(); tag_number < ext_range->end_number(); ++tag_number)
  562|       |#endif
  563|      0|        {
  564|      0|            const google::protobuf::FieldDescriptor* field =
  565|      0|                reflection->FindKnownExtensionByNumber(tag_number);
  566|      0|            if (field) {
  ------------------
  |  Branch (566:17): [True: 0, False: 0]
  ------------------
  567|      0|                fields.push_back(field);
  568|      0|            }
  569|      0|        }
  570|      0|    }
  571|  28.9k|    for (int i = 0; i < descriptor->field_count(); ++i) {
  ------------------
  |  Branch (571:21): [True: 23.2k, False: 5.66k]
  ------------------
  572|  23.2k|        fields.push_back(descriptor->field(i));
  573|  23.2k|    }
  574|       |
  575|  5.66k|    if (json_value.IsArray()) {
  ------------------
  |  Branch (575:9): [True: 0, False: 5.66k]
  ------------------
  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.66k|    std::string field_name_str_temp; 
  585|  5.66k|    const BUTIL_RAPIDJSON_NAMESPACE::Value* value_ptr = NULL;
  586|  24.7k|    for (size_t i = 0; i < fields.size(); ++i) {
  ------------------
  |  Branch (586:24): [True: 20.4k, False: 4.27k]
  ------------------
  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.6k, False: 9.77k]
  ------------------
  597|  10.6k|            if (field->is_required()) {
  ------------------
  |  Branch (597:17): [True: 665, False: 9.97k]
  ------------------
  598|    665|                J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  ------------------
  |  |   49|    665|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|    665|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 665, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|    665|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 227, False: 438]
  |  |  |  |  ------------------
  |  |  |  |   54|    227|            perr->append(", ", 2);                                      \
  |  |  |  |   55|    227|        }                                                               \
  |  |  |  |   56|    665|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|    665|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 665]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|    665|    } else { }
  |  |  ------------------
  ------------------
  599|    665|                return false;
  600|    665|            }
  601|  9.97k|            continue; 
  602|  10.6k|        }
  603|  9.77k|        value_ptr = &(member->value);
  604|       |#else 
  605|       |        const BUTIL_RAPIDJSON_NAMESPACE::Value::Member* member =
  606|       |                json_value.FindMember(field_name_str.data());
  607|       |        if (member == NULL) {
  608|       |            if (field->is_required()) {
  609|       |                J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  610|       |                return false;
  611|       |            }
  612|       |            continue; 
  613|       |        }
  614|       |        value_ptr = &(member->value);
  615|       |#endif
  616|       |
  617|  9.77k|        if (IsProtobufMap(field) && value_ptr->IsObject()) {
  ------------------
  |  Branch (617:13): [True: 0, False: 9.77k]
  |  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.77k|        } else {
  623|  9.77k|            if (!JsonValueToProtoField(*value_ptr, field, message, options, err, depth)) {
  ------------------
  |  Branch (623:17): [True: 725, False: 9.05k]
  ------------------
  624|    725|                return false;
  625|    725|            }
  626|  9.77k|        }
  627|  9.77k|    }
  628|  4.27k|    return true;
  629|  5.66k|}
_ZN7json2pb18JsonToProtoMessageERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN6google8protobuf7MessageEPS5_:
  712|  4.20k|                        std::string* error) {
  713|  4.20k|    return JsonToProtoMessageInline(json_string, message, Json2PbOptions(), error, nullptr);
  714|  4.20k|}
json_to_pb.cpp:_ZN7json2pbL21JsonValueToProtoFieldERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPKN6google8protobuf15FieldDescriptorEPNSC_7MessageERKNS_14Json2PbOptionsEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi:
  326|  9.77k|                                  int depth) {
  327|  9.77k|    if (value.IsNull()) {
  ------------------
  |  Branch (327:9): [True: 144, False: 9.63k]
  ------------------
  328|    144|        if (field->is_required()) {
  ------------------
  |  Branch (328:13): [True: 17, False: 127]
  ------------------
  329|     17|            J2PERROR(err, "Missing required field: %s", butil::EnsureString(field->full_name()).c_str());
  ------------------
  |  |   49|     17|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|     17|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 17, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|     17|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 13, False: 4]
  |  |  |  |  ------------------
  |  |  |  |   54|     13|            perr->append(", ", 2);                                      \
  |  |  |  |   55|     13|        }                                                               \
  |  |  |  |   56|     17|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|     17|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 17]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|     17|    } else { }
  |  |  ------------------
  ------------------
  330|     17|            return false;
  331|     17|        }
  332|    127|        return true;
  333|    144|    }
  334|       |        
  335|  9.63k|    if (field->is_repeated()) {
  ------------------
  |  Branch (335:9): [True: 654, False: 8.98k]
  ------------------
  336|    654|        if (!value.IsArray()) {
  ------------------
  |  Branch (336:13): [True: 20, False: 634]
  ------------------
  337|     20|            J2PERROR(err, "Invalid value for repeated field: %s",
  ------------------
  |  |   49|     20|    J2PERROR_WITH_PB((::google::protobuf::Message*)nullptr, perr, fmt, ##__VA_ARGS__)
  |  |  ------------------
  |  |  |  |   52|     20|    if (perr) {                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (52:9): [True: 20, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   53|     20|        if (!perr->empty()) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (53:13): [True: 13, False: 7]
  |  |  |  |  ------------------
  |  |  |  |   54|     13|            perr->append(", ", 2);                                      \
  |  |  |  |   55|     13|        }                                                               \
  |  |  |  |   56|     20|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  |  |   57|     20|        if ((pb) != nullptr) {                                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:13): [Folded, False: 20]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|            butil::string_appendf(perr, " [%s]",                        \
  |  |  |  |   59|      0|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |  |  |   60|      0|        }                                                               \
  |  |  |  |   61|     20|    } else { }
  |  |  ------------------
  ------------------
  338|     20|                     butil::EnsureString(field->full_name()).c_str());
  339|     20|            return false;
  340|     20|        }
  341|    654|    } 
  342|       |
  343|  9.61k|    const google::protobuf::Reflection* reflection = message->GetReflection();
  344|  9.61k|    switch (field->cpp_type()) {
  ------------------
  |  Branch (344:13): [True: 9.61k, 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|     41|        CASE_FIELD_TYPE(INT32,  Int32,  Int);
  ------------------
  |  |  346|     41|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 41, False: 9.57k]
  |  |  ------------------
  |  |  347|     41|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 41, False: 0]
  |  |  ------------------
  |  |  348|     41|                const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();          \
  |  |  349|  1.26k|                for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) { \
  |  |  ------------------
  |  |  |  |  120|     41|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  |  |  ------------------
  |  |  |  Branch (349:69): [True: 1.22k, False: 41]
  |  |  ------------------
  |  |  350|  1.22k|                    const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];       \
  |  |  351|  1.22k|                    if (TYPE_MATCH == J2PCHECKTYPE(item, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|  1.22k|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|  1.22k|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|  1.22k|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 15, False: 1.21k]
  |  |  |  |  ------------------
  |  |  |  |  312|     15|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|     15|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 15, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|     15|                    return false;                                   \
  |  |  |  |  315|     15|                }                                                   \
  |  |  |  |  316|     15|            }                                                       \
  |  |  |  |  317|  1.22k|            match_type;                                             \
  |  |  |  |  318|  1.21k|        })
  |  |  ------------------
  |  |  |  Branch (351:25): [True: 1.21k, False: 15]
  |  |  ------------------
  |  |  352|  1.21k|                        reflection->Add##method(message, field, item.Get##jsontype()); \
  |  |  353|  1.21k|                    }                                                   \
  |  |  354|  1.22k|                }                                                       \
  |  |  355|     41|            } 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|     41|            break;                                                      \
  |  |  359|     41|        }                                                               \
  ------------------
  362|    158|        CASE_FIELD_TYPE(UINT32, UInt32, Uint);
  ------------------
  |  |  346|    158|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 158, False: 9.45k]
  |  |  ------------------
  |  |  347|    158|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 0, False: 158]
  |  |  ------------------
  |  |  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|    158|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|    158|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|    158|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|    158|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 96, False: 62]
  |  |  |  |  ------------------
  |  |  |  |  312|     96|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|     96|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  |  |  314|      0|                    return false;                                   \
  |  |  |  |  315|      0|                }                                                   \
  |  |  |  |  316|     96|            }                                                       \
  |  |  |  |  317|    158|            match_type;                                             \
  |  |  |  |  318|    158|        })
  |  |  ------------------
  |  |  |  Branch (355:24): [True: 62, False: 96]
  |  |  ------------------
  |  |  356|     62|                reflection->Set##method(message, field, value.Get##jsontype()); \
  |  |  357|     62|            }                                                           \
  |  |  358|    158|            break;                                                      \
  |  |  359|    158|        }                                                               \
  ------------------
  363|    952|        CASE_FIELD_TYPE(BOOL,   Bool,   Bool);
  ------------------
  |  |  346|    952|        case google::protobuf::FieldDescriptor::CPPTYPE_##cpptype: {                      \
  |  |  ------------------
  |  |  |  Branch (346:9): [True: 952, False: 8.66k]
  |  |  ------------------
  |  |  347|    952|            if (field->is_repeated()) {                                 \
  |  |  ------------------
  |  |  |  Branch (347:17): [True: 0, False: 952]
  |  |  ------------------
  |  |  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|    952|            } else if (TYPE_MATCH == J2PCHECKTYPE(value, cpptype, jsontype)) { \
  |  |  ------------------
  |  |  |  |  309|    952|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  |  |  310|    952|            MatchType match_type = TYPE_MATCH;                      \
  |  |  |  |  311|    952|            if (!value.Is##jsontype()) {                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (311:17): [True: 22, False: 930]
  |  |  |  |  ------------------
  |  |  |  |  312|     22|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  |  |  313|     22|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (313:21): [True: 22, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  314|     22|                    return false;                                   \
  |  |  |  |  315|     22|                }                                                   \
  |  |  |  |  316|     22|            }                                                       \
  |  |  |  |  317|    952|            match_type;                                             \
  |  |  |  |  318|    930|        })
  |  |  ------------------
  |  |  |  Branch (355:24): [True: 930, False: 22]
  |  |  ------------------
  |  |  356|    930|                reflection->Set##method(message, field, value.Get##jsontype()); \
  |  |  357|    930|            }                                                           \
  |  |  358|    952|            break;                                                      \
  |  |  359|    952|        }                                                               \
  ------------------
  364|      0|#undef CASE_FIELD_TYPE
  365|       |
  366|    482|    case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
  ------------------
  |  Branch (366:5): [True: 482, False: 9.13k]
  ------------------
  367|    482|        if (field->is_repeated()) {
  ------------------
  |  Branch (367:13): [True: 0, False: 482]
  ------------------
  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|    482|        } else if (!convert_int64_type(value, false, message, field, reflection,
  ------------------
  |  Branch (377:20): [True: 0, False: 482]
  ------------------
  378|    482|                                       err)) {
  379|      0|            return false;
  380|      0|        }
  381|    482|        break;
  382|       |
  383|    482|    case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
  ------------------
  |  Branch (383:5): [True: 0, False: 9.61k]
  ------------------
  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.41k|    case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
  ------------------
  |  Branch (400:5): [True: 3.41k, False: 6.20k]
  ------------------
  401|  3.41k|        if (field->is_repeated()) {
  ------------------
  |  Branch (401:13): [True: 0, False: 3.41k]
  ------------------
  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.41k|        } else if (!convert_float_type(value, false, message, field,
  ------------------
  |  Branch (410:20): [True: 26, False: 3.38k]
  ------------------
  411|  3.41k|                                       reflection, err)) {
  412|     26|            return false;
  413|     26|        }
  414|  3.38k|        break;
  415|       |
  416|  3.38k|    case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: 
  ------------------
  |  Branch (416:5): [True: 927, False: 8.68k]
  ------------------
  417|    927|        if (field->is_repeated()) {
  ------------------
  |  Branch (417:13): [True: 0, False: 927]
  ------------------
  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|    927|        } else if (!convert_double_type(value, false, message, field,
  ------------------
  |  Branch (426:20): [True: 182, False: 745]
  ------------------
  427|    927|                                        reflection, err)) {
  428|    182|            return false;
  429|    182|        }
  430|    745|        break;
  431|       |        
  432|  2.00k|    case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
  ------------------
  |  Branch (432:5): [True: 2.00k, False: 7.61k]
  ------------------
  433|  2.00k|        if (field->is_repeated()) {
  ------------------
  |  Branch (433:13): [True: 63, False: 1.93k]
  ------------------
  434|     63|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  435|  1.27k|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|     63|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (435:65): [True: 1.21k, False: 63]
  ------------------
  436|  1.21k|                const BUTIL_RAPIDJSON_NAMESPACE::Value & item = value[index];
  437|  1.21k|                if (TYPE_MATCH == J2PCHECKTYPE(item, string, String)) { 
  ------------------
  |  |  309|  1.21k|#define J2PCHECKTYPE(value, cpptype, jsontype) ({                   \
  |  |  310|  1.21k|            MatchType match_type = TYPE_MATCH;                      \
  |  |  311|  1.21k|            if (!value.Is##jsontype()) {                            \
  |  |  ------------------
  |  |  |  Branch (311:17): [True: 13, False: 1.19k]
  |  |  ------------------
  |  |  312|     13|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|     13|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 13, False: 0]
  |  |  ------------------
  |  |  314|     13|                    return false;                                   \
  |  |  315|     13|                }                                                   \
  |  |  316|     13|            }                                                       \
  |  |  317|  1.21k|            match_type;                                             \
  |  |  318|  1.19k|        })
  ------------------
  |  Branch (437:21): [True: 1.19k, False: 13]
  ------------------
  438|  1.19k|                    std::string str(item.GetString(), item.GetStringLength());
  439|  1.19k|                    if (field->type() == google::protobuf::FieldDescriptor::TYPE_BYTES &&
  ------------------
  |  Branch (439:25): [True: 0, False: 1.19k]
  ------------------
  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|  1.19k|                    reflection->AddString(message, field, str);
  449|  1.19k|                }  
  450|  1.21k|            }
  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.06k, False: 875]
  |  |  ------------------
  |  |  312|  1.06k|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|  1.06k|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 1, False: 1.06k]
  |  |  ------------------
  |  |  314|      1|                    return false;                                   \
  |  |  315|      1|                }                                                   \
  |  |  316|  1.06k|            }                                                       \
  |  |  317|  1.93k|            match_type;                                             \
  |  |  318|  1.93k|        })
  ------------------
  |  Branch (451:20): [True: 875, False: 1.06k]
  ------------------
  452|    875|            std::string str(value.GetString(), value.GetStringLength());
  453|    875|            if (field->type() == google::protobuf::FieldDescriptor::TYPE_BYTES &&
  ------------------
  |  Branch (453:17): [True: 768, False: 107]
  ------------------
  454|    768|                options.base64_to_bytes) {
  ------------------
  |  Branch (454:17): [True: 768, False: 0]
  ------------------
  455|    768|                std::string str_decoded;
  456|    768|                if (!butil::Base64Decode(str, &str_decoded)) {
  ------------------
  |  Branch (456:21): [True: 44, False: 724]
  ------------------
  457|     44|                    J2PERROR_WITH_PB(message, err, "Fail to decode base64 string=%s", str.c_str());
  ------------------
  |  |   52|     44|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 44, False: 0]
  |  |  ------------------
  |  |   53|     44|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 2, False: 42]
  |  |  ------------------
  |  |   54|      2|            perr->append(", ", 2);                                      \
  |  |   55|      2|        }                                                               \
  |  |   56|     44|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |   57|     44|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 44, False: 0]
  |  |  ------------------
  |  |   58|     44|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|     44|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|     44|        }                                                               \
  |  |   61|     44|    } else { }
  ------------------
  458|     44|                    return false;
  459|     44|                }
  460|    724|                str = str_decoded;
  461|    724|            }
  462|    831|            reflection->SetString(message, field, str);
  463|    831|        }
  464|  1.95k|        break;
  465|       |
  466|  1.95k|    case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
  ------------------
  |  Branch (466:5): [True: 300, False: 9.31k]
  ------------------
  467|    300|        if (field->is_repeated()) {
  ------------------
  |  Branch (467:13): [True: 0, False: 300]
  ------------------
  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|    300|        } else if (!convert_enum_type(value, false, message, field,
  ------------------
  |  Branch (476:20): [True: 0, False: 300]
  ------------------
  477|    300|                                      reflection, err)) {
  478|      0|            return false;
  479|      0|        }
  480|    300|        break;
  481|       |        
  482|  1.34k|    case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
  ------------------
  |  Branch (482:5): [True: 1.34k, False: 8.27k]
  ------------------
  483|  1.34k|        if (field->is_repeated()) {
  ------------------
  |  Branch (483:13): [True: 530, False: 812]
  ------------------
  484|    530|            const BUTIL_RAPIDJSON_NAMESPACE::SizeType size = value.Size();
  485|  3.72k|            for (BUTIL_RAPIDJSON_NAMESPACE::SizeType index = 0; index < size; ++index) {
  ------------------
  |  |  120|    530|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  |  Branch (485:65): [True: 3.40k, False: 315]
  ------------------
  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: 82, False: 3.32k]
  |  |  ------------------
  |  |  312|     82|                match_type = OPTIONAL_TYPE_MISMATCH;                \
  |  |  313|     82|                if (!value_invalid(field, #cpptype, value, err)) {  \
  |  |  ------------------
  |  |  |  Branch (313:21): [True: 82, False: 0]
  |  |  ------------------
  |  |  314|     82|                    return false;                                   \
  |  |  315|     82|                }                                                   \
  |  |  316|     82|            }                                                       \
  |  |  317|  3.40k|            match_type;                                             \
  |  |  318|  3.32k|        })
  ------------------
  |  Branch (487:21): [True: 3.32k, False: 82]
  ------------------
  488|  3.32k|                    if (!JsonValueToProtoMessage(
  ------------------
  |  Branch (488:25): [True: 215, False: 3.10k]
  ------------------
  489|  3.32k|                            item, reflection->AddMessage(message, field), options, err, depth + 1)) {
  490|    215|                        return false;
  491|    215|                    }
  492|  3.32k|                } 
  493|  3.40k|            }
  494|    812|        } else if (!JsonValueToProtoMessage(
  ------------------
  |  Branch (494:20): [True: 88, False: 724]
  ------------------
  495|    812|            value, reflection->MutableMessage(message, field), options, err, depth + 1)) {
  496|     88|            return false;
  497|     88|        }
  498|  1.03k|        break;
  499|  9.61k|    }
  500|  8.92k|    return true;
  501|  9.61k|}
_ZN7json2pb13value_invalidEPKN6google8protobuf15FieldDescriptorEPKcRKN5butil9rapidjson12GenericValueINS8_4UTF8IcEENS8_19MemoryPoolAllocatorINS8_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  121|  2.19k|                          const BUTIL_RAPIDJSON_NAMESPACE::Value& value, std::string* err) {
  122|  2.19k|    bool optional = !field->is_required() && !field->is_repeated();
  ------------------
  |  Branch (122:21): [True: 1.96k, False: 231]
  |  Branch (122:46): [True: 1.85k, False: 110]
  ------------------
  123|  2.19k|    if (err) {
  ------------------
  |  Branch (123:9): [True: 2.19k, False: 0]
  ------------------
  124|  2.19k|        if (!err->empty()) {
  ------------------
  |  Branch (124:13): [True: 1.35k, False: 842]
  ------------------
  125|  1.35k|            err->append(", ");
  126|  1.35k|        }
  127|  2.19k|        err->append("Invalid value `");
  128|  2.19k|        string_append_value(value, err);
  129|  2.19k|        butil::string_appendf(err, "' for %sfield `%s' which SHOULD be %s",
  130|  2.19k|                       optional ? "optional " : "",
  ------------------
  |  Branch (130:24): [True: 1.85k, False: 341]
  ------------------
  131|  2.19k|                       butil::EnsureString(field->full_name()).c_str(), type);
  132|  2.19k|    }
  133|  2.19k|    if (!optional) {
  ------------------
  |  Branch (133:9): [True: 341, False: 1.85k]
  ------------------
  134|    341|        return false;                                           
  135|    341|    } 
  136|  1.85k|    return true;
  137|  2.19k|}
json_to_pb.cpp:_ZN7json2pbL19string_append_valueERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
   88|  2.19k|                                std::string* output) {
   89|  2.19k|    if (value.IsNull()) {
  ------------------
  |  Branch (89:9): [True: 12, False: 2.18k]
  ------------------
   90|     12|        output->append("null");
   91|  2.18k|    } else if (value.IsBool()) {
  ------------------
  |  Branch (91:16): [True: 89, False: 2.09k]
  ------------------
   92|     89|        output->append(value.GetBool() ? "true" : "false");
  ------------------
  |  Branch (92:24): [True: 88, False: 1]
  ------------------
   93|  2.09k|    } else if (value.IsInt()) {
  ------------------
  |  Branch (93:16): [True: 404, False: 1.69k]
  ------------------
   94|    404|        butil::string_appendf(output, "%d", value.GetInt());
   95|  1.69k|    } else if (value.IsUint()) {
  ------------------
  |  Branch (95:16): [True: 35, False: 1.65k]
  ------------------
   96|     35|        butil::string_appendf(output, "%u", value.GetUint());
   97|  1.65k|    } else if (value.IsInt64()) {
  ------------------
  |  Branch (97:16): [True: 34, False: 1.62k]
  ------------------
   98|     34|        butil::string_appendf(output, "%" PRId64, value.GetInt64());
   99|  1.62k|    } else if (value.IsUint64()) {
  ------------------
  |  Branch (99:16): [True: 34, False: 1.59k]
  ------------------
  100|     34|        butil::string_appendf(output, "%" PRIu64, value.GetUint64());
  101|  1.59k|    } else if (value.IsDouble()) {
  ------------------
  |  Branch (101:16): [True: 527, False: 1.06k]
  ------------------
  102|    527|        butil::string_appendf(output, "%f", value.GetDouble());
  103|  1.06k|    } else if (value.IsString()) {
  ------------------
  |  Branch (103:16): [True: 867, False: 197]
  ------------------
  104|    867|        output->push_back('"');
  105|    867|        output->append(value.GetString(), value.GetStringLength());
  106|    867|        output->push_back('"');
  107|    867|    } else if (value.IsArray()) {
  ------------------
  |  Branch (107:16): [True: 121, False: 76]
  ------------------
  108|    121|        output->append("array");
  109|    121|    } else if (value.IsObject()) {
  ------------------
  |  Branch (109:16): [True: 76, False: 0]
  ------------------
  110|     76|        output->append("object");
  111|     76|    }
  112|  2.19k|}
_ZN7json2pb18convert_int64_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  242|    482|                               std::string* err) { 
  243|       |  
  244|    482|    int64_t num;
  245|    482|    if (item.IsInt64()) {
  ------------------
  |  Branch (245:9): [True: 11, False: 471]
  ------------------
  246|     11|        if (repeated) {
  ------------------
  |  Branch (246:13): [True: 0, False: 11]
  ------------------
  247|      0|            reflection->AddInt64(message, field, item.GetInt64());
  248|     11|        } else {
  249|     11|            reflection->SetInt64(message, field, item.GetInt64());
  250|     11|        }
  251|    471|    } else if (item.IsString() &&
  ------------------
  |  Branch (251:16): [True: 408, False: 63]
  |  Branch (251:16): [True: 211, False: 260]
  ------------------
  252|    408|               butil::StringToInt64({item.GetString(), item.GetStringLength()},
  ------------------
  |  Branch (252:16): [True: 211, False: 197]
  ------------------
  253|    408|                                    &num)) {
  254|    211|        if (repeated) {
  ------------------
  |  Branch (254:13): [True: 0, False: 211]
  ------------------
  255|      0|            reflection->AddInt64(message, field, num);
  256|    211|        } else {
  257|    211|            reflection->SetInt64(message, field, num);
  258|    211|        }
  259|    260|    } else {
  260|    260|        return value_invalid(field, "INT64", item, err);
  261|    260|    }
  262|    222|    return true;
  263|    482|}
_ZN7json2pb18convert_float_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  172|  3.41k|                               std::string* err) { 
  173|  3.41k|    if (item.IsNumber()) {
  ------------------
  |  Branch (173:9): [True: 2.95k, False: 456]
  ------------------
  174|  2.95k|        if (repeated) {
  ------------------
  |  Branch (174:13): [True: 0, False: 2.95k]
  ------------------
  175|      0|            reflection->AddFloat(message, field, item.GetDouble());
  176|  2.95k|        } else {
  177|  2.95k|            reflection->SetFloat(message, field, item.GetDouble());
  178|  2.95k|        }
  179|  2.95k|    } else if (item.IsString()) {
  ------------------
  |  Branch (179:16): [True: 437, False: 19]
  ------------------
  180|    437|        if (!convert_string_to_double_float_type(
  ------------------
  |  Branch (180:13): [True: 11, False: 426]
  ------------------
  181|    437|                (repeated ? &google::protobuf::Reflection::AddFloat
  ------------------
  |  Branch (181:18): [True: 0, False: 437]
  ------------------
  182|    437|                 : &google::protobuf::Reflection::SetFloat),
  183|    437|                message, field, reflection, item, err)) { 
  184|     11|            return false;
  185|     11|        }                                                                               
  186|    437|    } else {                                         
  187|     19|        return value_invalid(field, "float", item, err);
  188|     19|    } 
  189|  3.38k|    return true;
  190|  3.41k|}
_ZN7json2pb35convert_string_to_double_float_typeIfEEbMN6google8protobuf10ReflectionEKFvPNS2_7MessageEPKNS2_15FieldDescriptorET_ES5_S8_PKS3_RKN5butil9rapidjson12GenericValueINSF_4UTF8IcEENSF_19MemoryPoolAllocatorINSF_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  148|    437|    std::string* err) {
  149|    437|    const char* limit_type = item.GetString();  // MUST be string here 
  150|    437|    if (std::numeric_limits<T>::has_quiet_NaN &&
  ------------------
  |  Branch (150:9): [True: 437, Folded]
  ------------------
  151|    437|        strcasecmp(limit_type, "NaN") == 0) { 
  ------------------
  |  Branch (151:9): [True: 94, False: 343]
  ------------------
  152|     94|        (reflection->*func)(message, field, std::numeric_limits<T>::quiet_NaN());
  153|     94|        return true;
  154|     94|    } 
  155|    343|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (155:9): [True: 343, Folded]
  ------------------
  156|    343|        strcasecmp(limit_type, "Infinity") == 0) {
  ------------------
  |  Branch (156:9): [True: 94, False: 249]
  ------------------
  157|     94|        (reflection->*func)(message, field, std::numeric_limits<T>::infinity());
  158|     94|        return true;
  159|     94|    } 
  160|    249|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (160:9): [True: 249, Folded]
  ------------------
  161|    249|        strcasecmp(limit_type, "-Infinity") == 0) { 
  ------------------
  |  Branch (161:9): [True: 66, False: 183]
  ------------------
  162|     66|        (reflection->*func)(message, field, -std::numeric_limits<T>::infinity());
  163|     66|        return true;
  164|     66|    }
  165|    183|    return value_invalid(field, typeid(T).name(), item, err);
  166|    249|}
_ZN7json2pb19convert_double_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  196|    927|                                std::string* err) {  
  197|    927|    if (item.IsNumber()) {
  ------------------
  |  Branch (197:9): [True: 742, False: 185]
  ------------------
  198|    742|        if (repeated) {
  ------------------
  |  Branch (198:13): [True: 0, False: 742]
  ------------------
  199|      0|            reflection->AddDouble(message, field, item.GetDouble());
  200|    742|        } else {
  201|    742|            reflection->SetDouble(message, field, item.GetDouble());
  202|    742|        }
  203|    742|    } else if (item.IsString()) {
  ------------------
  |  Branch (203:16): [True: 184, False: 1]
  ------------------
  204|    184|        if (!convert_string_to_double_float_type(
  ------------------
  |  Branch (204:13): [True: 181, False: 3]
  ------------------
  205|    184|                (repeated ? &google::protobuf::Reflection::AddDouble
  ------------------
  |  Branch (205:18): [True: 0, False: 184]
  ------------------
  206|    184|                 : &google::protobuf::Reflection::SetDouble),
  207|    184|                message, field, reflection, item, err)) { 
  208|    181|            return false; 
  209|    181|        }
  210|    184|    } else {
  211|      1|        return value_invalid(field, "double", item, err); 
  212|      1|    }
  213|    745|    return true;
  214|    927|}
_ZN7json2pb35convert_string_to_double_float_typeIdEEbMN6google8protobuf10ReflectionEKFvPNS2_7MessageEPKNS2_15FieldDescriptorET_ES5_S8_PKS3_RKN5butil9rapidjson12GenericValueINSF_4UTF8IcEENSF_19MemoryPoolAllocatorINSF_12CrtAllocatorEEEEEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  148|    184|    std::string* err) {
  149|    184|    const char* limit_type = item.GetString();  // MUST be string here 
  150|    184|    if (std::numeric_limits<T>::has_quiet_NaN &&
  ------------------
  |  Branch (150:9): [True: 184, Folded]
  ------------------
  151|    184|        strcasecmp(limit_type, "NaN") == 0) { 
  ------------------
  |  Branch (151:9): [True: 1, False: 183]
  ------------------
  152|      1|        (reflection->*func)(message, field, std::numeric_limits<T>::quiet_NaN());
  153|      1|        return true;
  154|      1|    } 
  155|    183|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (155:9): [True: 183, Folded]
  ------------------
  156|    183|        strcasecmp(limit_type, "Infinity") == 0) {
  ------------------
  |  Branch (156:9): [True: 1, False: 182]
  ------------------
  157|      1|        (reflection->*func)(message, field, std::numeric_limits<T>::infinity());
  158|      1|        return true;
  159|      1|    } 
  160|    182|    if (std::numeric_limits<T>::has_infinity &&
  ------------------
  |  Branch (160:9): [True: 182, Folded]
  ------------------
  161|    182|        strcasecmp(limit_type, "-Infinity") == 0) { 
  ------------------
  |  Branch (161:9): [True: 1, False: 181]
  ------------------
  162|      1|        (reflection->*func)(message, field, -std::numeric_limits<T>::infinity());
  163|      1|        return true;
  164|      1|    }
  165|    181|    return value_invalid(field, typeid(T).name(), item, err);
  166|    182|}
_ZN7json2pb17convert_enum_typeERKN5butil9rapidjson12GenericValueINS1_4UTF8IcEENS1_19MemoryPoolAllocatorINS1_12CrtAllocatorEEEEEbPN6google8protobuf7MessageEPKNSC_15FieldDescriptorEPKNSC_10ReflectionEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE:
  220|    300|                              std::string* err) {
  221|    300|    const google::protobuf::EnumValueDescriptor * enum_value_descriptor = NULL; 
  222|    300|    if (item.IsInt()) {
  ------------------
  |  Branch (222:9): [True: 72, False: 228]
  ------------------
  223|     72|        enum_value_descriptor = field->enum_type()->FindValueByNumber(item.GetInt()); 
  224|    228|    } else if (item.IsString()) {                                          
  ------------------
  |  Branch (224:16): [True: 189, False: 39]
  ------------------
  225|    189|        enum_value_descriptor = field->enum_type()->FindValueByName(item.GetString()); 
  226|    189|    }                                                                      
  227|    300|    if (!enum_value_descriptor) {                                      
  ------------------
  |  Branch (227:9): [True: 264, False: 36]
  ------------------
  228|    264|        return value_invalid(field, "enum", item, err); 
  229|    264|    }                                                                  
  230|     36|    if (repeated) {
  ------------------
  |  Branch (230:9): [True: 0, False: 36]
  ------------------
  231|      0|        reflection->AddEnum(message, field, enum_value_descriptor);
  232|     36|    } else {
  233|     36|        reflection->SetEnum(message, field, enum_value_descriptor);
  234|     36|    }
  235|     36|    return true;
  236|    300|}
_ZN7json2pb24JsonToProtoMessageInlineERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPN6google8protobuf7MessageERKNS_14Json2PbOptionsEPS5_Pm:
  635|  4.20k|                        size_t* parsed_offset) {
  636|  4.20k|    if (error) {
  ------------------
  |  Branch (636:9): [True: 4.20k, False: 0]
  ------------------
  637|  4.20k|        error->clear();
  638|  4.20k|    }
  639|  4.20k|    BUTIL_RAPIDJSON_NAMESPACE::Document d;
  ------------------
  |  |  120|  4.20k|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  ------------------
  640|  4.20k|    if (options.allow_remaining_bytes_after_parsing) {
  ------------------
  |  Branch (640:9): [True: 0, False: 4.20k]
  ------------------
  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.20k|    } else {
  646|  4.20k|        d.Parse<RAPIDJSON_PARSE_FLAG_DEFAULT>(json_string.c_str());
  647|  4.20k|    }
  648|  4.20k|    if (d.HasParseError()) {
  ------------------
  |  Branch (648:9): [True: 1.51k, False: 2.69k]
  ------------------
  649|  1.51k|        if (options.allow_remaining_bytes_after_parsing) {
  ------------------
  |  Branch (649:13): [True: 0, False: 1.51k]
  ------------------
  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.51k|        J2PERROR_WITH_PB(message, error, "Invalid json: %s", BUTIL_RAPIDJSON_NAMESPACE::GetParseError_En(d.GetParseError()));
  ------------------
  |  |   52|  1.51k|    if (perr) {                                                         \
  |  |  ------------------
  |  |  |  Branch (52:9): [True: 1.51k, False: 0]
  |  |  ------------------
  |  |   53|  1.51k|        if (!perr->empty()) {                                           \
  |  |  ------------------
  |  |  |  Branch (53:13): [True: 0, False: 1.51k]
  |  |  ------------------
  |  |   54|      0|            perr->append(", ", 2);                                      \
  |  |   55|      0|        }                                                               \
  |  |   56|  1.51k|        butil::string_appendf(perr, fmt, ##__VA_ARGS__);                \
  |  |  ------------------
  |  |  |  |  656|  1.51k|        J2PERROR_WITH_PB(message, error, "Invalid json: %s", BUTIL_RAPIDJSON_NAMESPACE::GetParseError_En(d.GetParseError()));
  |  |  |  |  ------------------
  |  |  |  |  |  |  120|  1.51k|#define BUTIL_RAPIDJSON_NAMESPACE butil::rapidjson
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   57|  1.51k|        if ((pb) != nullptr) {                                          \
  |  |  ------------------
  |  |  |  Branch (57:13): [True: 1.51k, False: 0]
  |  |  ------------------
  |  |   58|  1.51k|            butil::string_appendf(perr, " [%s]",                        \
  |  |   59|  1.51k|                    butil::EnsureString((pb)->GetDescriptor()->name()).c_str()); \
  |  |   60|  1.51k|        }                                                               \
  |  |   61|  1.51k|    } else { }
  ------------------
  657|  1.51k|        return false;
  658|  1.51k|    }
  659|  2.69k|    return JsonValueToProtoMessage(d, message, options, error, 0);
  660|  4.20k|}

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

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

