| // Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "platform/globals.h" |
| |
| #include "platform/assert.h" |
| #include "vm/globals.h" |
| #include "vm/heap/heap.h" |
| #include "vm/heap/weak_table.h" |
| #include "vm/unit_test.h" |
| |
| namespace dart { |
| |
| ISOLATE_UNIT_TEST_CASE(WeakTables) { |
| const Object& old_obj = Object::Handle(String::New("old", Heap::kOld)); |
| const Object& new_obj = Object::Handle(String::New("new", Heap::kNew)); |
| const Object& imm_obj = Object::Handle(Smi::New(0)); |
| |
| // Initially absent. |
| Heap* heap = thread->heap(); |
| const intptr_t kNoValue = WeakTable::kNoValue; |
| EXPECT_EQ(kNoValue, heap->GetObjectId(old_obj.ptr())); |
| EXPECT_EQ(kNoValue, heap->GetObjectId(new_obj.ptr())); |
| EXPECT_EQ(kNoValue, heap->GetObjectId(imm_obj.ptr())); |
| |
| // Found after insert. |
| heap->SetObjectId(old_obj.ptr(), 100); |
| heap->SetObjectId(new_obj.ptr(), 200); |
| heap->SetObjectId(imm_obj.ptr(), 300); |
| EXPECT_EQ(100, heap->GetObjectId(old_obj.ptr())); |
| EXPECT_EQ(200, heap->GetObjectId(new_obj.ptr())); |
| EXPECT_EQ(300, heap->GetObjectId(imm_obj.ptr())); |
| |
| // Found after update. |
| heap->SetObjectId(old_obj.ptr(), 400); |
| heap->SetObjectId(new_obj.ptr(), 500); |
| heap->SetObjectId(imm_obj.ptr(), 600); |
| EXPECT_EQ(400, heap->GetObjectId(old_obj.ptr())); |
| EXPECT_EQ(500, heap->GetObjectId(new_obj.ptr())); |
| EXPECT_EQ(600, heap->GetObjectId(imm_obj.ptr())); |
| |
| // Found after GC. |
| GCTestHelper::CollectNewSpace(); |
| EXPECT_EQ(400, heap->GetObjectId(old_obj.ptr())); |
| EXPECT_EQ(500, heap->GetObjectId(new_obj.ptr())); |
| EXPECT_EQ(600, heap->GetObjectId(imm_obj.ptr())); |
| |
| // Found after GC. |
| GCTestHelper::CollectOldSpace(); |
| EXPECT_EQ(400, heap->GetObjectId(old_obj.ptr())); |
| EXPECT_EQ(500, heap->GetObjectId(new_obj.ptr())); |
| EXPECT_EQ(600, heap->GetObjectId(imm_obj.ptr())); |
| |
| // Absent after reset. |
| heap->ResetObjectIdTable(); |
| EXPECT_EQ(kNoValue, heap->GetObjectId(old_obj.ptr())); |
| EXPECT_EQ(kNoValue, heap->GetObjectId(new_obj.ptr())); |
| EXPECT_EQ(kNoValue, heap->GetObjectId(imm_obj.ptr())); |
| } |
| |
| } // namespace dart |