| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/global-handles.h" | 5 #include "src/global-handles.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/cancelable-task.h" | 8 #include "src/cancelable-task.h" |
| 9 #include "src/objects-inl.h" | 9 #include "src/objects-inl.h" |
| 10 #include "src/v8.h" | 10 #include "src/v8.h" |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 return state() == PENDING || state() == NEAR_DEATH; | 155 return state() == PENDING || state() == NEAR_DEATH; |
| 156 } | 156 } |
| 157 | 157 |
| 158 bool IsWeak() const { return state() == WEAK; } | 158 bool IsWeak() const { return state() == WEAK; } |
| 159 | 159 |
| 160 bool IsInUse() const { return state() != FREE; } | 160 bool IsInUse() const { return state() != FREE; } |
| 161 | 161 |
| 162 bool IsPendingPhantomCallback() const { | 162 bool IsPendingPhantomCallback() const { |
| 163 return state() == PENDING && | 163 return state() == PENDING && |
| 164 (weakness_type() == PHANTOM_WEAK || | 164 (weakness_type() == PHANTOM_WEAK || |
| 165 weakness_type() == PHANTOM_WEAK_2_INTERNAL_FIELDS); | 165 weakness_type() == PHANTOM_WEAK_2_EMBEDDER_FIELDS); |
| 166 } | 166 } |
| 167 | 167 |
| 168 bool IsPendingPhantomResetHandle() const { | 168 bool IsPendingPhantomResetHandle() const { |
| 169 return state() == PENDING && weakness_type() == PHANTOM_WEAK_RESET_HANDLE; | 169 return state() == PENDING && weakness_type() == PHANTOM_WEAK_RESET_HANDLE; |
| 170 } | 170 } |
| 171 | 171 |
| 172 bool IsRetainer() const { | 172 bool IsRetainer() const { |
| 173 return state() != FREE && | 173 return state() != FREE && |
| 174 !(state() == NEAR_DEATH && weakness_type() != FINALIZER_WEAK); | 174 !(state() == NEAR_DEATH && weakness_type() != FINALIZER_WEAK); |
| 175 } | 175 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 WeakCallbackInfo<void>::Callback phantom_callback, | 216 WeakCallbackInfo<void>::Callback phantom_callback, |
| 217 v8::WeakCallbackType type) { | 217 v8::WeakCallbackType type) { |
| 218 DCHECK(phantom_callback != nullptr); | 218 DCHECK(phantom_callback != nullptr); |
| 219 DCHECK(IsInUse()); | 219 DCHECK(IsInUse()); |
| 220 CHECK_NE(object_, reinterpret_cast<Object*>(kGlobalHandleZapValue)); | 220 CHECK_NE(object_, reinterpret_cast<Object*>(kGlobalHandleZapValue)); |
| 221 set_state(WEAK); | 221 set_state(WEAK); |
| 222 switch (type) { | 222 switch (type) { |
| 223 case v8::WeakCallbackType::kParameter: | 223 case v8::WeakCallbackType::kParameter: |
| 224 set_weakness_type(PHANTOM_WEAK); | 224 set_weakness_type(PHANTOM_WEAK); |
| 225 break; | 225 break; |
| 226 case v8::WeakCallbackType::kInternalFields: | 226 case v8::WeakCallbackType::kEmbedderFields: |
| 227 set_weakness_type(PHANTOM_WEAK_2_INTERNAL_FIELDS); | 227 set_weakness_type(PHANTOM_WEAK_2_EMBEDDER_FIELDS); |
| 228 break; | 228 break; |
| 229 case v8::WeakCallbackType::kFinalizer: | 229 case v8::WeakCallbackType::kFinalizer: |
| 230 set_weakness_type(FINALIZER_WEAK); | 230 set_weakness_type(FINALIZER_WEAK); |
| 231 break; | 231 break; |
| 232 } | 232 } |
| 233 set_parameter(parameter); | 233 set_parameter(parameter); |
| 234 weak_callback_ = phantom_callback; | 234 weak_callback_ = phantom_callback; |
| 235 } | 235 } |
| 236 | 236 |
| 237 void MakeWeak(Object*** location_addr) { | 237 void MakeWeak(Object*** location_addr) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 248 void* p = parameter(); | 248 void* p = parameter(); |
| 249 set_state(NORMAL); | 249 set_state(NORMAL); |
| 250 set_parameter(NULL); | 250 set_parameter(NULL); |
| 251 return p; | 251 return p; |
| 252 } | 252 } |
| 253 | 253 |
| 254 void CollectPhantomCallbackData( | 254 void CollectPhantomCallbackData( |
| 255 Isolate* isolate, | 255 Isolate* isolate, |
| 256 List<PendingPhantomCallback>* pending_phantom_callbacks) { | 256 List<PendingPhantomCallback>* pending_phantom_callbacks) { |
| 257 DCHECK(weakness_type() == PHANTOM_WEAK || | 257 DCHECK(weakness_type() == PHANTOM_WEAK || |
| 258 weakness_type() == PHANTOM_WEAK_2_INTERNAL_FIELDS); | 258 weakness_type() == PHANTOM_WEAK_2_EMBEDDER_FIELDS); |
| 259 DCHECK(state() == PENDING); | 259 DCHECK(state() == PENDING); |
| 260 DCHECK(weak_callback_ != nullptr); | 260 DCHECK(weak_callback_ != nullptr); |
| 261 | 261 |
| 262 void* internal_fields[v8::kInternalFieldsInWeakCallback] = {nullptr, | 262 void* embedder_fields[v8::kEmbedderFieldsInWeakCallback] = {nullptr, |
| 263 nullptr}; | 263 nullptr}; |
| 264 if (weakness_type() != PHANTOM_WEAK && object()->IsJSObject()) { | 264 if (weakness_type() != PHANTOM_WEAK && object()->IsJSObject()) { |
| 265 auto jsobject = JSObject::cast(object()); | 265 auto jsobject = JSObject::cast(object()); |
| 266 int field_count = jsobject->GetInternalFieldCount(); | 266 int field_count = jsobject->GetEmbedderFieldCount(); |
| 267 for (int i = 0; i < v8::kInternalFieldsInWeakCallback; ++i) { | 267 for (int i = 0; i < v8::kEmbedderFieldsInWeakCallback; ++i) { |
| 268 if (field_count == i) break; | 268 if (field_count == i) break; |
| 269 auto field = jsobject->GetInternalField(i); | 269 auto field = jsobject->GetEmbedderField(i); |
| 270 if (field->IsSmi()) internal_fields[i] = field; | 270 if (field->IsSmi()) embedder_fields[i] = field; |
| 271 } | 271 } |
| 272 } | 272 } |
| 273 | 273 |
| 274 // Zap with something dangerous. | 274 // Zap with something dangerous. |
| 275 *location() = reinterpret_cast<Object*>(0x6057ca11); | 275 *location() = reinterpret_cast<Object*>(0x6057ca11); |
| 276 | 276 |
| 277 typedef v8::WeakCallbackInfo<void> Data; | 277 typedef v8::WeakCallbackInfo<void> Data; |
| 278 auto callback = reinterpret_cast<Data::Callback>(weak_callback_); | 278 auto callback = reinterpret_cast<Data::Callback>(weak_callback_); |
| 279 pending_phantom_callbacks->Add( | 279 pending_phantom_callbacks->Add( |
| 280 PendingPhantomCallback(this, callback, parameter(), internal_fields)); | 280 PendingPhantomCallback(this, callback, parameter(), embedder_fields)); |
| 281 DCHECK(IsInUse()); | 281 DCHECK(IsInUse()); |
| 282 set_state(NEAR_DEATH); | 282 set_state(NEAR_DEATH); |
| 283 } | 283 } |
| 284 | 284 |
| 285 void ResetPhantomHandle() { | 285 void ResetPhantomHandle() { |
| 286 DCHECK(weakness_type() == PHANTOM_WEAK_RESET_HANDLE); | 286 DCHECK(weakness_type() == PHANTOM_WEAK_RESET_HANDLE); |
| 287 DCHECK(state() == PENDING); | 287 DCHECK(state() == PENDING); |
| 288 DCHECK(weak_callback_ == nullptr); | 288 DCHECK(weak_callback_ == nullptr); |
| 289 Object*** handle = reinterpret_cast<Object***>(parameter()); | 289 Object*** handle = reinterpret_cast<Object***>(parameter()); |
| 290 *handle = nullptr; | 290 *handle = nullptr; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 306 ExternalOneByteString::cast(object_)->resource() != NULL); | 306 ExternalOneByteString::cast(object_)->resource() != NULL); |
| 307 DCHECK(!object_->IsExternalTwoByteString() || | 307 DCHECK(!object_->IsExternalTwoByteString() || |
| 308 ExternalTwoByteString::cast(object_)->resource() != NULL); | 308 ExternalTwoByteString::cast(object_)->resource() != NULL); |
| 309 if (weakness_type() != FINALIZER_WEAK) { | 309 if (weakness_type() != FINALIZER_WEAK) { |
| 310 return false; | 310 return false; |
| 311 } | 311 } |
| 312 | 312 |
| 313 // Leaving V8. | 313 // Leaving V8. |
| 314 VMState<EXTERNAL> vmstate(isolate); | 314 VMState<EXTERNAL> vmstate(isolate); |
| 315 HandleScope handle_scope(isolate); | 315 HandleScope handle_scope(isolate); |
| 316 void* internal_fields[v8::kInternalFieldsInWeakCallback] = {nullptr, | 316 void* embedder_fields[v8::kEmbedderFieldsInWeakCallback] = {nullptr, |
| 317 nullptr}; | 317 nullptr}; |
| 318 v8::WeakCallbackInfo<void> data(reinterpret_cast<v8::Isolate*>(isolate), | 318 v8::WeakCallbackInfo<void> data(reinterpret_cast<v8::Isolate*>(isolate), |
| 319 parameter(), internal_fields, nullptr); | 319 parameter(), embedder_fields, nullptr); |
| 320 weak_callback_(data); | 320 weak_callback_(data); |
| 321 | 321 |
| 322 // Absence of explicit cleanup or revival of weak handle | 322 // Absence of explicit cleanup or revival of weak handle |
| 323 // in most of the cases would lead to memory leak. | 323 // in most of the cases would lead to memory leak. |
| 324 CHECK(state() != NEAR_DEATH); | 324 CHECK(state() != NEAR_DEATH); |
| 325 return true; | 325 return true; |
| 326 } | 326 } |
| 327 | 327 |
| 328 inline GlobalHandles* GetGlobalHandles(); | 328 inline GlobalHandles* GetGlobalHandles(); |
| 329 | 329 |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 | 875 |
| 876 | 876 |
| 877 void GlobalHandles::PendingPhantomCallback::Invoke(Isolate* isolate) { | 877 void GlobalHandles::PendingPhantomCallback::Invoke(Isolate* isolate) { |
| 878 Data::Callback* callback_addr = nullptr; | 878 Data::Callback* callback_addr = nullptr; |
| 879 if (node_ != nullptr) { | 879 if (node_ != nullptr) { |
| 880 // Initialize for first pass callback. | 880 // Initialize for first pass callback. |
| 881 DCHECK(node_->state() == Node::NEAR_DEATH); | 881 DCHECK(node_->state() == Node::NEAR_DEATH); |
| 882 callback_addr = &callback_; | 882 callback_addr = &callback_; |
| 883 } | 883 } |
| 884 Data data(reinterpret_cast<v8::Isolate*>(isolate), parameter_, | 884 Data data(reinterpret_cast<v8::Isolate*>(isolate), parameter_, |
| 885 internal_fields_, callback_addr); | 885 embedder_fields_, callback_addr); |
| 886 Data::Callback callback = callback_; | 886 Data::Callback callback = callback_; |
| 887 callback_ = nullptr; | 887 callback_ = nullptr; |
| 888 callback(data); | 888 callback(data); |
| 889 if (node_ != nullptr) { | 889 if (node_ != nullptr) { |
| 890 // Transition to second pass state. | 890 // Transition to second pass state. |
| 891 DCHECK(node_->state() == Node::FREE); | 891 DCHECK(node_->state() == Node::FREE); |
| 892 node_ = nullptr; | 892 node_ = nullptr; |
| 893 } | 893 } |
| 894 } | 894 } |
| 895 | 895 |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 blocks_[block][offset] = object; | 1127 blocks_[block][offset] = object; |
| 1128 if (isolate->heap()->InNewSpace(object)) { | 1128 if (isolate->heap()->InNewSpace(object)) { |
| 1129 new_space_indices_.Add(size_); | 1129 new_space_indices_.Add(size_); |
| 1130 } | 1130 } |
| 1131 *index = size_++; | 1131 *index = size_++; |
| 1132 } | 1132 } |
| 1133 | 1133 |
| 1134 | 1134 |
| 1135 } // namespace internal | 1135 } // namespace internal |
| 1136 } // namespace v8 | 1136 } // namespace v8 |
| OLD | NEW |