[heap] Enable conservative stack scanning on tests

Since its introduction (behind a compile-time flag), conservative stack
scanning was disabled by default on tests. This CL inverts this logic,
enabling CSS by default for all tests that do not define an explicit
scope to disable it.

Bug: v8:13257
Change-Id: I5ea4249d02f69b0b1e195415c2562daf5d8c0ea9
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4100912
Reviewed-by: Dominik Inführ <dinfuehr@chromium.org>
Commit-Queue: Nikolaos Papaspyrou <nikolaos@chromium.org>
Cr-Commit-Position: refs/heads/main@{#84848}
This commit is contained in:
Nikolaos Papaspyrou 2022-12-13 19:25:02 +01:00 committed by V8 LUCI CQ
parent 444fefb520
commit f81430caa9
25 changed files with 174 additions and 96 deletions

View File

@ -197,50 +197,30 @@ void CcTest::AddGlobalFunction(v8::Local<v8::Context> env, const char* name,
env->Global()->Set(env, v8_str(name), func).FromJust();
}
void CcTest::CollectGarbage(i::AllocationSpace space, i::Isolate* isolate,
v8::StackState stack_state) {
void CcTest::CollectGarbage(i::AllocationSpace space, i::Isolate* isolate) {
i::Isolate* iso = isolate ? isolate : i_isolate();
v8::base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == v8::StackState::kNoHeapPointers)
scope.emplace(iso->heap());
iso->heap()->CollectGarbage(space, i::GarbageCollectionReason::kTesting);
}
void CcTest::CollectAllGarbage(i::Isolate* isolate,
v8::StackState stack_state) {
void CcTest::CollectAllGarbage(i::Isolate* isolate) {
i::Isolate* iso = isolate ? isolate : i_isolate();
v8::base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == v8::StackState::kNoHeapPointers)
scope.emplace(iso->heap());
iso->heap()->CollectAllGarbage(i::Heap::kNoGCFlags,
i::GarbageCollectionReason::kTesting);
}
void CcTest::CollectAllAvailableGarbage(i::Isolate* isolate,
v8::StackState stack_state) {
void CcTest::CollectAllAvailableGarbage(i::Isolate* isolate) {
i::Isolate* iso = isolate ? isolate : i_isolate();
v8::base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == v8::StackState::kNoHeapPointers)
scope.emplace(iso->heap());
iso->heap()->CollectAllAvailableGarbage(i::GarbageCollectionReason::kTesting);
}
void CcTest::PreciseCollectAllGarbage(i::Isolate* isolate,
v8::StackState stack_state) {
void CcTest::PreciseCollectAllGarbage(i::Isolate* isolate) {
i::Isolate* iso = isolate ? isolate : i_isolate();
v8::base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == v8::StackState::kNoHeapPointers)
scope.emplace(iso->heap());
iso->heap()->PreciseCollectAllGarbage(i::Heap::kNoGCFlags,
i::GarbageCollectionReason::kTesting);
}
void CcTest::CollectSharedGarbage(i::Isolate* isolate,
v8::StackState stack_state) {
void CcTest::CollectSharedGarbage(i::Isolate* isolate) {
i::Isolate* iso = isolate ? isolate : i_isolate();
v8::base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == v8::StackState::kNoHeapPointers)
scope.emplace(iso->heap());
iso->heap()->CollectGarbageShared(iso->main_thread_local_heap(),
i::GarbageCollectionReason::kTesting);
}

View File

@ -170,22 +170,12 @@ class CcTest {
static void AddGlobalFunction(v8::Local<v8::Context> env, const char* name,
v8::FunctionCallback callback);
// By default, the GC methods do not scan the stack conservatively.
static void CollectGarbage(
i::AllocationSpace space, i::Isolate* isolate = nullptr,
v8::StackState stack_state = v8::StackState::kNoHeapPointers);
static void CollectAllGarbage(
i::Isolate* isolate = nullptr,
v8::StackState stack_state = v8::StackState::kNoHeapPointers);
static void CollectAllAvailableGarbage(
i::Isolate* isolate = nullptr,
v8::StackState stack_state = v8::StackState::kNoHeapPointers);
static void PreciseCollectAllGarbage(
i::Isolate* isolate = nullptr,
v8::StackState stack_state = v8::StackState::kNoHeapPointers);
static void CollectSharedGarbage(
i::Isolate* isolate = nullptr,
v8::StackState stack_state = v8::StackState::kNoHeapPointers);
static void CollectGarbage(i::AllocationSpace space,
i::Isolate* isolate = nullptr);
static void CollectAllGarbage(i::Isolate* isolate = nullptr);
static void CollectAllAvailableGarbage(i::Isolate* isolate = nullptr);
static void PreciseCollectAllGarbage(i::Isolate* isolate = nullptr);
static void CollectSharedGarbage(i::Isolate* isolate = nullptr);
static i::Handle<i::String> MakeString(const char* str);
static i::Handle<i::String> MakeName(const char* str, int suffix);

View File

@ -292,7 +292,6 @@ void SimulateIncrementalMarking(i::Heap* heap, bool force_completion) {
// If minor incremental marking is running, we need to finalize it first
// because of the AdvanceForTesting call in this function which is currently
// only possible for MajorMC.
DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
heap->CollectGarbage(NEW_SPACE, GarbageCollectionReason::kFinalizeMinorMC);
}
@ -334,7 +333,6 @@ void AbandonCurrentlyFreeMemory(PagedSpace* space) {
}
void GcAndSweep(Heap* heap, AllocationSpace space) {
DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
heap->CollectGarbage(space, GarbageCollectionReason::kTesting);
if (heap->sweeping_in_progress()) {
IsolateSafepointScope scope(heap);

View File

@ -57,6 +57,8 @@ TEST(ArrayBuffer_OnlyMC) {
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();
Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
ArrayBufferExtension* extension;
{
@ -84,6 +86,8 @@ TEST(ArrayBuffer_OnlyScavenge) {
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();
Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
ArrayBufferExtension* extension;
{
@ -110,6 +114,8 @@ TEST(ArrayBuffer_ScavengeAndMC) {
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();
Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
ArrayBufferExtension* extension;
{
@ -217,6 +223,8 @@ TEST(ArrayBuffer_NonLivePromotion) {
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();
Heap* heap = reinterpret_cast<Isolate*>(isolate)->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
{
v8::HandleScope handle_scope(isolate);

View File

@ -144,8 +144,6 @@ UNINITIALIZED_TEST(ConcurrentAllocationWhileMainThreadIsParked) {
const int kThreads = 4;
{
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
ParkedScope scope(i_isolate->main_thread_local_isolate());
for (int i = 0; i < kThreads; i++) {
@ -177,9 +175,6 @@ UNINITIALIZED_TEST(ConcurrentAllocationWhileMainThreadParksAndUnparks) {
const int kThreads = 4;
{
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
for (int i = 0; i < kThreads; i++) {
auto thread =
std::make_unique<ConcurrentAllocationThread>(i_isolate->heap());
@ -217,9 +212,6 @@ UNINITIALIZED_TEST(ConcurrentAllocationWhileMainThreadRunsWithSafepoints) {
const int kThreads = 4;
{
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
for (int i = 0; i < kThreads; i++) {
auto thread =
std::make_unique<ConcurrentAllocationThread>(i_isolate->heap());

View File

@ -538,6 +538,8 @@ TEST(WeakGlobalHandlesMark) {
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
GlobalHandles* global_handles = isolate->global_handles();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
WeakPointerCleared = false;
@ -579,6 +581,8 @@ TEST(DeleteWeakGlobalHandle) {
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
GlobalHandles* global_handles = isolate->global_handles();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
WeakPointerCleared = false;
Handle<Object> h;
@ -1089,6 +1093,8 @@ TEST(TestBytecodeFlushing) {
v8::Isolate* isolate = CcTest::isolate();
Isolate* i_isolate = CcTest::i_isolate();
Factory* factory = i_isolate->factory();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
{
v8::HandleScope scope(isolate);
@ -1156,6 +1162,8 @@ static void TestMultiReferencedBytecodeFlushing(bool sparkplug_compile) {
v8::Isolate* isolate = CcTest::isolate();
Isolate* i_isolate = CcTest::i_isolate();
Factory* factory = i_isolate->factory();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
{
v8::HandleScope scope(isolate);
@ -1413,6 +1421,8 @@ TEST(TestOptimizeAfterBytecodeFlushingCandidate) {
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
v8::HandleScope outer_scope(CcTest::isolate());
const char* source =
"function foo() {"
@ -1538,6 +1548,8 @@ void CompilationCacheCachingBehavior(bool retain_script) {
Factory* factory = isolate->factory();
CompilationCache* compilation_cache = isolate->compilation_cache();
LanguageMode language_mode = LanguageMode::kSloppy;
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
v8::HandleScope outer_scope(CcTest::isolate());
const char* raw_source = retain_script ? "function foo() {"
@ -1644,6 +1656,8 @@ void CompilationCacheRegeneration(bool retain_root_sfi, bool flush_root_sfi,
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
const char* source =
"({"
@ -1878,6 +1892,8 @@ TEST(TestInternalWeakLists) {
HandleScope scope(isolate);
v8::Local<v8::Context> ctx[kNumTestContexts];
if (!isolate->use_optimizer()) return;
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
CHECK_EQ(0, CountNativeContexts());
@ -2017,6 +2033,8 @@ HEAP_TEST(TestSizeOfObjects) {
v8_flags.stress_concurrent_allocation = false;
Isolate* isolate = CcTest::i_isolate();
Heap* heap = CcTest::heap();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
// Disable LAB, such that calculations with SizeOfObjects() and object size
// are correct.
heap->DisableInlineAllocation();
@ -4129,6 +4147,8 @@ TEST(EnsureAllocationSiteDependentCodesProcessed) {
Isolate* isolate = CcTest::i_isolate();
v8::internal::Heap* heap = CcTest::heap();
GlobalHandles* global_handles = isolate->global_handles();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
if (!isolate->use_optimizer()) return;
@ -4340,6 +4360,8 @@ TEST(ObjectsInOptimizedCodeAreWeak) {
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
v8::internal::Heap* heap = CcTest::heap();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
if (!isolate->use_optimizer()) return;
HandleScope outer_scope(heap->isolate());
@ -4385,6 +4407,8 @@ TEST(NewSpaceObjectsInOptimizedCode) {
v8_flags.allow_natives_syntax = true;
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
if (!isolate->use_optimizer()) return;
HandleScope outer_scope(isolate);
@ -4448,6 +4472,8 @@ TEST(ObjectsInEagerlyDeoptimizedCodeAreWeak) {
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
v8::internal::Heap* heap = CcTest::heap();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
if (!isolate->use_optimizer()) return;
HandleScope outer_scope(heap->isolate());
@ -5148,6 +5174,8 @@ TEST(Regress3877) {
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
HandleScope scope(isolate);
CompileRun("function cls() { this.x = 10; }");
Handle<WeakFixedArray> weak_prototype_holder = factory->NewWeakFixedArray(1);
@ -5195,6 +5223,8 @@ void CheckMapRetainingFor(int n) {
v8_flags.retain_maps_for_n_gc = n;
Isolate* isolate = CcTest::i_isolate();
Heap* heap = isolate->heap();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
v8::Local<v8::Context> ctx = v8::Context::New(CcTest::isolate());
Handle<Context> context = Utils::OpenHandle(*ctx);
CHECK(context->IsNativeContext());

View File

@ -31,6 +31,8 @@ TEST(WeakReferencesBasic) {
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
HandleScope outer_scope(isolate);
Handle<LoadHandler> lh = CreateLoadHandlerForTest(factory);
@ -185,6 +187,7 @@ TEST(ObjectMovesBeforeClearingWeakField) {
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
HandleScope outer_scope(isolate);
Handle<LoadHandler> lh = CreateLoadHandlerForTest(factory);
@ -356,6 +359,7 @@ TEST(WeakArraysBasic) {
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
HandleScope outer_scope(isolate);
const int length = 4;
@ -427,6 +431,7 @@ TEST(WeakArrayListBasic) {
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
HandleScope outer_scope(isolate);
Handle<WeakArrayList> array(ReadOnlyRoots(heap).empty_weak_array_list(),
@ -723,6 +728,7 @@ TEST(PrototypeUsersCompacted) {
Isolate* isolate = CcTest::i_isolate();
Factory* factory = isolate->factory();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
HandleScope outer_scope(isolate);
Handle<WeakArrayList> array(ReadOnlyRoots(heap).empty_weak_array_list(),

View File

@ -531,6 +531,9 @@ class TestOneByteResource : public String::ExternalOneByteStringResource {
THREADED_TEST(ScriptUsingStringResource) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
int dispose_count = 0;
const char* c_source = "1 + 2 * 3";
uint16_t* two_byte_source = AsciiToTwoByteString(c_source);
@ -563,6 +566,9 @@ THREADED_TEST(ScriptUsingStringResource) {
THREADED_TEST(ScriptUsingOneByteStringResource) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
int dispose_count = 0;
const char* c_source = "1 + 2 * 3";
{
@ -596,6 +602,9 @@ THREADED_TEST(ScriptUsingOneByteStringResource) {
THREADED_TEST(ScriptMakingExternalString) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
int dispose_count = 0;
uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3");
{
@ -630,6 +639,9 @@ THREADED_TEST(ScriptMakingExternalString) {
THREADED_TEST(ScriptMakingExternalOneByteString) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
int dispose_count = 0;
const char* c_source = "1 + 2 * 3";
{
@ -752,8 +764,6 @@ TEST(MakingExternalUnalignedOneByteString) {
// Trigger GCs and force evacuation.
CcTest::CollectAllGarbage();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask,
i::GarbageCollectionReason::kTesting);
}
@ -855,6 +865,9 @@ TEST(ScavengeExternalString) {
ManualGCScope manual_gc_scope;
i::v8_flags.stress_compaction = false;
i::v8_flags.gc_global = false;
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
int dispose_count = 0;
bool in_young_generation = false;
{
@ -880,6 +893,9 @@ TEST(ScavengeExternalOneByteString) {
ManualGCScope manual_gc_scope;
i::v8_flags.stress_compaction = false;
i::v8_flags.gc_global = false;
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
int dispose_count = 0;
bool in_young_generation = false;
{
@ -925,6 +941,9 @@ int TestOneByteResourceWithDisposeControl::dispose_calls = 0;
TEST(ExternalStringWithDisposeHandling) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
const char* c_source = "1 + 2 * 3";
// Use a stack allocated external string resource allocated object.
@ -4199,6 +4218,8 @@ void FirstPassCallback(const v8::WeakCallbackInfo<TwoPassCallbackData>& data) {
TEST(TwoPassPhantomCallbacks) {
auto isolate = CcTest::isolate();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
GCCallbackMetadata metadata;
const size_t kLength = 20;
for (size_t i = 0; i < kLength; ++i) {
@ -4213,6 +4234,8 @@ TEST(TwoPassPhantomCallbacks) {
TEST(TwoPassPhantomCallbacksNestedGc) {
auto isolate = CcTest::isolate();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
GCCallbackMetadata metadata;
const size_t kLength = 20;
TwoPassCallbackData* array[kLength];
@ -4233,6 +4256,8 @@ TEST(TwoPassPhantomCallbacksNestedGc) {
// the second pass callback can still execute JS as per its API contract.
TEST(TwoPassPhantomCallbacksTriggeredByStringAlloc) {
auto isolate = CcTest::isolate();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
GCCallbackMetadata metadata;
auto data = new TwoPassCallbackData(isolate, &metadata);
data->SetWeak();
@ -7600,8 +7625,11 @@ static void SetFlag(const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
static void IndependentWeakHandle(bool global_gc, bool interlinked) {
ManualGCScope manual_gc_scope;
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
// Parallel scavenge introduces too much fragmentation.
i::v8_flags.parallel_scavenge = false;
v8::Isolate* iso = CcTest::isolate();
v8::HandleScope scope(iso);
v8::Local<Context> context = Context::New(iso);
@ -7706,6 +7734,8 @@ void InternalFieldCallback(bool global_gc) {
// which prevents it from being reclaimed and the callbacks from being
// executed.
ManualGCScope manual_gc_scope;
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();
@ -7741,6 +7771,7 @@ void InternalFieldCallback(bool global_gc) {
handle.SetWeak<v8::Persistent<v8::Object>>(
&handle, CheckInternalFields, v8::WeakCallbackType::kInternalFields);
}
if (i::v8_flags.single_generation || global_gc) {
CcTest::CollectAllGarbage();
} else {
@ -7847,6 +7878,8 @@ THREADED_TEST(GCFromWeakCallbacks) {
v8::HandleScope scope(isolate);
v8::Local<Context> context = Context::New(isolate);
Context::Scope context_scope(context);
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
if (i::v8_flags.single_generation) {
FlagAndPersistent object;
@ -13295,6 +13328,8 @@ static void CheckSurvivingGlobalObjectsCount(int expected) {
// the first garbage collection but some of the maps have already
// been marked at that point. Therefore some of the maps are not
// collected until the second garbage collection.
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
CcTest::CollectAllGarbage();
CcTest::CollectAllGarbage();
int count = GetGlobalObjectsCount();
@ -16672,6 +16707,8 @@ TEST(GetHeapSpaceStatistics) {
}
TEST(NumberOfNativeContexts) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
static const size_t kNumTestContexts = 10;
i::Isolate* isolate = CcTest::i_isolate();
i::HandleScope scope(isolate);
@ -16696,6 +16733,8 @@ TEST(NumberOfNativeContexts) {
}
TEST(NumberOfDetachedContexts) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
static const size_t kNumTestContexts = 10;
i::Isolate* isolate = CcTest::i_isolate();
i::HandleScope scope(isolate);
@ -16923,6 +16962,8 @@ TEST(ExternalInternalizedStringCollectedAtTearDown) {
TEST(ExternalInternalizedStringCollectedAtGC) {
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
int destroyed = 0;
{ LocalContext env;
v8::HandleScope handle_scope(env->GetIsolate());
@ -21028,8 +21069,6 @@ class RegExpInterruptTest {
static void CollectAllGarbage(v8::Isolate* isolate, void* data) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
i_isolate->heap()->PreciseCollectAllGarbage(
i::Heap::kNoGCFlags, i::GarbageCollectionReason::kRuntime);
}
@ -27449,7 +27488,6 @@ static void CallIsolate2(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Local<v8::Context>::New(isolate_2, context_2);
v8::Context::Scope context_scope(context);
i::Heap* heap_2 = reinterpret_cast<i::Isolate*>(isolate_2)->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap_2);
heap_2->CollectAllGarbage(i::Heap::kForcedGC,
i::GarbageCollectionReason::kTesting);
CompileRun("f2() //# sourceURL=isolate2b");
@ -28985,6 +29023,8 @@ THREADED_TEST(Recorder_GetContext) {
// Set up isolate and context.
v8::Isolate* iso = CcTest::isolate();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
v8::metrics::Recorder::ContextId original_id;
std::vector<v8::metrics::Recorder::ContextId> ids;
{

View File

@ -4581,6 +4581,8 @@ TEST(BytecodeFlushEventsEagerLogging) {
v8::Isolate* isolate = CcTest::isolate();
Isolate* i_isolate = CcTest::i_isolate();
Factory* factory = i_isolate->factory();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
CpuProfiler profiler(i_isolate, kDebugNaming, kEagerLogging);
CodeMap* code_map = profiler.code_map_for_test();
@ -4642,6 +4644,8 @@ TEST(ClearUnusedWithEagerLogging) {
TestSetup test_setup;
i::Isolate* isolate = CcTest::i_isolate();
i::HandleScope scope(isolate);
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
CodeEntryStorage storage;
CpuProfilesCollection* profiles = new CpuProfilesCollection(isolate);

View File

@ -165,6 +165,8 @@ void CheckDebuggerUnloaded() {
CHECK(!CcTest::i_isolate()->debug()->debug_info_list_);
// Collect garbage to ensure weak handles are cleared.
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
CcTest::CollectAllGarbage();
CcTest::CollectAllGarbage();

View File

@ -687,6 +687,8 @@ TEST(TestJSWeakRef) {
LocalContext context;
Isolate* isolate = CcTest::i_isolate();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
HandleScope outer_scope(isolate);
Handle<JSWeakRef> weak_ref;
{
@ -720,6 +722,7 @@ TEST(TestJSWeakRefIncrementalMarking) {
Isolate* isolate = CcTest::i_isolate();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
HandleScope outer_scope(isolate);
Handle<JSWeakRef> weak_ref;
{
@ -750,6 +753,9 @@ TEST(TestJSWeakRefKeepDuringJob) {
LocalContext context;
Isolate* isolate = CcTest::i_isolate();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
CcTest::heap());
HandleScope outer_scope(isolate);
Handle<JSWeakRef> weak_ref = MakeWeakRefAndKeepDuringJob(isolate);
CHECK(!weak_ref->target().IsUndefined(isolate));
@ -792,6 +798,7 @@ TEST(TestJSWeakRefKeepDuringJobIncrementalMarking) {
Isolate* isolate = CcTest::i_isolate();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
HandleScope outer_scope(isolate);
Handle<JSWeakRef> weak_ref = MakeWeakRefAndKeepDuringJob(isolate);
@ -880,6 +887,7 @@ TEST(JSWeakRefScavengedInWorklist) {
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
{
HandleScope outer_scope(isolate);
@ -931,6 +939,7 @@ TEST(JSWeakRefTenuredInWorklist) {
CcTest::InitializeVM();
Isolate* isolate = CcTest::i_isolate();
Heap* heap = isolate->heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
HandleScope outer_scope(isolate);
Handle<JSWeakRef> weak_ref;
@ -984,6 +993,7 @@ TEST(UnregisterTokenHeapVerifier) {
CcTest::InitializeVM();
v8::Isolate* isolate = CcTest::isolate();
Heap* heap = CcTest::heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
v8::HandleScope outer_scope(isolate);
{
@ -1032,6 +1042,7 @@ TEST(UnregisteredAndUnclearedCellHeapVerifier) {
CcTest::InitializeVM();
v8::Isolate* isolate = CcTest::isolate();
Heap* heap = CcTest::heap();
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
v8::HandleScope outer_scope(isolate);
{

View File

@ -1842,8 +1842,14 @@ class WorkerIsolateThread : public v8::base::Thread {
gh_shared_string.SetWeak();
}
i_client->heap()->CollectGarbageShared(i_client->main_thread_local_heap(),
GarbageCollectionReason::kTesting);
{
// Disable CSS for the shared heap and all clients.
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_client->shared_heap_isolate()->heap());
i_client->heap()->CollectGarbageShared(i_client->main_thread_local_heap(),
GarbageCollectionReason::kTesting);
}
CHECK(gh_shared_string.IsEmpty());
client->Dispose();

View File

@ -359,8 +359,6 @@ class MergeDeserializedCodeTest : public DeserializeTest {
}
}
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
i_isolate->heap()->CollectAllGarbage(i::Heap::kNoGCFlags,
i::GarbageCollectionReason::kTesting);
@ -411,6 +409,8 @@ class MergeDeserializedCodeTest : public DeserializeTest {
std::unique_ptr<v8::ScriptCompiler::CachedData> cached_data;
IsolateAndContextScope scope(this);
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate());
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
ScriptOrigin default_origin(isolate(), NewString(""));
i::Handle<i::WeakFixedArray> original_objects =
@ -509,8 +509,6 @@ class MergeDeserializedCodeTest : public DeserializeTest {
// At this point, the original_objects array might still have pointers to
// some old discarded content, such as UncompiledData from flushed
// functions. GC again to clear it all out.
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
i_isolate->heap()->CollectAllGarbage(i::Heap::kNoGCFlags,
i::GarbageCollectionReason::kTesting);
@ -645,6 +643,9 @@ TEST_F(MergeDeserializedCodeTest, MergeWithNoFollowUpWork) {
std::unique_ptr<v8::ScriptCompiler::CachedData> cached_data;
IsolateAndContextScope scope(this);
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate());
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
ScriptOrigin default_origin(isolate(), NewString(""));
constexpr char kSourceCode[] = "function f() {}";
@ -727,6 +728,8 @@ TEST_F(MergeDeserializedCodeTest, MergeThatCompilesLazyFunction) {
std::unique_ptr<v8::ScriptCompiler::CachedData> cached_data;
IsolateAndContextScope scope(this);
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate());
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate->heap());
ScriptOrigin default_origin(isolate(), NewString(""));
constexpr char kSourceCode[] =

View File

@ -268,6 +268,8 @@ TEST_F(CodePagesTest, LargeCodeObject) {
// We don't want incremental marking to start which could cause the code to
// not be collected on the CollectGarbage() call.
ManualGCScope manual_gc_scope(i_isolate());
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
if (!i_isolate()->RequiresCodeRange() && !kHaveCodePages) return;
@ -383,6 +385,8 @@ TEST_F(CodePagesTest, LargeCodeObjectWithSignalHandler) {
// We don't want incremental marking to start which could cause the code to
// not be collected on the CollectGarbage() call.
ManualGCScope manual_gc_scope(i_isolate());
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
if (!i_isolate()->RequiresCodeRange() && !kHaveCodePages) return;
@ -459,6 +463,8 @@ TEST_F(CodePagesTest, Sorted) {
// We don't want incremental marking to start which could cause the code to
// not be collected on the CollectGarbage() call.
ManualGCScope manual_gc_scope(i_isolate());
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
if (!i_isolate()->RequiresCodeRange() && !kHaveCodePages) return;

View File

@ -359,7 +359,6 @@ class InConstructionObjectReferringToGlobalHandle final
InConstructionObjectReferringToGlobalHandle(Heap* heap,
v8::Local<v8::Object> wrapper)
: wrapper_(reinterpret_cast<v8::Isolate*>(heap->isolate()), wrapper) {
DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
heap->CollectGarbage(OLD_SPACE, GarbageCollectionReason::kTesting);
heap->CollectGarbage(OLD_SPACE, GarbageCollectionReason::kTesting);
}

View File

@ -566,6 +566,8 @@ TEST_F(EmbedderTracingTest, TracedReferenceCopyReferences) {
EXPECT_FALSE(tmp.IsEmpty());
// Conservative scanning may find stale pointers to on-stack handles.
// Disable scanning, assuming the slots are overwritten.
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
EmbedderStackStateScope stack_scope =
EmbedderStackStateScope::ExplicitScopeForTesting(
reinterpret_cast<i::Isolate*>(v8_isolate())
@ -690,6 +692,8 @@ TEST_F(EmbedderTracingTest, TracedReferenceHandlesMarking) {
{
// Conservative scanning may find stale pointers to on-stack handles.
// Disable scanning, assuming the slots are overwritten.
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
EmbedderStackStateScope scope =
EmbedderStackStateScope::ExplicitScopeForTesting(
reinterpret_cast<i::Isolate*>(v8_isolate())
@ -811,6 +815,8 @@ TEST_F(EmbedderTracingTest, BasicTracedReference) {
{
// Conservative scanning may find stale pointers to on-stack handles.
// Disable scanning, assuming the slots are overwritten.
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
EmbedderStackStateScope scope =
EmbedderStackStateScope::ExplicitScopeForTesting(
reinterpret_cast<i::Isolate*>(v8_isolate())
@ -1017,6 +1023,8 @@ V8_NOINLINE void StackToHeapTest(v8::Isolate* v8_isolate,
{
// Conservative scanning may find stale pointers to on-stack handles.
// Disable scanning, assuming the slots are overwritten.
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
reinterpret_cast<i::Isolate*>(v8_isolate)->heap());
EmbedderStackStateScope scope =
EmbedderStackStateScope::ExplicitScopeForTesting(
reinterpret_cast<i::Isolate*>(v8_isolate)
@ -1185,6 +1193,8 @@ V8_NOINLINE void TracedReferenceOnStackReferencesAreTemporaryTest(
{
// Conservative scanning may find stale pointers to on-stack handles.
// Disable scanning, assuming the slots are overwritten.
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
reinterpret_cast<Isolate*>(v8_isolate)->heap());
EmbedderStackStateScope scope =
EmbedderStackStateScope::ExplicitScopeForTesting(
reinterpret_cast<i::Isolate*>(v8_isolate)

View File

@ -152,6 +152,8 @@ void WeakHandleTest(v8::Isolate* isolate, ConstructFunction construct_function,
ModifierFunction modifier_function, GCFunction gc_function,
SurvivalMode survives) {
v8::HandleScope scope(isolate);
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
reinterpret_cast<i::Isolate*>(isolate)->heap());
v8::Local<v8::Context> context = v8::Context::New(isolate);
v8::Context::Scope context_scope(context);
@ -176,6 +178,8 @@ class GlobalHandlesTest : public TestWithContext {
ModifierFunction modifier_function,
SurvivalMode survives) {
v8::Isolate* isolate = v8_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
v8::HandleScope scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
v8::Context::Scope context_scope(context);
@ -202,6 +206,8 @@ TEST_F(GlobalHandlesTest, EternalHandles) {
Isolate* isolate = i_isolate();
v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
EternalHandles* eternal_handles = isolate->eternal_handles();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
isolate->heap());
// Create a number of handles that will not be on a block boundary
const int kArrayLength = 2048 - 1;
@ -293,6 +299,8 @@ START_ALLOW_USE_DEPRECATED()
TEST_F(GlobalHandlesTest, PhantomHandlesWithoutCallbacks) {
v8::Isolate* isolate = v8_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
v8::Global<v8::Object> g1, g2;
{
@ -490,6 +498,8 @@ void ForceMarkSweep1(const v8::WeakCallbackInfo<FlagAndGlobal>& data) {
TEST_F(GlobalHandlesTest, GCFromWeakCallbacks) {
v8::Isolate* isolate = v8_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
v8::HandleScope scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
v8::Context::Scope context_scope(context);
@ -547,6 +557,8 @@ void FirstPassCallback(const v8::WeakCallbackInfo<FlagAndGlobal>& data) {
TEST_F(GlobalHandlesTest, SecondPassPhantomCallbacks) {
v8::Isolate* isolate = v8_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
v8::HandleScope scope(isolate);
v8::Local<v8::Context> context = v8::Context::New(isolate);
v8::Context::Scope context_scope(context);

View File

@ -33,22 +33,18 @@ class WithHeapInternals : public TMixin, HeapInternalsBase {
WithHeapInternals& operator=(const WithHeapInternals&) = delete;
void CollectGarbage(AllocationSpace space) {
DisableConservativeStackScanningScopeForTesting scope(heap());
heap()->CollectGarbage(space, GarbageCollectionReason::kTesting);
}
void FullGC() {
DisableConservativeStackScanningScopeForTesting scope(heap());
heap()->CollectGarbage(OLD_SPACE, GarbageCollectionReason::kTesting);
}
void YoungGC() {
DisableConservativeStackScanningScopeForTesting scope(heap());
heap()->CollectGarbage(NEW_SPACE, GarbageCollectionReason::kTesting);
}
void CollectAllAvailableGarbage() {
DisableConservativeStackScanningScopeForTesting scope(heap());
heap()->CollectAllAvailableGarbage(GarbageCollectionReason::kTesting);
}
@ -92,7 +88,6 @@ class WithHeapInternals : public TMixin, HeapInternalsBase {
}
void GcAndSweep(AllocationSpace space) {
DisableConservativeStackScanningScopeForTesting scope(heap());
heap()->CollectGarbage(space, GarbageCollectionReason::kTesting);
if (heap()->sweeping_in_progress()) {
IsolateSafepointScope scope(heap());
@ -136,19 +131,16 @@ using TestWithHeapInternalsAndContext = //
inline void CollectGarbage(AllocationSpace space, v8::Isolate* isolate) {
Heap* heap = reinterpret_cast<i::Isolate*>(isolate)->heap();
DisableConservativeStackScanningScopeForTesting scope(heap);
heap->CollectGarbage(space, GarbageCollectionReason::kTesting);
}
inline void FullGC(v8::Isolate* isolate) {
Heap* heap = reinterpret_cast<i::Isolate*>(isolate)->heap();
DisableConservativeStackScanningScopeForTesting scope(heap);
heap->CollectAllGarbage(Heap::kNoGCFlags, GarbageCollectionReason::kTesting);
}
inline void YoungGC(v8::Isolate* isolate) {
Heap* heap = reinterpret_cast<i::Isolate*>(isolate)->heap();
DisableConservativeStackScanningScopeForTesting scope(heap);
heap->CollectGarbage(NEW_SPACE, GarbageCollectionReason::kTesting);
}

View File

@ -58,6 +58,8 @@ TEST_F(WeakMapsTest, Weakness) {
v8_flags.incremental_marking = false;
Isolate* isolate = i_isolate();
Factory* factory = isolate->factory();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
isolate->heap());
HandleScope scope(isolate);
Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap();
GlobalHandles* global_handles = isolate->global_handles();
@ -117,6 +119,8 @@ TEST_F(WeakMapsTest, Weakness) {
TEST_F(WeakMapsTest, Shrinking) {
Isolate* isolate = i_isolate();
Factory* factory = isolate->factory();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
isolate->heap());
HandleScope scope(isolate);
Handle<JSWeakMap> weakmap = isolate->factory()->NewJSWeakMap();
@ -329,6 +333,8 @@ TEST_F(WeakMapsTest, Regress399527) {
TEST_F(WeakMapsTest, WeakMapsWithChainedEntries) {
ManualGCScope manual_gc_scope(i_isolate());
v8::Isolate* isolate = v8_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
v8::HandleScope scope(isolate);
const int initial_gc_count = i_isolate()->heap()->gc_count();

View File

@ -145,8 +145,6 @@ void DeclarationContext::Check(const char* source, int get, int set, int query,
InitializeIfNeeded();
// A retry after a GC may pollute the counts, so perform gc now
// to avoid that.
i::DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
i_isolate()->heap()->CollectGarbage(i::NEW_SPACE,
i::GarbageCollectionReason::kTesting);
HandleScope scope(isolate_);

View File

@ -91,8 +91,6 @@ ManualGCScope::ManualGCScope(i::Isolate* isolate) {
// running by the time a ManualGCScope is created. Finalizing existing marking
// prevents any undefined/unexpected behavior.
if (isolate && isolate->heap()->incremental_marking()->IsMarking()) {
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
isolate->heap());
isolate->heap()->CollectGarbage(OLD_SPACE,
GarbageCollectionReason::kTesting);
// Make sure there is no concurrent sweeping running in the background.

View File

@ -187,39 +187,25 @@ class WithIsolateScopeMixin : public TMixin {
}
// By default, the GC methods do not scan the stack conservatively.
void CollectGarbage(i::AllocationSpace space, i::Isolate* isolate = nullptr,
StackState stack_state = StackState::kNoHeapPointers) {
void CollectGarbage(i::AllocationSpace space, i::Isolate* isolate = nullptr) {
i::Isolate* iso = isolate ? isolate : i_isolate();
base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == StackState::kNoHeapPointers) scope.emplace(iso->heap());
iso->heap()->CollectGarbage(space, i::GarbageCollectionReason::kTesting);
}
void CollectAllGarbage(i::Isolate* isolate = nullptr,
StackState stack_state = StackState::kNoHeapPointers) {
void CollectAllGarbage(i::Isolate* isolate = nullptr) {
i::Isolate* iso = isolate ? isolate : i_isolate();
base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == StackState::kNoHeapPointers) scope.emplace(iso->heap());
iso->heap()->CollectAllGarbage(i::Heap::kNoGCFlags,
i::GarbageCollectionReason::kTesting);
}
void CollectAllAvailableGarbage(
i::Isolate* isolate = nullptr,
StackState stack_state = StackState::kNoHeapPointers) {
void CollectAllAvailableGarbage(i::Isolate* isolate = nullptr) {
i::Isolate* iso = isolate ? isolate : i_isolate();
base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == StackState::kNoHeapPointers) scope.emplace(iso->heap());
iso->heap()->CollectAllAvailableGarbage(
i::GarbageCollectionReason::kTesting);
}
void PreciseCollectAllGarbage(
i::Isolate* isolate = nullptr,
StackState stack_state = StackState::kNoHeapPointers) {
void PreciseCollectAllGarbage(i::Isolate* isolate = nullptr) {
i::Isolate* iso = isolate ? isolate : i_isolate();
base::Optional<i::DisableConservativeStackScanningScopeForTesting> scope;
if (stack_state == StackState::kNoHeapPointers) scope.emplace(iso->heap());
iso->heap()->PreciseCollectAllGarbage(i::Heap::kNoGCFlags,
i::GarbageCollectionReason::kTesting);
}

View File

@ -506,6 +506,8 @@ TEST_F(WebSnapshotTest, SFIDeduplicationAfterBytecodeFlushing) {
v8_flags.stress_flush_code = true;
v8_flags.flush_bytecode = true;
v8::Isolate* isolate = v8_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
WebSnapshotData snapshot_data;
{
@ -590,6 +592,8 @@ TEST_F(WebSnapshotTest, SFIDeduplicationAfterBytecodeFlushingClasses) {
v8_flags.stress_flush_code = true;
v8_flags.flush_bytecode = true;
v8::Isolate* isolate = v8_isolate();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
i_isolate()->heap());
WebSnapshotData snapshot_data;
{

View File

@ -30,8 +30,6 @@ own<Trap> Stage2(void* env, const Val args[], Val results[]) {
own<Trap> Stage4_GC(void* env, const Val args[], Val results[]) {
printf("Stage4...\n");
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env);
DisableConservativeStackScanningScopeForTesting no_stack_scanning(
isolate->heap());
isolate->heap()->PreciseCollectAllGarbage(Heap::kForcedGC,
GarbageCollectionReason::kTesting);
results[0] = Val::i32(args[0].i32() + 1);

View File

@ -37,7 +37,6 @@ TEST_F(WasmCapiTest, Serialize) {
ResetModule();
Heap* heap =
reinterpret_cast<::wasm::StoreImpl*>(store())->i_isolate()->heap();
DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap);
heap->PreciseCollectAllGarbage(Heap::kForcedGC,
GarbageCollectionReason::kTesting);
heap->PreciseCollectAllGarbage(Heap::kForcedGC,