Commit b9535429 authored by legendecas's avatar legendecas Committed by V8 LUCI CQ

[extensions] Fix dcheck failures in getV8Statistics

HeapObjectIterator creates a SafepointScope which requires the heap to
allow garbage collection. This collides with the outer
DisallowGarbageCollection scope. HeapObjectIterator already ensures
there is no allocation during its lifetime, so there is no need to
create an outer DisallowGarbageCollection scope.

Code::source_position_table requires their kind not equals to
CodeKind::BASELINE.

This also exposes the statistics extension through flag
--expose-statistics.

Bug: v8:12657
Change-Id: I1bf11cf499285a742dd99ec8c228ebc36152b597
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3496552Reviewed-by: 's avatarCamillo Bruni <cbruni@chromium.org>
Reviewed-by: 's avatarMarja Hölttä <marja@chromium.org>
Commit-Queue: Chengzhong Wu <legendecas@gmail.com>
Cr-Commit-Position: refs/heads/main@{#79425}
parent 9b810b9f
......@@ -125,36 +125,41 @@ void StatisticsExtension::GetCounters(
AddNumber64(args.GetIsolate(), result, heap->external_memory(),
"amount_of_external_allocated_memory");
args.GetReturnValue().Set(result);
DisallowGarbageCollection no_gc;
HeapObjectIterator iterator(
reinterpret_cast<Isolate*>(args.GetIsolate())->heap());
int reloc_info_total = 0;
int source_position_table_total = 0;
for (HeapObject obj = iterator.Next(); !obj.is_null();
obj = iterator.Next()) {
Object maybe_source_positions;
if (obj.IsCode()) {
Code code = Code::cast(obj);
reloc_info_total += code.relocation_info().Size();
maybe_source_positions = code.source_position_table();
} else if (obj.IsBytecodeArray()) {
maybe_source_positions =
BytecodeArray::cast(obj).source_position_table(kAcquireLoad);
} else {
continue;
{
HeapObjectIterator iterator(
reinterpret_cast<Isolate*>(args.GetIsolate())->heap());
DCHECK(!AllowGarbageCollection::IsAllowed());
for (HeapObject obj = iterator.Next(); !obj.is_null();
obj = iterator.Next()) {
Object maybe_source_positions;
if (obj.IsCode()) {
Code code = Code::cast(obj);
reloc_info_total += code.relocation_info().Size();
// Baseline code doesn't have source positions since it uses
// interpreter code positions.
if (code.kind() == CodeKind::BASELINE) continue;
maybe_source_positions = code.source_position_table();
} else if (obj.IsBytecodeArray()) {
maybe_source_positions =
BytecodeArray::cast(obj).source_position_table(kAcquireLoad);
} else {
continue;
}
if (!maybe_source_positions.IsByteArray()) continue;
ByteArray source_positions = ByteArray::cast(maybe_source_positions);
if (source_positions.length() == 0) continue;
source_position_table_total += source_positions.Size();
}
if (!maybe_source_positions.IsByteArray()) continue;
ByteArray source_positions = ByteArray::cast(maybe_source_positions);
if (source_positions.length() == 0) continue;
source_position_table_total += source_positions.Size();
}
AddNumber(args.GetIsolate(), result, reloc_info_total,
"reloc_info_total_size");
AddNumber(args.GetIsolate(), result, source_position_table_total,
"source_position_table_total_size");
args.GetReturnValue().Set(result);
}
} // namespace internal
......
......@@ -1502,6 +1502,7 @@ DEFINE_STRING(expose_gc_as, nullptr,
DEFINE_IMPLICATION(expose_gc_as, expose_gc)
DEFINE_BOOL(expose_externalize_string, false,
"expose externalize string extension")
DEFINE_BOOL(expose_statistics, false, "expose statistics extension")
DEFINE_BOOL(expose_trigger_failure, false, "expose trigger-failure extension")
DEFINE_BOOL(expose_ignition_statistics, false,
"expose ignition-statistics extension (requires building with "
......
......@@ -5866,7 +5866,7 @@ bool Genesis::InstallExtensions(Isolate* isolate,
InstallExtension(isolate, "v8/gc", &extension_states)) &&
(!FLAG_expose_externalize_string ||
InstallExtension(isolate, "v8/externalize", &extension_states)) &&
(!TracingFlags::is_gc_stats_enabled() ||
(!(FLAG_expose_statistics || TracingFlags::is_gc_stats_enabled()) ||
InstallExtension(isolate, "v8/statistics", &extension_states)) &&
(!FLAG_expose_trigger_failure ||
InstallExtension(isolate, "v8/trigger-failure", &extension_states)) &&
......
// Copyright 2022 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.
// Flags: --expose-statistics
assertEquals(typeof getV8Statistics, 'function');
var result = getV8Statistics();
assertEquals(typeof result, 'object');
for (let key of Object.keys(result)) {
assertEquals(typeof result[key], 'number');
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment