Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/global-handles.cc b/src/global-handles.cc
index ed9caa9..82b4fcd 100644
--- a/src/global-handles.cc
+++ b/src/global-handles.cc
@@ -82,7 +82,6 @@
index_ = static_cast<uint8_t>(index);
DCHECK(static_cast<int>(index_) == index);
set_state(FREE);
- set_weakness_type(NORMAL_WEAK);
set_in_new_space_list(false);
parameter_or_next_free_.next_free = *first_free;
*first_free = this;
@@ -195,16 +194,26 @@
bool IsInUse() const { return state() != FREE; }
+ bool IsPendingPhantomCallback() const {
+ return state() == PENDING &&
+ (weakness_type() == PHANTOM_WEAK ||
+ weakness_type() == PHANTOM_WEAK_2_INTERNAL_FIELDS);
+ }
+
+ bool IsPendingPhantomResetHandle() const {
+ return state() == PENDING && weakness_type() == PHANTOM_WEAK_RESET_HANDLE;
+ }
+
bool IsRetainer() const {
return state() != FREE &&
- !(state() == NEAR_DEATH && weakness_type() != NORMAL_WEAK);
+ !(state() == NEAR_DEATH && weakness_type() != FINALIZER_WEAK);
}
bool IsStrongRetainer() const { return state() == NORMAL; }
bool IsWeakRetainer() const {
return state() == WEAK || state() == PENDING ||
- (state() == NEAR_DEATH && weakness_type() == NORMAL_WEAK);
+ (state() == NEAR_DEATH && weakness_type() == FINALIZER_WEAK);
}
void MarkPending() {
@@ -250,16 +259,6 @@
parameter_or_next_free_.next_free = value;
}
- void MakeWeak(void* parameter, WeakCallback weak_callback) {
- DCHECK(weak_callback != nullptr);
- DCHECK(IsInUse());
- CHECK_NE(object_, reinterpret_cast<Object*>(kGlobalHandleZapValue));
- set_state(WEAK);
- set_weakness_type(NORMAL_WEAK);
- set_parameter(parameter);
- weak_callback_ = weak_callback;
- }
-
void MakeWeak(void* parameter,
WeakCallbackInfo<void>::Callback phantom_callback,
v8::WeakCallbackType type) {
@@ -272,11 +271,23 @@
set_weakness_type(PHANTOM_WEAK);
break;
case v8::WeakCallbackType::kInternalFields:
- set_weakness_type(PHANTOM_WEAK_2_INTERNAL_FIELDS);
- break;
+ set_weakness_type(PHANTOM_WEAK_2_INTERNAL_FIELDS);
+ break;
+ case v8::WeakCallbackType::kFinalizer:
+ set_weakness_type(FINALIZER_WEAK);
+ break;
}
set_parameter(parameter);
- weak_callback_ = reinterpret_cast<WeakCallback>(phantom_callback);
+ weak_callback_ = phantom_callback;
+ }
+
+ void MakeWeak(Object*** location_addr) {
+ DCHECK(IsInUse());
+ CHECK_NE(object_, reinterpret_cast<Object*>(kGlobalHandleZapValue));
+ set_state(WEAK);
+ set_weakness_type(PHANTOM_WEAK_RESET_HANDLE);
+ set_parameter(location_addr);
+ weak_callback_ = nullptr;
}
void* ClearWeakness() {
@@ -293,6 +304,7 @@
DCHECK(weakness_type() == PHANTOM_WEAK ||
weakness_type() == PHANTOM_WEAK_2_INTERNAL_FIELDS);
DCHECK(state() == PENDING);
+ DCHECK(weak_callback_ != nullptr);
void* internal_fields[v8::kInternalFieldsInWeakCallback] = {nullptr,
nullptr};
@@ -317,6 +329,15 @@
set_state(NEAR_DEATH);
}
+ void ResetPhantomHandle() {
+ DCHECK(weakness_type() == PHANTOM_WEAK_RESET_HANDLE);
+ DCHECK(state() == PENDING);
+ DCHECK(weak_callback_ == nullptr);
+ Object*** handle = reinterpret_cast<Object***>(parameter());
+ *handle = nullptr;
+ Release();
+ }
+
bool PostGarbageCollectionProcessing(Isolate* isolate) {
// Handles only weak handles (not phantom) that are dying.
if (state() != Node::PENDING) return false;
@@ -332,17 +353,17 @@
ExternalOneByteString::cast(object_)->resource() != NULL);
DCHECK(!object_->IsExternalTwoByteString() ||
ExternalTwoByteString::cast(object_)->resource() != NULL);
- if (weakness_type() != NORMAL_WEAK) return false;
+ if (weakness_type() != FINALIZER_WEAK) {
+ return false;
+ }
// Leaving V8.
VMState<EXTERNAL> vmstate(isolate);
HandleScope handle_scope(isolate);
- Object** object = location();
- Handle<Object> handle(*object, isolate);
- v8::WeakCallbackData<v8::Value, void> data(
- reinterpret_cast<v8::Isolate*>(isolate), parameter(),
- v8::Utils::ToLocal(handle));
- set_parameter(NULL);
+ void* internal_fields[v8::kInternalFieldsInWeakCallback] = {nullptr,
+ nullptr};
+ v8::WeakCallbackInfo<void> data(reinterpret_cast<v8::Isolate*>(isolate),
+ parameter(), internal_fields, nullptr);
weak_callback_(data);
// Absence of explicit cleanup or revival of weak handle
@@ -384,7 +405,7 @@
uint8_t flags_;
// Handle specific callback - might be a weak reference in disguise.
- WeakCallback weak_callback_;
+ WeakCallbackInfo<void>::Callback weak_callback_;
// Provided data for callback. In FREE state, this is used for
// the free list link.
@@ -534,6 +555,7 @@
}
void RunInternal() override {
+ TRACE_EVENT0("v8", "V8.GCPhantomHandleProcessingCallback");
isolate()->heap()->CallGCPrologueCallbacks(
GCType::kGCTypeProcessWeakCallbacks, kNoGCCallbackFlags);
InvokeSecondPassPhantomCallbacks(&pending_phantom_callbacks_, isolate());
@@ -547,7 +569,6 @@
DISALLOW_COPY_AND_ASSIGN(PendingPhantomCallbacksSecondPassTask);
};
-
GlobalHandles::GlobalHandles(Isolate* isolate)
: isolate_(isolate),
number_of_global_handles_(0),
@@ -555,9 +576,9 @@
first_used_block_(NULL),
first_free_(NULL),
post_gc_processing_count_(0),
+ number_of_phantom_handle_resets_(0),
object_group_connections_(kObjectGroupConnectionsCapacity) {}
-
GlobalHandles::~GlobalHandles() {
NodeBlock* block = first_block_;
while (block != NULL) {
@@ -599,12 +620,6 @@
}
-void GlobalHandles::MakeWeak(Object** location, void* parameter,
- WeakCallback weak_callback) {
- Node::FromLocation(location)->MakeWeak(parameter, weak_callback);
-}
-
-
typedef v8::WeakCallbackInfo<void>::Callback GenericCallback;
@@ -614,6 +629,9 @@
Node::FromLocation(location)->MakeWeak(parameter, phantom_callback, type);
}
+void GlobalHandles::MakeWeak(Object*** location_addr) {
+ Node::FromLocation(*location_addr)->MakeWeak(location_addr);
+}
void* GlobalHandles::ClearWeakness(Object** location) {
return Node::FromLocation(location)->ClearWeakness();
@@ -649,10 +667,12 @@
Node* node = it.node();
if (node->IsWeakRetainer()) {
// Pending weak phantom handles die immediately. Everything else survives.
- if (node->state() == Node::PENDING &&
- node->weakness_type() != NORMAL_WEAK) {
- node->CollectPhantomCallbackData(isolate(),
- &pending_phantom_callbacks_);
+ if (node->IsPendingPhantomResetHandle()) {
+ node->ResetPhantomHandle();
+ ++number_of_phantom_handle_resets_;
+ } else if (node->IsPendingPhantomCallback()) {
+ node->CollectPhantomCallbackData(isolate(),
+ &pending_phantom_callbacks_);
} else {
v->VisitPointer(node->location());
}
@@ -710,8 +730,10 @@
if ((node->is_independent() || node->is_partially_dependent()) &&
node->IsWeakRetainer()) {
// Pending weak phantom handles die immediately. Everything else survives.
- if (node->state() == Node::PENDING &&
- node->weakness_type() != NORMAL_WEAK) {
+ if (node->IsPendingPhantomResetHandle()) {
+ node->ResetPhantomHandle();
+ ++number_of_phantom_handle_resets_;
+ } else if (node->IsPendingPhantomCallback()) {
node->CollectPhantomCallbackData(isolate(),
&pending_phantom_callbacks_);
} else {
@@ -753,8 +775,10 @@
if ((node->is_independent() || !node->is_active()) &&
node->IsWeakRetainer()) {
// Pending weak phantom handles die immediately. Everything else survives.
- if (node->state() == Node::PENDING &&
- node->weakness_type() != NORMAL_WEAK) {
+ if (node->IsPendingPhantomResetHandle()) {
+ node->ResetPhantomHandle();
+ ++number_of_phantom_handle_resets_;
+ } else if (node->IsPendingPhantomCallback()) {
node->CollectPhantomCallbackData(isolate(),
&pending_phantom_callbacks_);
} else {
@@ -888,7 +912,7 @@
}
void ObjectGroupsTracer::PrintObjectGroup(ObjectGroup* group) {
- PrintIsolate(isolate_, "ObjectGroup (size: %lu)\n", group->length);
+ PrintIsolate(isolate_, "ObjectGroup (size: %" PRIuS ")\n", group->length);
Object*** objects = group->objects;
for (size_t i = 0; i < group->length; ++i) {
@@ -898,7 +922,7 @@
}
void ObjectGroupsTracer::PrintImplicitRefGroup(ImplicitRefGroup* group) {
- PrintIsolate(isolate_, "ImplicitRefGroup (children count: %lu)\n",
+ PrintIsolate(isolate_, "ImplicitRefGroup (children count: %" PRIuS ")\n",
group->length);
PrintIsolate(isolate_, " - Parent: ");
PrintObject(*(group->parent));
@@ -1223,8 +1247,7 @@
}
PrintF("Global Handle Statistics:\n");
- PrintF(" allocated memory = %" V8_SIZET_PREFIX V8_PTR_PREFIX "dB\n",
- total * sizeof(Node));
+ PrintF(" allocated memory = %" PRIuS "B\n", total * sizeof(Node));
PrintF(" # weak = %d\n", weak);
PrintF(" # pending = %d\n", pending);
PrintF(" # near_death = %d\n", near_death);