| Index: src/inspector/v8-heap-profiler-agent-impl.cc
|
| diff --git a/src/inspector/v8-heap-profiler-agent-impl.cc b/src/inspector/v8-heap-profiler-agent-impl.cc
|
| index 84c890bf3f72bf0c6f3937dc504b76f490a1180e..41b24ac949d591653f76db85e420271a9b4ca742 100644
|
| --- a/src/inspector/v8-heap-profiler-agent-impl.cc
|
| +++ b/src/inspector/v8-heap-profiler-agent-impl.cc
|
| @@ -164,39 +164,42 @@ void V8HeapProfilerAgentImpl::restore() {
|
| HeapProfilerAgentState::allocationTrackingEnabled, false));
|
| if (m_state->booleanProperty(
|
| HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) {
|
| - ErrorString error;
|
| double samplingInterval = m_state->doubleProperty(
|
| HeapProfilerAgentState::samplingHeapProfilerInterval, -1);
|
| DCHECK_GE(samplingInterval, 0);
|
| - startSampling(&error, Maybe<double>(samplingInterval));
|
| + startSampling(Maybe<double>(samplingInterval));
|
| }
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::collectGarbage(ErrorString*) {
|
| +Response V8HeapProfilerAgentImpl::collectGarbage() {
|
| m_isolate->LowMemoryNotification();
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::startTrackingHeapObjects(
|
| - ErrorString*, const protocol::Maybe<bool>& trackAllocations) {
|
| +Response V8HeapProfilerAgentImpl::startTrackingHeapObjects(
|
| + Maybe<bool> trackAllocations) {
|
| m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, true);
|
| bool allocationTrackingEnabled = trackAllocations.fromMaybe(false);
|
| m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled,
|
| allocationTrackingEnabled);
|
| startTrackingHeapObjectsInternal(allocationTrackingEnabled);
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::stopTrackingHeapObjects(
|
| - ErrorString* error, const protocol::Maybe<bool>& reportProgress) {
|
| +Response V8HeapProfilerAgentImpl::stopTrackingHeapObjects(
|
| + Maybe<bool> reportProgress) {
|
| requestHeapStatsUpdate();
|
| - takeHeapSnapshot(error, reportProgress);
|
| + takeHeapSnapshot(std::move(reportProgress));
|
| stopTrackingHeapObjectsInternal();
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::enable(ErrorString*) {
|
| +Response V8HeapProfilerAgentImpl::enable() {
|
| m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, true);
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::disable(ErrorString* error) {
|
| +Response V8HeapProfilerAgentImpl::disable() {
|
| stopTrackingHeapObjectsInternal();
|
| if (m_state->booleanProperty(
|
| HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) {
|
| @@ -205,15 +208,12 @@ void V8HeapProfilerAgentImpl::disable(ErrorString* error) {
|
| }
|
| m_isolate->GetHeapProfiler()->ClearObjectIds();
|
| m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, false);
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::takeHeapSnapshot(
|
| - ErrorString* errorString, const protocol::Maybe<bool>& reportProgress) {
|
| +Response V8HeapProfilerAgentImpl::takeHeapSnapshot(Maybe<bool> reportProgress) {
|
| v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler();
|
| - if (!profiler) {
|
| - *errorString = "Cannot access v8 heap profiler";
|
| - return;
|
| - }
|
| + if (!profiler) return Response::Error("Cannot access v8 heap profiler");
|
| std::unique_ptr<HeapSnapshotProgress> progress;
|
| if (reportProgress.fromMaybe(false))
|
| progress = wrapUnique(new HeapSnapshotProgress(&m_frontend));
|
| @@ -221,80 +221,63 @@ void V8HeapProfilerAgentImpl::takeHeapSnapshot(
|
| GlobalObjectNameResolver resolver(m_session);
|
| const v8::HeapSnapshot* snapshot =
|
| profiler->TakeHeapSnapshot(progress.get(), &resolver);
|
| - if (!snapshot) {
|
| - *errorString = "Failed to take heap snapshot";
|
| - return;
|
| - }
|
| + if (!snapshot) return Response::Error("Failed to take heap snapshot");
|
| HeapSnapshotOutputStream stream(&m_frontend);
|
| snapshot->Serialize(&stream);
|
| const_cast<v8::HeapSnapshot*>(snapshot)->Delete();
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::getObjectByHeapObjectId(
|
| - ErrorString* error, const String16& heapSnapshotObjectId,
|
| - const protocol::Maybe<String16>& objectGroup,
|
| +Response V8HeapProfilerAgentImpl::getObjectByHeapObjectId(
|
| + const String16& heapSnapshotObjectId, Maybe<String16> objectGroup,
|
| std::unique_ptr<protocol::Runtime::RemoteObject>* result) {
|
| bool ok;
|
| int id = heapSnapshotObjectId.toInteger(&ok);
|
| - if (!ok) {
|
| - *error = "Invalid heap snapshot object id";
|
| - return;
|
| - }
|
| + if (!ok) return Response::Error("Invalid heap snapshot object id");
|
|
|
| v8::HandleScope handles(m_isolate);
|
| v8::Local<v8::Object> heapObject = objectByHeapObjectId(m_isolate, id);
|
| - if (heapObject.IsEmpty()) {
|
| - *error = "Object is not available";
|
| - return;
|
| - }
|
| + if (heapObject.IsEmpty()) return Response::Error("Object is not available");
|
|
|
| - if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) {
|
| - *error = "Object is not available";
|
| - return;
|
| - }
|
| + if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject))
|
| + return Response::Error("Object is not available");
|
|
|
| *result = m_session->wrapObject(heapObject->CreationContext(), heapObject,
|
| objectGroup.fromMaybe(""), false);
|
| - if (!result) *error = "Object is not available";
|
| + if (!result) return Response::Error("Object is not available");
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::addInspectedHeapObject(
|
| - ErrorString* errorString, const String16& inspectedHeapObjectId) {
|
| +Response V8HeapProfilerAgentImpl::addInspectedHeapObject(
|
| + const String16& inspectedHeapObjectId) {
|
| bool ok;
|
| int id = inspectedHeapObjectId.toInteger(&ok);
|
| - if (!ok) {
|
| - *errorString = "Invalid heap snapshot object id";
|
| - return;
|
| - }
|
| + if (!ok) return Response::Error("Invalid heap snapshot object id");
|
|
|
| v8::HandleScope handles(m_isolate);
|
| v8::Local<v8::Object> heapObject = objectByHeapObjectId(m_isolate, id);
|
| - if (heapObject.IsEmpty()) {
|
| - *errorString = "Object is not available";
|
| - return;
|
| - }
|
| -
|
| - if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) {
|
| - *errorString = "Object is not available";
|
| - return;
|
| - }
|
| + if (heapObject.IsEmpty()) return Response::Error("Object is not available");
|
|
|
| + if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject))
|
| + return Response::Error("Object is not available");
|
| m_session->addInspectedObject(wrapUnique(new InspectableHeapObject(id)));
|
| + return Response::OK();
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::getHeapObjectId(ErrorString* errorString,
|
| - const String16& objectId,
|
| - String16* heapSnapshotObjectId) {
|
| +Response V8HeapProfilerAgentImpl::getHeapObjectId(
|
| + const String16& objectId, String16* heapSnapshotObjectId) {
|
| v8::HandleScope handles(m_isolate);
|
| v8::Local<v8::Value> value;
|
| v8::Local<v8::Context> context;
|
| - if (!m_session->unwrapObject(errorString, objectId, &value, &context,
|
| + protocol::ErrorString errorString;
|
| + if (!m_session->unwrapObject(&errorString, objectId, &value, &context,
|
| nullptr) ||
|
| value->IsUndefined())
|
| - return;
|
| + return Response::Error(errorString);
|
|
|
| v8::SnapshotObjectId id = m_isolate->GetHeapProfiler()->GetObjectId(value);
|
| *heapSnapshotObjectId = String16::fromInteger(static_cast<size_t>(id));
|
| + return Response::OK();
|
| }
|
|
|
| void V8HeapProfilerAgentImpl::requestHeapStatsUpdate() {
|
| @@ -332,13 +315,10 @@ void V8HeapProfilerAgentImpl::stopTrackingHeapObjectsInternal() {
|
| m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, false);
|
| }
|
|
|
| -void V8HeapProfilerAgentImpl::startSampling(
|
| - ErrorString* errorString, const Maybe<double>& samplingInterval) {
|
| +Response V8HeapProfilerAgentImpl::startSampling(
|
| + Maybe<double> samplingInterval) {
|
| v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler();
|
| - if (!profiler) {
|
| - *errorString = "Cannot access v8 heap profiler";
|
| - return;
|
| - }
|
| + if (!profiler) return Response::Error("Cannot access v8 heap profiler");
|
| const unsigned defaultSamplingInterval = 1 << 15;
|
| double samplingIntervalValue =
|
| samplingInterval.fromMaybe(defaultSamplingInterval);
|
| @@ -349,6 +329,7 @@ void V8HeapProfilerAgentImpl::startSampling(
|
| profiler->StartSamplingHeapProfiler(
|
| static_cast<uint64_t>(samplingIntervalValue), 128,
|
| v8::HeapProfiler::kSamplingForceGC);
|
| + return Response::OK();
|
| }
|
|
|
| namespace {
|
| @@ -379,14 +360,10 @@ buildSampingHeapProfileNode(const v8::AllocationProfile::Node* node) {
|
| }
|
| } // namespace
|
|
|
| -void V8HeapProfilerAgentImpl::stopSampling(
|
| - ErrorString* errorString,
|
| +Response V8HeapProfilerAgentImpl::stopSampling(
|
| std::unique_ptr<protocol::HeapProfiler::SamplingHeapProfile>* profile) {
|
| v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler();
|
| - if (!profiler) {
|
| - *errorString = "Cannot access v8 heap profiler";
|
| - return;
|
| - }
|
| + if (!profiler) return Response::Error("Cannot access v8 heap profiler");
|
| v8::HandleScope scope(
|
| m_isolate); // Allocation profile contains Local handles.
|
| std::unique_ptr<v8::AllocationProfile> v8Profile(
|
| @@ -394,14 +371,13 @@ void V8HeapProfilerAgentImpl::stopSampling(
|
| profiler->StopSamplingHeapProfiler();
|
| m_state->setBoolean(HeapProfilerAgentState::samplingHeapProfilerEnabled,
|
| false);
|
| - if (!v8Profile) {
|
| - *errorString = "Cannot access v8 sampled heap profile.";
|
| - return;
|
| - }
|
| + if (!v8Profile)
|
| + return Response::Error("Cannot access v8 sampled heap profile.");
|
| v8::AllocationProfile::Node* root = v8Profile->GetRootNode();
|
| *profile = protocol::HeapProfiler::SamplingHeapProfile::create()
|
| .setHead(buildSampingHeapProfileNode(root))
|
| .build();
|
| + return Response::OK();
|
| }
|
|
|
| } // namespace v8_inspector
|
|
|