OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 ASSERT(state() == WEAK); | 192 ASSERT(state() == WEAK); |
193 set_state(PENDING); | 193 set_state(PENDING); |
194 } | 194 } |
195 | 195 |
196 // Independent flag accessors. | 196 // Independent flag accessors. |
197 void MarkIndependent() { | 197 void MarkIndependent() { |
198 ASSERT(state() != FREE); | 198 ASSERT(state() != FREE); |
199 set_independent(true); | 199 set_independent(true); |
200 } | 200 } |
201 | 201 |
202 void MarkPartiallyDependent(GlobalHandles* global_handles) { | 202 void MarkPartiallyDependent() { |
203 ASSERT(state() != FREE); | 203 ASSERT(state() != FREE); |
204 if (global_handles->isolate()->heap()->InNewSpace(object_)) { | 204 if (GetGlobalHandles()->isolate()->heap()->InNewSpace(object_)) { |
205 set_partially_dependent(true); | 205 set_partially_dependent(true); |
206 } | 206 } |
207 } | 207 } |
208 void clear_partially_dependent() { set_partially_dependent(false); } | 208 void clear_partially_dependent() { set_partially_dependent(false); } |
209 | 209 |
210 // Callback accessor. | 210 // Callback accessor. |
211 // TODO(svenpanne) Re-enable or nuke later. | 211 // TODO(svenpanne) Re-enable or nuke later. |
212 // WeakReferenceCallback callback() { return callback_; } | 212 // WeakReferenceCallback callback() { return callback_; } |
213 | 213 |
214 // Callback parameter accessors. | 214 // Callback parameter accessors. |
215 void set_parameter(void* parameter) { | 215 void set_parameter(void* parameter) { |
216 ASSERT(state() != FREE); | 216 ASSERT(state() != FREE); |
217 parameter_or_next_free_.parameter = parameter; | 217 parameter_or_next_free_.parameter = parameter; |
218 } | 218 } |
219 void* parameter() const { | 219 void* parameter() const { |
220 ASSERT(state() != FREE); | 220 ASSERT(state() != FREE); |
221 return parameter_or_next_free_.parameter; | 221 return parameter_or_next_free_.parameter; |
222 } | 222 } |
223 | 223 |
224 // Accessors for next free node in the free list. | 224 // Accessors for next free node in the free list. |
225 Node* next_free() { | 225 Node* next_free() { |
226 ASSERT(state() == FREE); | 226 ASSERT(state() == FREE); |
227 return parameter_or_next_free_.next_free; | 227 return parameter_or_next_free_.next_free; |
228 } | 228 } |
229 void set_next_free(Node* value) { | 229 void set_next_free(Node* value) { |
230 ASSERT(state() == FREE); | 230 ASSERT(state() == FREE); |
231 parameter_or_next_free_.next_free = value; | 231 parameter_or_next_free_.next_free = value; |
232 } | 232 } |
233 | 233 |
234 void MakeWeak(GlobalHandles* global_handles, | 234 void MakeWeak(void* parameter, |
235 void* parameter, | |
236 RevivableCallback weak_reference_callback, | 235 RevivableCallback weak_reference_callback, |
237 NearDeathCallback near_death_callback) { | 236 NearDeathCallback near_death_callback) { |
238 ASSERT(state() != FREE); | 237 ASSERT(state() != FREE); |
239 set_state(WEAK); | 238 set_state(WEAK); |
240 set_parameter(parameter); | 239 set_parameter(parameter); |
241 if (weak_reference_callback != NULL) { | 240 if (weak_reference_callback != NULL) { |
242 flags_ = IsWeakCallback::update(flags_, true); | 241 flags_ = IsWeakCallback::update(flags_, true); |
243 near_death_callback_ = | 242 near_death_callback_ = |
244 reinterpret_cast<NearDeathCallback>(weak_reference_callback); | 243 reinterpret_cast<NearDeathCallback>(weak_reference_callback); |
245 } else { | 244 } else { |
246 flags_ = IsWeakCallback::update(flags_, false); | 245 flags_ = IsWeakCallback::update(flags_, false); |
247 near_death_callback_ = near_death_callback; | 246 near_death_callback_ = near_death_callback; |
248 } | 247 } |
249 } | 248 } |
250 | 249 |
251 void ClearWeakness(GlobalHandles* global_handles) { | 250 void ClearWeakness() { |
252 ASSERT(state() != FREE); | 251 ASSERT(state() != FREE); |
253 set_state(NORMAL); | 252 set_state(NORMAL); |
254 set_parameter(NULL); | 253 set_parameter(NULL); |
255 } | 254 } |
256 | 255 |
257 bool PostGarbageCollectionProcessing(Isolate* isolate) { | 256 bool PostGarbageCollectionProcessing(Isolate* isolate) { |
258 if (state() != Node::PENDING) return false; | 257 if (state() != Node::PENDING) return false; |
259 if (near_death_callback_ == NULL) { | 258 if (near_death_callback_ == NULL) { |
260 Release(); | 259 Release(); |
261 return false; | 260 return false; |
(...skipping 27 matching lines...) Expand all Loading... |
289 } | 288 } |
290 } | 289 } |
291 // Absence of explicit cleanup or revival of weak handle | 290 // Absence of explicit cleanup or revival of weak handle |
292 // in most of the cases would lead to memory leak. | 291 // in most of the cases would lead to memory leak. |
293 ASSERT(state() != NEAR_DEATH); | 292 ASSERT(state() != NEAR_DEATH); |
294 return true; | 293 return true; |
295 } | 294 } |
296 | 295 |
297 private: | 296 private: |
298 inline NodeBlock* FindBlock(); | 297 inline NodeBlock* FindBlock(); |
| 298 inline GlobalHandles* GetGlobalHandles(); |
299 inline void IncreaseBlockUses(); | 299 inline void IncreaseBlockUses(); |
300 inline void DecreaseBlockUses(); | 300 inline void DecreaseBlockUses(); |
301 | 301 |
302 // Storage for object pointer. | 302 // Storage for object pointer. |
303 // Placed first to avoid offset computation. | 303 // Placed first to avoid offset computation. |
304 Object* object_; | 304 Object* object_; |
305 | 305 |
306 // Next word stores class_id, index, state, and independent. | 306 // Next word stores class_id, index, state, and independent. |
307 // Note: the most aligned fields should go first. | 307 // Note: the most aligned fields should go first. |
308 | 308 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 private: | 393 private: |
394 Node nodes_[kSize]; | 394 Node nodes_[kSize]; |
395 NodeBlock* const next_; | 395 NodeBlock* const next_; |
396 int used_nodes_; | 396 int used_nodes_; |
397 NodeBlock* next_used_; | 397 NodeBlock* next_used_; |
398 NodeBlock* prev_used_; | 398 NodeBlock* prev_used_; |
399 GlobalHandles* global_handles_; | 399 GlobalHandles* global_handles_; |
400 }; | 400 }; |
401 | 401 |
402 | 402 |
| 403 GlobalHandles* GlobalHandles::Node::GetGlobalHandles() { |
| 404 return FindBlock()->global_handles(); |
| 405 } |
| 406 |
| 407 |
403 GlobalHandles::NodeBlock* GlobalHandles::Node::FindBlock() { | 408 GlobalHandles::NodeBlock* GlobalHandles::Node::FindBlock() { |
404 intptr_t ptr = reinterpret_cast<intptr_t>(this); | 409 intptr_t ptr = reinterpret_cast<intptr_t>(this); |
405 ptr = ptr - index_ * sizeof(Node); | 410 ptr = ptr - index_ * sizeof(Node); |
406 NodeBlock* block = reinterpret_cast<NodeBlock*>(ptr); | 411 NodeBlock* block = reinterpret_cast<NodeBlock*>(ptr); |
407 ASSERT(block->node_at(index_) == this); | 412 ASSERT(block->node_at(index_) == this); |
408 return block; | 413 return block; |
409 } | 414 } |
410 | 415 |
411 | 416 |
412 void GlobalHandles::Node::IncreaseBlockUses() { | 417 void GlobalHandles::Node::IncreaseBlockUses() { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 void GlobalHandles::Destroy(Object** location) { | 505 void GlobalHandles::Destroy(Object** location) { |
501 if (location != NULL) Node::FromLocation(location)->Release(); | 506 if (location != NULL) Node::FromLocation(location)->Release(); |
502 } | 507 } |
503 | 508 |
504 | 509 |
505 void GlobalHandles::MakeWeak(Object** location, | 510 void GlobalHandles::MakeWeak(Object** location, |
506 void* parameter, | 511 void* parameter, |
507 RevivableCallback weak_reference_callback, | 512 RevivableCallback weak_reference_callback, |
508 NearDeathCallback near_death_callback) { | 513 NearDeathCallback near_death_callback) { |
509 ASSERT((weak_reference_callback == NULL) != (near_death_callback == NULL)); | 514 ASSERT((weak_reference_callback == NULL) != (near_death_callback == NULL)); |
510 Node::FromLocation(location)->MakeWeak(this, | 515 Node::FromLocation(location)->MakeWeak(parameter, |
511 parameter, | |
512 weak_reference_callback, | 516 weak_reference_callback, |
513 near_death_callback); | 517 near_death_callback); |
514 } | 518 } |
515 | 519 |
516 | 520 |
517 void GlobalHandles::ClearWeakness(Object** location) { | 521 void GlobalHandles::ClearWeakness(Object** location) { |
518 Node::FromLocation(location)->ClearWeakness(this); | 522 Node::FromLocation(location)->ClearWeakness(); |
519 } | 523 } |
520 | 524 |
521 | 525 |
522 void GlobalHandles::MarkIndependent(Object** location) { | 526 void GlobalHandles::MarkIndependent(Object** location) { |
523 Node::FromLocation(location)->MarkIndependent(); | 527 Node::FromLocation(location)->MarkIndependent(); |
524 } | 528 } |
525 | 529 |
526 | 530 |
527 void GlobalHandles::MarkPartiallyDependent(Object** location) { | 531 void GlobalHandles::MarkPartiallyDependent(Object** location) { |
528 Node::FromLocation(location)->MarkPartiallyDependent(this); | 532 Node::FromLocation(location)->MarkPartiallyDependent(); |
529 } | 533 } |
530 | 534 |
531 | 535 |
532 bool GlobalHandles::IsIndependent(Object** location) { | 536 bool GlobalHandles::IsIndependent(Object** location) { |
533 return Node::FromLocation(location)->is_independent(); | 537 return Node::FromLocation(location)->is_independent(); |
534 } | 538 } |
535 | 539 |
536 | 540 |
537 bool GlobalHandles::IsNearDeath(Object** location) { | 541 bool GlobalHandles::IsNearDeath(Object** location) { |
538 return Node::FromLocation(location)->IsNearDeath(); | 542 return Node::FromLocation(location)->IsNearDeath(); |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1021 } | 1025 } |
1022 } | 1026 } |
1023 object_group_connections_.Clear(); | 1027 object_group_connections_.Clear(); |
1024 object_group_connections_.Initialize(kObjectGroupConnectionsCapacity); | 1028 object_group_connections_.Initialize(kObjectGroupConnectionsCapacity); |
1025 retainer_infos_.Clear(); | 1029 retainer_infos_.Clear(); |
1026 implicit_ref_connections_.Clear(); | 1030 implicit_ref_connections_.Clear(); |
1027 } | 1031 } |
1028 | 1032 |
1029 | 1033 |
1030 } } // namespace v8::internal | 1034 } } // namespace v8::internal |
OLD | NEW |