// 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/factory.h" #include "test/unittests/test-utils.h" namespace v8 { namespace internal { using WeakArrayListTest = TestWithIsolate; TEST_F(WeakArrayListTest, Compact) { Handle list = isolate()->factory()->NewWeakArrayList(10); EXPECT_EQ(list->length(), 0); EXPECT_EQ(list->capacity(), 10); MaybeObject some_object = MaybeObject::FromObject(*isolate()->factory()->empty_fixed_array()); MaybeObject weak_ref = MaybeObject::MakeWeak(some_object); MaybeObject smi = MaybeObject::FromSmi(Smi::FromInt(0)); MaybeObject cleared_ref = HeapObjectReference::ClearedValue(isolate()); list->Set(0, weak_ref); list->Set(1, smi); list->Set(2, cleared_ref); list->Set(3, cleared_ref); list->set_length(5); list->Compact(isolate()); EXPECT_EQ(list->length(), 3); EXPECT_EQ(list->capacity(), 10); } TEST_F(WeakArrayListTest, OutOfPlaceCompact) { Handle list = isolate()->factory()->NewWeakArrayList(20); EXPECT_EQ(list->length(), 0); EXPECT_EQ(list->capacity(), 20); MaybeObject some_object = MaybeObject::FromObject(*isolate()->factory()->empty_fixed_array()); MaybeObject weak_ref = MaybeObject::MakeWeak(some_object); MaybeObject smi = MaybeObject::FromSmi(Smi::FromInt(0)); MaybeObject cleared_ref = HeapObjectReference::ClearedValue(isolate()); list->Set(0, weak_ref); list->Set(1, smi); list->Set(2, cleared_ref); list->Set(3, smi); list->Set(4, cleared_ref); list->set_length(6); Handle compacted = isolate()->factory()->CompactWeakArrayList(list, 4); EXPECT_EQ(list->length(), 6); EXPECT_EQ(compacted->length(), 4); EXPECT_EQ(compacted->capacity(), 4); } } // namespace internal } // namespace v8