| Index: src/inspector/V8ProfilerAgentImpl.cpp | 
| diff --git a/src/inspector/V8ProfilerAgentImpl.cpp b/src/inspector/V8ProfilerAgentImpl.cpp | 
| deleted file mode 100644 | 
| index dcf4418c65b3e0224318815fd5fdde54830c8d73..0000000000000000000000000000000000000000 | 
| --- a/src/inspector/V8ProfilerAgentImpl.cpp | 
| +++ /dev/null | 
| @@ -1,321 +0,0 @@ | 
| -// Copyright 2015 the V8 project authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -#include "src/inspector/V8ProfilerAgentImpl.h" | 
| - | 
| -#include "src/base/atomicops.h" | 
| -#include "src/inspector/StringUtil.h" | 
| -#include "src/inspector/V8Debugger.h" | 
| -#include "src/inspector/V8InspectorImpl.h" | 
| -#include "src/inspector/V8InspectorSessionImpl.h" | 
| -#include "src/inspector/V8StackTraceImpl.h" | 
| -#include "src/inspector/protocol/Protocol.h" | 
| - | 
| -#include "include/v8-profiler.h" | 
| - | 
| -#include <vector> | 
| - | 
| -namespace v8_inspector { | 
| - | 
| -namespace ProfilerAgentState { | 
| -static const char samplingInterval[] = "samplingInterval"; | 
| -static const char userInitiatedProfiling[] = "userInitiatedProfiling"; | 
| -static const char profilerEnabled[] = "profilerEnabled"; | 
| -} | 
| - | 
| -namespace { | 
| - | 
| -std::unique_ptr<protocol::Array<protocol::Profiler::PositionTickInfo>> | 
| -buildInspectorObjectForPositionTicks(const v8::CpuProfileNode* node) { | 
| -  unsigned lineCount = node->GetHitLineCount(); | 
| -  if (!lineCount) return nullptr; | 
| -  auto array = protocol::Array<protocol::Profiler::PositionTickInfo>::create(); | 
| -  std::vector<v8::CpuProfileNode::LineTick> entries(lineCount); | 
| -  if (node->GetLineTicks(&entries[0], lineCount)) { | 
| -    for (unsigned i = 0; i < lineCount; i++) { | 
| -      std::unique_ptr<protocol::Profiler::PositionTickInfo> line = | 
| -          protocol::Profiler::PositionTickInfo::create() | 
| -              .setLine(entries[i].line) | 
| -              .setTicks(entries[i].hit_count) | 
| -              .build(); | 
| -      array->addItem(std::move(line)); | 
| -    } | 
| -  } | 
| -  return array; | 
| -} | 
| - | 
| -std::unique_ptr<protocol::Profiler::ProfileNode> buildInspectorObjectFor( | 
| -    v8::Isolate* isolate, const v8::CpuProfileNode* node) { | 
| -  v8::HandleScope handleScope(isolate); | 
| -  auto callFrame = | 
| -      protocol::Runtime::CallFrame::create() | 
| -          .setFunctionName(toProtocolString(node->GetFunctionName())) | 
| -          .setScriptId(String16::fromInteger(node->GetScriptId())) | 
| -          .setUrl(toProtocolString(node->GetScriptResourceName())) | 
| -          .setLineNumber(node->GetLineNumber() - 1) | 
| -          .setColumnNumber(node->GetColumnNumber() - 1) | 
| -          .build(); | 
| -  auto result = protocol::Profiler::ProfileNode::create() | 
| -                    .setCallFrame(std::move(callFrame)) | 
| -                    .setHitCount(node->GetHitCount()) | 
| -                    .setId(node->GetNodeId()) | 
| -                    .build(); | 
| - | 
| -  const int childrenCount = node->GetChildrenCount(); | 
| -  if (childrenCount) { | 
| -    auto children = protocol::Array<int>::create(); | 
| -    for (int i = 0; i < childrenCount; i++) | 
| -      children->addItem(node->GetChild(i)->GetNodeId()); | 
| -    result->setChildren(std::move(children)); | 
| -  } | 
| - | 
| -  const char* deoptReason = node->GetBailoutReason(); | 
| -  if (deoptReason && deoptReason[0] && strcmp(deoptReason, "no reason")) | 
| -    result->setDeoptReason(deoptReason); | 
| - | 
| -  auto positionTicks = buildInspectorObjectForPositionTicks(node); | 
| -  if (positionTicks) result->setPositionTicks(std::move(positionTicks)); | 
| - | 
| -  return result; | 
| -} | 
| - | 
| -std::unique_ptr<protocol::Array<int>> buildInspectorObjectForSamples( | 
| -    v8::CpuProfile* v8profile) { | 
| -  auto array = protocol::Array<int>::create(); | 
| -  int count = v8profile->GetSamplesCount(); | 
| -  for (int i = 0; i < count; i++) | 
| -    array->addItem(v8profile->GetSample(i)->GetNodeId()); | 
| -  return array; | 
| -} | 
| - | 
| -std::unique_ptr<protocol::Array<int>> buildInspectorObjectForTimestamps( | 
| -    v8::CpuProfile* v8profile) { | 
| -  auto array = protocol::Array<int>::create(); | 
| -  int count = v8profile->GetSamplesCount(); | 
| -  uint64_t lastTime = v8profile->GetStartTime(); | 
| -  for (int i = 0; i < count; i++) { | 
| -    uint64_t ts = v8profile->GetSampleTimestamp(i); | 
| -    array->addItem(static_cast<int>(ts - lastTime)); | 
| -    lastTime = ts; | 
| -  } | 
| -  return array; | 
| -} | 
| - | 
| -void flattenNodesTree(v8::Isolate* isolate, const v8::CpuProfileNode* node, | 
| -                      protocol::Array<protocol::Profiler::ProfileNode>* list) { | 
| -  list->addItem(buildInspectorObjectFor(isolate, node)); | 
| -  const int childrenCount = node->GetChildrenCount(); | 
| -  for (int i = 0; i < childrenCount; i++) | 
| -    flattenNodesTree(isolate, node->GetChild(i), list); | 
| -} | 
| - | 
| -std::unique_ptr<protocol::Profiler::Profile> createCPUProfile( | 
| -    v8::Isolate* isolate, v8::CpuProfile* v8profile) { | 
| -  auto nodes = protocol::Array<protocol::Profiler::ProfileNode>::create(); | 
| -  flattenNodesTree(isolate, v8profile->GetTopDownRoot(), nodes.get()); | 
| -  return protocol::Profiler::Profile::create() | 
| -      .setNodes(std::move(nodes)) | 
| -      .setStartTime(static_cast<double>(v8profile->GetStartTime())) | 
| -      .setEndTime(static_cast<double>(v8profile->GetEndTime())) | 
| -      .setSamples(buildInspectorObjectForSamples(v8profile)) | 
| -      .setTimeDeltas(buildInspectorObjectForTimestamps(v8profile)) | 
| -      .build(); | 
| -} | 
| - | 
| -std::unique_ptr<protocol::Debugger::Location> currentDebugLocation( | 
| -    V8InspectorImpl* inspector) { | 
| -  std::unique_ptr<V8StackTraceImpl> callStack = | 
| -      inspector->debugger()->captureStackTrace(false /* fullStack */); | 
| -  auto location = protocol::Debugger::Location::create() | 
| -                      .setScriptId(toString16(callStack->topScriptId())) | 
| -                      .setLineNumber(callStack->topLineNumber()) | 
| -                      .build(); | 
| -  location->setColumnNumber(callStack->topColumnNumber()); | 
| -  return location; | 
| -} | 
| - | 
| -volatile int s_lastProfileId = 0; | 
| - | 
| -}  // namespace | 
| - | 
| -class V8ProfilerAgentImpl::ProfileDescriptor { | 
| - public: | 
| -  ProfileDescriptor(const String16& id, const String16& title) | 
| -      : m_id(id), m_title(title) {} | 
| -  String16 m_id; | 
| -  String16 m_title; | 
| -}; | 
| - | 
| -V8ProfilerAgentImpl::V8ProfilerAgentImpl( | 
| -    V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, | 
| -    protocol::DictionaryValue* state) | 
| -    : m_session(session), | 
| -      m_isolate(m_session->inspector()->isolate()), | 
| -      m_profiler(nullptr), | 
| -      m_state(state), | 
| -      m_frontend(frontendChannel), | 
| -      m_enabled(false), | 
| -      m_recordingCPUProfile(false) {} | 
| - | 
| -V8ProfilerAgentImpl::~V8ProfilerAgentImpl() { | 
| -  if (m_profiler) m_profiler->Dispose(); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::consoleProfile(const String16& title) { | 
| -  if (!m_enabled) return; | 
| -  String16 id = nextProfileId(); | 
| -  m_startedProfiles.push_back(ProfileDescriptor(id, title)); | 
| -  startProfiling(id); | 
| -  m_frontend.consoleProfileStarted( | 
| -      id, currentDebugLocation(m_session->inspector()), title); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::consoleProfileEnd(const String16& title) { | 
| -  if (!m_enabled) return; | 
| -  String16 id; | 
| -  String16 resolvedTitle; | 
| -  // Take last started profile if no title was passed. | 
| -  if (title.isEmpty()) { | 
| -    if (m_startedProfiles.empty()) return; | 
| -    id = m_startedProfiles.back().m_id; | 
| -    resolvedTitle = m_startedProfiles.back().m_title; | 
| -    m_startedProfiles.pop_back(); | 
| -  } else { | 
| -    for (size_t i = 0; i < m_startedProfiles.size(); i++) { | 
| -      if (m_startedProfiles[i].m_title == title) { | 
| -        resolvedTitle = title; | 
| -        id = m_startedProfiles[i].m_id; | 
| -        m_startedProfiles.erase(m_startedProfiles.begin() + i); | 
| -        break; | 
| -      } | 
| -    } | 
| -    if (id.isEmpty()) return; | 
| -  } | 
| -  std::unique_ptr<protocol::Profiler::Profile> profile = | 
| -      stopProfiling(id, true); | 
| -  if (!profile) return; | 
| -  std::unique_ptr<protocol::Debugger::Location> location = | 
| -      currentDebugLocation(m_session->inspector()); | 
| -  m_frontend.consoleProfileFinished(id, std::move(location), std::move(profile), | 
| -                                    resolvedTitle); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::enable(ErrorString*) { | 
| -  if (m_enabled) return; | 
| -  m_enabled = true; | 
| -  DCHECK(!m_profiler); | 
| -  m_profiler = v8::CpuProfiler::New(m_isolate); | 
| -  m_state->setBoolean(ProfilerAgentState::profilerEnabled, true); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::disable(ErrorString* errorString) { | 
| -  if (!m_enabled) return; | 
| -  for (size_t i = m_startedProfiles.size(); i > 0; --i) | 
| -    stopProfiling(m_startedProfiles[i - 1].m_id, false); | 
| -  m_startedProfiles.clear(); | 
| -  stop(nullptr, nullptr); | 
| -  m_profiler->Dispose(); | 
| -  m_profiler = nullptr; | 
| -  m_enabled = false; | 
| -  m_state->setBoolean(ProfilerAgentState::profilerEnabled, false); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::setSamplingInterval(ErrorString* error, | 
| -                                              int interval) { | 
| -  if (m_recordingCPUProfile) { | 
| -    *error = "Cannot change sampling interval when profiling."; | 
| -    return; | 
| -  } | 
| -  m_state->setInteger(ProfilerAgentState::samplingInterval, interval); | 
| -  m_profiler->SetSamplingInterval(interval); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::restore() { | 
| -  DCHECK(!m_enabled); | 
| -  if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) | 
| -    return; | 
| -  m_enabled = true; | 
| -  DCHECK(!m_profiler); | 
| -  m_profiler = v8::CpuProfiler::New(m_isolate); | 
| -  int interval = 0; | 
| -  m_state->getInteger(ProfilerAgentState::samplingInterval, &interval); | 
| -  if (interval) m_profiler->SetSamplingInterval(interval); | 
| -  if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, | 
| -                               false)) { | 
| -    ErrorString error; | 
| -    start(&error); | 
| -  } | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::start(ErrorString* error) { | 
| -  if (m_recordingCPUProfile) return; | 
| -  if (!m_enabled) { | 
| -    *error = "Profiler is not enabled"; | 
| -    return; | 
| -  } | 
| -  m_recordingCPUProfile = true; | 
| -  m_frontendInitiatedProfileId = nextProfileId(); | 
| -  startProfiling(m_frontendInitiatedProfileId); | 
| -  m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::stop( | 
| -    ErrorString* errorString, | 
| -    std::unique_ptr<protocol::Profiler::Profile>* profile) { | 
| -  if (!m_recordingCPUProfile) { | 
| -    if (errorString) *errorString = "No recording profiles found"; | 
| -    return; | 
| -  } | 
| -  m_recordingCPUProfile = false; | 
| -  std::unique_ptr<protocol::Profiler::Profile> cpuProfile = | 
| -      stopProfiling(m_frontendInitiatedProfileId, !!profile); | 
| -  if (profile) { | 
| -    *profile = std::move(cpuProfile); | 
| -    if (!profile->get() && errorString) *errorString = "Profile is not found"; | 
| -  } | 
| -  m_frontendInitiatedProfileId = String16(); | 
| -  m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false); | 
| -} | 
| - | 
| -String16 V8ProfilerAgentImpl::nextProfileId() { | 
| -  return String16::fromInteger( | 
| -      v8::base::NoBarrier_AtomicIncrement(&s_lastProfileId, 1)); | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::startProfiling(const String16& title) { | 
| -  v8::HandleScope handleScope(m_isolate); | 
| -  m_profiler->StartProfiling(toV8String(m_isolate, title), true); | 
| -} | 
| - | 
| -std::unique_ptr<protocol::Profiler::Profile> V8ProfilerAgentImpl::stopProfiling( | 
| -    const String16& title, bool serialize) { | 
| -  v8::HandleScope handleScope(m_isolate); | 
| -  v8::CpuProfile* profile = | 
| -      m_profiler->StopProfiling(toV8String(m_isolate, title)); | 
| -  if (!profile) return nullptr; | 
| -  std::unique_ptr<protocol::Profiler::Profile> result; | 
| -  if (serialize) result = createCPUProfile(m_isolate, profile); | 
| -  profile->Delete(); | 
| -  return result; | 
| -} | 
| - | 
| -bool V8ProfilerAgentImpl::isRecording() const { | 
| -  return m_recordingCPUProfile || !m_startedProfiles.empty(); | 
| -} | 
| - | 
| -bool V8ProfilerAgentImpl::idleStarted() { | 
| -  if (m_profiler) m_profiler->SetIdle(true); | 
| -  return m_profiler; | 
| -} | 
| - | 
| -bool V8ProfilerAgentImpl::idleFinished() { | 
| -  if (m_profiler) m_profiler->SetIdle(false); | 
| -  return m_profiler; | 
| -} | 
| - | 
| -void V8ProfilerAgentImpl::collectSample() { | 
| -  if (m_profiler) m_profiler->CollectSample(); | 
| -} | 
| - | 
| -}  // namespace v8_inspector | 
|  |