summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/cppgc-js/cross-heap-remembered-set.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/cppgc-js/cross-heap-remembered-set.cc')
-rw-r--r--deps/v8/src/heap/cppgc-js/cross-heap-remembered-set.cc36
1 files changed, 36 insertions, 0 deletions
diff --git a/deps/v8/src/heap/cppgc-js/cross-heap-remembered-set.cc b/deps/v8/src/heap/cppgc-js/cross-heap-remembered-set.cc
new file mode 100644
index 0000000000..5c70fdeb22
--- /dev/null
+++ b/deps/v8/src/heap/cppgc-js/cross-heap-remembered-set.cc
@@ -0,0 +1,36 @@
+// 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.
+
+#include "src/heap/cppgc-js/cross-heap-remembered-set.h"
+
+#include "src/api/api-inl.h"
+#include "src/handles/global-handles-inl.h"
+#include "src/heap/cppgc/heap-page.h"
+
+namespace v8::internal {
+
+void CrossHeapRememberedSet::RememberReferenceIfNeeded(Isolate& isolate,
+ JSObject host_obj,
+ void* cppgc_object) {
+ DCHECK_NOT_NULL(cppgc_object);
+ // Any in-cage pointer must point to a vaild, not freed cppgc object.
+ auto* page =
+ cppgc::internal::BasePage::FromInnerAddress(&heap_base_, cppgc_object);
+ // TODO(v8:13475): Better filter with on-cage check.
+ if (!page) return;
+ auto& value_hoh = page->ObjectHeaderFromInnerAddress(cppgc_object);
+ if (!value_hoh.IsYoung()) return;
+ remembered_v8_to_cppgc_references_.push_back(
+ isolate.global_handles()->Create(host_obj));
+}
+
+void CrossHeapRememberedSet::Reset(Isolate& isolate) {
+ for (auto& h : remembered_v8_to_cppgc_references_) {
+ isolate.global_handles()->Destroy(h.location());
+ }
+ remembered_v8_to_cppgc_references_.clear();
+ remembered_v8_to_cppgc_references_.shrink_to_fit();
+}
+
+} // namespace v8::internal