1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "src/heap/incremental-marking.h"
6 #include "src/heap/mark-compact.h"
7 #include "src/heap/spaces.h"
8 #include "src/objects/js-array-buffer-inl.h"
9 #include "src/objects/objects-inl.h"
10 #include "test/cctest/cctest.h"
11 #include "test/cctest/heap/heap-tester.h"
12 #include "test/cctest/heap/heap-utils.h"
13 
14 namespace v8 {
15 namespace internal {
16 namespace heap {
17 
HEAP_TEST(WriteBarrier_Marking)18 HEAP_TEST(WriteBarrier_Marking) {
19   if (!FLAG_incremental_marking) return;
20   ManualGCScope manual_gc_scope;
21   CcTest::InitializeVM();
22   Isolate* isolate = CcTest::i_isolate();
23   Factory* factory = isolate->factory();
24   MarkCompactCollector* collector = isolate->heap()->mark_compact_collector();
25   HandleScope outer(isolate);
26   Handle<FixedArray> objects = factory->NewFixedArray(3);
27   v8::Global<Value> global_objects(CcTest::isolate(), Utils::ToLocal(objects));
28   {
29     // Make sure that these objects are not immediately reachable from
30     // the roots to prevent them being marked grey at the start of marking.
31     HandleScope inner(isolate);
32     Handle<FixedArray> host = factory->NewFixedArray(1);
33     Handle<HeapNumber> value1 = factory->NewHeapNumber(1.1);
34     Handle<HeapNumber> value2 = factory->NewHeapNumber(1.2);
35     objects->set(0, *host);
36     objects->set(1, *value1);
37     objects->set(2, *value2);
38   }
39   heap::SimulateIncrementalMarking(CcTest::heap(), false);
40   FixedArray host = FixedArray::cast(objects->get(0));
41   HeapObject value1 = HeapObject::cast(objects->get(1));
42   HeapObject value2 = HeapObject::cast(objects->get(2));
43   CHECK(collector->marking_state()->IsWhite(host));
44   CHECK(collector->marking_state()->IsWhite(value1));
45   WriteBarrier::Marking(host, host.RawFieldOfElementAt(0), value1);
46   CHECK_EQ(V8_CONCURRENT_MARKING_BOOL,
47            collector->marking_state()->IsGrey(value1));
48   collector->marking_state()->WhiteToGrey(host);
49   collector->marking_state()->GreyToBlack(host);
50   CHECK(collector->marking_state()->IsWhite(value2));
51   WriteBarrier::Marking(host, host.RawFieldOfElementAt(0), value2);
52   CHECK(collector->marking_state()->IsGrey(value2));
53   heap::SimulateIncrementalMarking(CcTest::heap(), true);
54   CHECK(collector->marking_state()->IsBlack(host));
55   CHECK(collector->marking_state()->IsBlack(value1));
56   CHECK(collector->marking_state()->IsBlack(value2));
57 }
58 
HEAP_TEST(WriteBarrier_MarkingExtension)59 HEAP_TEST(WriteBarrier_MarkingExtension) {
60   if (!FLAG_incremental_marking) return;
61   ManualGCScope manual_gc_scope;
62   CcTest::InitializeVM();
63   Isolate* isolate = CcTest::i_isolate();
64   Factory* factory = isolate->factory();
65   MarkCompactCollector* collector = isolate->heap()->mark_compact_collector();
66   HandleScope outer(isolate);
67   Handle<FixedArray> objects = factory->NewFixedArray(1);
68   ArrayBufferExtension* extension;
69   {
70     HandleScope inner(isolate);
71     Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(CcTest::isolate(), 100);
72     Handle<JSArrayBuffer> host = v8::Utils::OpenHandle(*ab);
73     extension = host->extension();
74     objects->set(0, *host);
75   }
76   heap::SimulateIncrementalMarking(CcTest::heap(), false);
77   JSArrayBuffer host = JSArrayBuffer::cast(objects->get(0));
78   CHECK(collector->marking_state()->IsWhite(host));
79   CHECK(!extension->IsMarked());
80   WriteBarrier::Marking(host, extension);
81   // Concurrent marking barrier should mark this object.
82   CHECK_EQ(V8_CONCURRENT_MARKING_BOOL, extension->IsMarked());
83   // Keep object alive using the global handle.
84   v8::Global<ArrayBuffer> global_host(CcTest::isolate(),
85                                       Utils::ToLocal(handle(host, isolate)));
86   heap::SimulateIncrementalMarking(CcTest::heap(), true);
87   CHECK(collector->marking_state()->IsBlack(host));
88   CHECK(extension->IsMarked());
89 }
90 
91 }  // namespace heap
92 }  // namespace internal
93 }  // namespace v8
94