blob: 62cd5dadb94ca030db1a4eb2709a0bca855ee8bd [file] [log] [blame]
// Copyright 2019 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/heap/memory-measurement.h"
#include "src/execution/isolate-inl.h"
#include "src/execution/isolate.h"
#include "src/heap/factory-inl.h"
#include "src/heap/factory.h"
#include "src/objects/js-promise.h"
namespace v8 {
namespace internal {
MemoryMeasurement::MemoryMeasurement(Isolate* isolate) : isolate_(isolate) {}
namespace {
class MemoryMeasurementResultBuilder {
public:
MemoryMeasurementResultBuilder(Isolate* isolate, Factory* factory)
: isolate_(isolate), factory_(factory) {
result_ = NewJSObject();
}
void AddTotals(size_t estimate, size_t lower_bound, size_t upper_bound) {
Handle<JSObject> total = NewJSObject();
Handle<Object> estimate_obj = NewNumber(estimate);
AddProperty(total, factory_->jsMemoryEstimate_string(), estimate_obj);
Handle<Object> range = NewRange(lower_bound, upper_bound);
AddProperty(total, factory_->jsMemoryRange_string(), range);
AddProperty(result_, factory_->total_string(), total);
}
Handle<JSObject> Build() { return result_; }
private:
Handle<Object> NewNumber(size_t value) {
return factory_->NewNumberFromSize(value);
}
Handle<JSObject> NewJSObject() {
return factory_->NewJSObject(isolate_->object_function());
}
Handle<JSArray> NewRange(size_t lower_bound, size_t upper_bound) {
Handle<Object> lower = NewNumber(lower_bound);
Handle<Object> upper = NewNumber(upper_bound);
Handle<FixedArray> elements = factory_->NewFixedArray(2);
elements->set(0, *lower);
elements->set(1, *upper);
return factory_->NewJSArrayWithElements(elements);
}
void AddProperty(Handle<JSObject> object, Handle<String> name,
Handle<Object> value) {
JSObject::AddProperty(isolate_, object, name, value, NONE);
}
Isolate* isolate_;
Factory* factory_;
Handle<JSObject> result_;
};
} // anonymous namespace
Handle<JSPromise> MemoryMeasurement::EnqueueRequest(
Handle<NativeContext> context, v8::MeasureMemoryMode mode) {
Handle<JSPromise> promise = isolate_->factory()->NewJSPromise();
MemoryMeasurementResultBuilder result_builder(isolate_, isolate_->factory());
result_builder.AddTotals(isolate_->heap()->SizeOfObjects(), 0,
isolate_->heap()->SizeOfObjects());
Handle<JSObject> result = result_builder.Build();
JSPromise::Resolve(promise, result).ToHandleChecked();
return promise;
}
} // namespace internal
} // namespace v8