| Index: src/counters.h | 
| diff --git a/src/counters.h b/src/counters.h | 
| index 089f024e5f7c0e85093b4a173cd945d91a673c9f..67c0be215d5b3d1a7b19440ae72afc31d3b21191 100644 | 
| --- a/src/counters.h | 
| +++ b/src/counters.h | 
| @@ -484,51 +484,65 @@ | 
| value * ((current_ms - last_ms_) / interval_ms); | 
| } | 
|  | 
| -class RuntimeCallCounter final { | 
| - public: | 
| -  explicit RuntimeCallCounter(const char* name) : name_(name) {} | 
| +struct RuntimeCallCounter { | 
| +  explicit RuntimeCallCounter(const char* name) : name(name) {} | 
| V8_NOINLINE void Reset(); | 
| V8_NOINLINE void Dump(v8::tracing::TracedValue* value); | 
| void Add(RuntimeCallCounter* other); | 
|  | 
| -  const char* name() const { return name_; } | 
| -  int64_t count() const { return count_; } | 
| -  base::TimeDelta time() const { return time_; } | 
| -  void Increment() { count_++; } | 
| -  void Add(base::TimeDelta delta) { time_ += delta; } | 
| - | 
| - private: | 
| -  const char* name_; | 
| -  int64_t count_ = 0; | 
| -  base::TimeDelta time_; | 
| +  const char* name; | 
| +  int64_t count = 0; | 
| +  base::TimeDelta time; | 
| }; | 
|  | 
| // RuntimeCallTimer is used to keep track of the stack of currently active | 
| // timers used for properly measuring the own time of a RuntimeCallCounter. | 
| -class RuntimeCallTimer final { | 
| +class RuntimeCallTimer { | 
| public: | 
| RuntimeCallCounter* counter() { return counter_; } | 
| -  void set_counter(RuntimeCallCounter* counter) { counter_ = counter; } | 
| +  base::ElapsedTimer timer() { return timer_; } | 
| RuntimeCallTimer* parent() const { return parent_.Value(); } | 
| -  void set_parent(RuntimeCallTimer* timer) { parent_.SetValue(timer); } | 
| -  const char* name() const { return counter_->name(); } | 
| - | 
| -  inline bool IsStarted(); | 
| - | 
| -  inline void Start(RuntimeCallCounter* counter, RuntimeCallTimer* parent); | 
| -  void Snapshot(); | 
| -  inline RuntimeCallTimer* Stop(); | 
|  | 
| private: | 
| -  inline void Pause(base::TimeTicks now); | 
| -  inline void Resume(base::TimeTicks now); | 
| -  inline void CommitTimeToCounter(); | 
| -  inline base::TimeTicks Now(); | 
| +  friend class RuntimeCallStats; | 
| + | 
| +  inline void Start(RuntimeCallCounter* counter, RuntimeCallTimer* parent) { | 
| +    counter_ = counter; | 
| +    parent_.SetValue(parent); | 
| +    if (FLAG_runtime_stats != | 
| +        v8::tracing::TracingCategoryObserver::ENABLED_BY_SAMPLING) { | 
| +      timer_.Start(); | 
| +    } | 
| +  } | 
| + | 
| +  inline RuntimeCallTimer* Stop() { | 
| +    if (!timer_.IsStarted()) return parent(); | 
| +    base::TimeDelta delta = timer_.Elapsed(); | 
| +    timer_.Stop(); | 
| +    counter_->count++; | 
| +    counter_->time += delta; | 
| +    if (parent()) { | 
| +      // Adjust parent timer so that it does not include sub timer's time. | 
| +      parent()->counter_->time -= delta; | 
| +    } | 
| +    return parent(); | 
| +  } | 
| + | 
| +  inline void Elapsed() { | 
| +    base::TimeDelta delta = timer_.Elapsed(); | 
| +    counter_->time += delta; | 
| +    if (parent()) { | 
| +      parent()->counter_->time -= delta; | 
| +      parent()->Elapsed(); | 
| +    } | 
| +    timer_.Restart(); | 
| +  } | 
| + | 
| +  const char* name() { return counter_->name; } | 
|  | 
| RuntimeCallCounter* counter_ = nullptr; | 
| base::AtomicValue<RuntimeCallTimer*> parent_; | 
| -  base::TimeTicks start_ticks_; | 
| -  base::TimeDelta elapsed_; | 
| +  base::ElapsedTimer timer_; | 
| }; | 
|  | 
| #define FOR_EACH_API_COUNTER(V)                            \ | 
| @@ -732,9 +746,6 @@ | 
| V(PrototypeObject_DeleteProperty)                 \ | 
| V(RecompileConcurrent)                            \ | 
| V(RecompileSynchronous)                           \ | 
| -  V(TestCounter1)                                   \ | 
| -  V(TestCounter2)                                   \ | 
| -  V(TestCounter3)                                   \ | 
| /* Dummy counter for the unexpected stub miss. */ \ | 
| V(UnexpectedStubMiss) | 
|  | 
| @@ -806,7 +817,7 @@ | 
| V(StoreIC_StoreTransitionDH)                   \ | 
| V(StoreIC_StoreViaSetter) | 
|  | 
| -class V8_EXPORT_PRIVATE RuntimeCallStats final : public ZoneObject { | 
| +class RuntimeCallStats : public ZoneObject { | 
| public: | 
| typedef RuntimeCallCounter RuntimeCallStats::*CounterId; | 
|  | 
| @@ -880,36 +891,6 @@ | 
| #define TRACE_HANDLER_STATS(isolate, counter_name)                          \ | 
| CHANGE_CURRENT_RUNTIME_COUNTER(isolate->counters()->runtime_call_stats(), \ | 
| Handler_##counter_name) | 
| - | 
| -// A RuntimeCallTimerScopes wraps around a RuntimeCallTimer to measure the | 
| -// the time of C++ scope. | 
| -class RuntimeCallTimerScope { | 
| - public: | 
| -  inline RuntimeCallTimerScope(Isolate* isolate, | 
| -                               RuntimeCallStats::CounterId counter_id); | 
| -  // This constructor is here just to avoid calling GetIsolate() when the | 
| -  // stats are disabled and the isolate is not directly available. | 
| -  inline RuntimeCallTimerScope(HeapObject* heap_object, | 
| -                               RuntimeCallStats::CounterId counter_id); | 
| -  inline RuntimeCallTimerScope(RuntimeCallStats* stats, | 
| -                               RuntimeCallStats::CounterId counter_id); | 
| - | 
| -  inline ~RuntimeCallTimerScope() { | 
| -    if (V8_UNLIKELY(stats_ != nullptr)) { | 
| -      RuntimeCallStats::Leave(stats_, &timer_); | 
| -    } | 
| -  } | 
| - | 
| - private: | 
| -  V8_INLINE void Initialize(RuntimeCallStats* stats, | 
| -                            RuntimeCallStats::CounterId counter_id) { | 
| -    stats_ = stats; | 
| -    RuntimeCallStats::Enter(stats_, &timer_, counter_id); | 
| -  } | 
| - | 
| -  RuntimeCallStats* stats_ = nullptr; | 
| -  RuntimeCallTimer timer_; | 
| -}; | 
|  | 
| #define HISTOGRAM_RANGE_LIST(HR)                                              \ | 
| /* Generic range histograms */                                              \ | 
| @@ -1322,6 +1303,36 @@ | 
| DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); | 
| }; | 
|  | 
| +// A RuntimeCallTimerScopes wraps around a RuntimeCallTimer to measure the | 
| +// the time of C++ scope. | 
| +class RuntimeCallTimerScope { | 
| + public: | 
| +  inline RuntimeCallTimerScope(Isolate* isolate, | 
| +                               RuntimeCallStats::CounterId counter_id); | 
| +  // This constructor is here just to avoid calling GetIsolate() when the | 
| +  // stats are disabled and the isolate is not directly available. | 
| +  inline RuntimeCallTimerScope(HeapObject* heap_object, | 
| +                               RuntimeCallStats::CounterId counter_id); | 
| +  inline RuntimeCallTimerScope(RuntimeCallStats* stats, | 
| +                               RuntimeCallStats::CounterId counter_id); | 
| + | 
| +  inline ~RuntimeCallTimerScope() { | 
| +    if (V8_UNLIKELY(stats_ != nullptr)) { | 
| +      RuntimeCallStats::Leave(stats_, &timer_); | 
| +    } | 
| +  } | 
| + | 
| + private: | 
| +  V8_INLINE void Initialize(RuntimeCallStats* stats, | 
| +                            RuntimeCallStats::CounterId counter_id) { | 
| +    stats_ = stats; | 
| +    RuntimeCallStats::Enter(stats_, &timer_, counter_id); | 
| +  } | 
| + | 
| +  RuntimeCallStats* stats_ = nullptr; | 
| +  RuntimeCallTimer timer_; | 
| +}; | 
| + | 
| }  // namespace internal | 
| }  // namespace v8 | 
|  | 
|  |