Reviewers: ulan,
Description:
Treat weak references in context weakly in write barrier.
BUG=
Please review this at https://codereview.chromium.org/1152153004/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+28, -17 lines):
M src/bootstrapper.cc
M src/contexts.cc
M src/heap/objects-visiting.cc
M src/objects.h
M src/objects-inl.h
Index: src/bootstrapper.cc
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index
c8b8797266aea3df05066a370e2ddca6d88838bd..e5c8a73232d8867e759a24a624a5261576479957
100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -790,7 +790,8 @@ static void AddToWeakNativeContextList(Context*
context) {
}
}
#endif
- context->set(Context::NEXT_CONTEXT_LINK, heap->native_contexts_list());
+ context->set(Context::NEXT_CONTEXT_LINK, heap->native_contexts_list(),
+ UPDATE_WEAK_WRITE_BARRIER);
heap->set_native_contexts_list(context);
}
Index: src/contexts.cc
diff --git a/src/contexts.cc b/src/contexts.cc
index
12eb871e15ddbe5eb9acb67acb4485fcec01c258..b7617f746761e7edbeadde1c938febda64f71ed4
100644
--- a/src/contexts.cc
+++ b/src/contexts.cc
@@ -395,7 +395,7 @@ void Context::AddOptimizedFunction(JSFunction*
function) {
DCHECK(function->next_function_link()->IsUndefined());
function->set_next_function_link(get(OPTIMIZED_FUNCTIONS_LIST));
- set(OPTIMIZED_FUNCTIONS_LIST, function);
+ set(OPTIMIZED_FUNCTIONS_LIST, function, UPDATE_WEAK_WRITE_BARRIER);
}
@@ -409,7 +409,8 @@ void Context::RemoveOptimizedFunction(JSFunction*
function) {
element_function->next_function_link()->IsJSFunction());
if (element_function == function) {
if (prev == NULL) {
- set(OPTIMIZED_FUNCTIONS_LIST,
element_function->next_function_link());
+ set(OPTIMIZED_FUNCTIONS_LIST,
element_function->next_function_link(),
+ UPDATE_WEAK_WRITE_BARRIER);
} else {
prev->set_next_function_link(element_function->next_function_link());
}
@@ -425,7 +426,7 @@ void Context::RemoveOptimizedFunction(JSFunction*
function) {
void Context::SetOptimizedFunctionsListHead(Object* head) {
DCHECK(IsNativeContext());
- set(OPTIMIZED_FUNCTIONS_LIST, head);
+ set(OPTIMIZED_FUNCTIONS_LIST, head, UPDATE_WEAK_WRITE_BARRIER);
}
@@ -440,13 +441,13 @@ void Context::AddOptimizedCode(Code* code) {
DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION);
DCHECK(code->next_code_link()->IsUndefined());
code->set_next_code_link(get(OPTIMIZED_CODE_LIST));
- set(OPTIMIZED_CODE_LIST, code);
+ set(OPTIMIZED_CODE_LIST, code, UPDATE_WEAK_WRITE_BARRIER);
}
void Context::SetOptimizedCodeListHead(Object* head) {
DCHECK(IsNativeContext());
- set(OPTIMIZED_CODE_LIST, head);
+ set(OPTIMIZED_CODE_LIST, head, UPDATE_WEAK_WRITE_BARRIER);
}
@@ -458,7 +459,7 @@ Object* Context::OptimizedCodeListHead() {
void Context::SetDeoptimizedCodeListHead(Object* head) {
DCHECK(IsNativeContext());
- set(DEOPTIMIZED_CODE_LIST, head);
+ set(DEOPTIMIZED_CODE_LIST, head, UPDATE_WEAK_WRITE_BARRIER);
}
Index: src/heap/objects-visiting.cc
diff --git a/src/heap/objects-visiting.cc b/src/heap/objects-visiting.cc
index
de2cfddb28438137df3641c14c85e48818a9bfef..4adf2a5c85f1d66e65acedee31c804fb4462af3d
100644
--- a/src/heap/objects-visiting.cc
+++ b/src/heap/objects-visiting.cc
@@ -287,7 +287,7 @@ struct WeakListVisitor<Code> {
template <>
struct WeakListVisitor<Context> {
static void SetWeakNext(Context* context, Object* next) {
- context->set(Context::NEXT_CONTEXT_LINK, next, UPDATE_WRITE_BARRIER);
+ context->set(Context::NEXT_CONTEXT_LINK, next,
UPDATE_WEAK_WRITE_BARRIER);
}
static Object* WeakNext(Context* context) {
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index
f2c21ac4bd6dc157dec41203fa8de6aee7a1611b..a81ce860067f394ecb60e1eebb6eacd9c19b61c2
100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1275,13 +1275,15 @@ Maybe<bool>
JSProxy::HasElementWithHandler(Handle<JSProxy> proxy,
heap->RecordWrite(object->address(), offset); \
}
-#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \
- if (mode == UPDATE_WRITE_BARRIER) { \
- heap->incremental_marking()->RecordWrite( \
- object, HeapObject::RawField(object, offset), value); \
- if (heap->InNewSpace(value)) { \
- heap->RecordWrite(object->address(), offset); \
- } \
+#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \
+ if (mode != SKIP_WRITE_BARRIER) { \
+ if (mode == UPDATE_WRITE_BARRIER) { \
+ heap->incremental_marking()->RecordWrite( \
+ object, HeapObject::RawField(object, offset), value); \
+ } \
+ if (heap->InNewSpace(value)) { \
+ heap->RecordWrite(object->address(), offset); \
+ } \
}
#ifndef V8_TARGET_ARCH_MIPS
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
a973f12663683f16b2befb784f89fef84fc6facc..c7a9f7816027fd23f4fd62ba8503ace85584c285
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -251,8 +251,15 @@ static inline bool
IsGrowStoreMode(KeyedAccessStoreMode store_mode) {
enum IcCheckType { ELEMENT, PROPERTY };
-// Setter that skips the write barrier if mode is SKIP_WRITE_BARRIER.
-enum WriteBarrierMode { SKIP_WRITE_BARRIER, UPDATE_WRITE_BARRIER };
+// SKIP_WRITE_BARRIER skips the write barrier.
+// UPDATE_WEAK_WRITE_BARRIER skips the marking part of the write barrier
and
+// only performs the generational part.
+// UPDATE_WRITE_BARRIER is doing the full barrier, marking and
generational.
+enum WriteBarrierMode {
+ SKIP_WRITE_BARRIER,
+ UPDATE_WEAK_WRITE_BARRIER,
+ UPDATE_WRITE_BARRIER
+};
// Indicates whether a value can be loaded as a constant.
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.