diff --git a/common.gypi b/common.gypi index d68a4c9eafacfa..4e9c78827e6414 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.22', + 'v8_embedder_string': '-node.23', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/extensions/statistics-extension.cc b/deps/v8/src/extensions/statistics-extension.cc index 1911dfc39e82a4..3a1f2785875821 100644 --- a/deps/v8/src/extensions/statistics-extension.cc +++ b/deps/v8/src/extensions/statistics-extension.cc @@ -124,36 +124,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(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(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 diff --git a/deps/v8/src/flags/flag-definitions.h b/deps/v8/src/flags/flag-definitions.h index d8e1dd6b9c133a..2b865da812be50 100644 --- a/deps/v8/src/flags/flag-definitions.h +++ b/deps/v8/src/flags/flag-definitions.h @@ -1390,6 +1390,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 " diff --git a/deps/v8/src/init/bootstrapper.cc b/deps/v8/src/init/bootstrapper.cc index 326944e13e9020..7b868f9e9bacca 100644 --- a/deps/v8/src/init/bootstrapper.cc +++ b/deps/v8/src/init/bootstrapper.cc @@ -5089,7 +5089,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)) && diff --git a/deps/v8/test/mjsunit/statistics-extension.js b/deps/v8/test/mjsunit/statistics-extension.js new file mode 100644 index 00000000000000..b6573736bbab2e --- /dev/null +++ b/deps/v8/test/mjsunit/statistics-extension.js @@ -0,0 +1,12 @@ +// 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'); +}