| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 CHECK_EQ(gc_ends, gc_starts); | 297 CHECK_EQ(gc_ends, gc_starts); |
| 298 | 298 |
| 299 HEAP->CollectGarbage(OLD_POINTER_SPACE); | 299 HEAP->CollectGarbage(OLD_POINTER_SPACE); |
| 300 CHECK_EQ(1, gc_starts); | 300 CHECK_EQ(1, gc_starts); |
| 301 CHECK_EQ(gc_ends, gc_starts); | 301 CHECK_EQ(gc_ends, gc_starts); |
| 302 } | 302 } |
| 303 | 303 |
| 304 | 304 |
| 305 static int NumberOfWeakCalls = 0; | 305 static int NumberOfWeakCalls = 0; |
| 306 static void WeakPointerCallback(v8::Isolate* isolate, | 306 static void WeakPointerCallback(v8::Isolate* isolate, |
| 307 v8::Persistent<v8::Value> handle, | 307 v8::Persistent<v8::Value>* handle, |
| 308 void* id) { | 308 void* id) { |
| 309 ASSERT(id == reinterpret_cast<void*>(1234)); | 309 ASSERT(id == reinterpret_cast<void*>(1234)); |
| 310 NumberOfWeakCalls++; | 310 NumberOfWeakCalls++; |
| 311 handle.Dispose(isolate); | 311 handle->Dispose(isolate); |
| 312 } | 312 } |
| 313 | 313 |
| 314 TEST(ObjectGroups) { | 314 TEST(ObjectGroups) { |
| 315 FLAG_incremental_marking = false; | 315 FLAG_incremental_marking = false; |
| 316 CcTest::InitializeVM(); | 316 CcTest::InitializeVM(); |
| 317 GlobalHandles* global_handles = Isolate::Current()->global_handles(); | 317 GlobalHandles* global_handles = Isolate::Current()->global_handles(); |
| 318 | 318 |
| 319 NumberOfWeakCalls = 0; | 319 NumberOfWeakCalls = 0; |
| 320 v8::HandleScope handle_scope(CcTest::isolate()); | 320 v8::HandleScope handle_scope(CcTest::isolate()); |
| 321 | 321 |
| 322 Handle<Object> g1s1 = | 322 Handle<Object> g1s1 = |
| 323 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); | 323 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); |
| 324 Handle<Object> g1s2 = | 324 Handle<Object> g1s2 = |
| 325 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); | 325 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); |
| 326 Handle<Object> g1c1 = | 326 Handle<Object> g1c1 = |
| 327 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); | 327 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); |
| 328 global_handles->MakeWeak(g1s1.location(), | 328 global_handles->MakeWeak(g1s1.location(), |
| 329 reinterpret_cast<void*>(1234), | 329 reinterpret_cast<void*>(1234), |
| 330 NULL, | 330 &WeakPointerCallback, |
| 331 &WeakPointerCallback); | 331 NULL); |
| 332 global_handles->MakeWeak(g1s2.location(), | 332 global_handles->MakeWeak(g1s2.location(), |
| 333 reinterpret_cast<void*>(1234), | 333 reinterpret_cast<void*>(1234), |
| 334 NULL, | 334 &WeakPointerCallback, |
| 335 &WeakPointerCallback); | 335 NULL); |
| 336 global_handles->MakeWeak(g1c1.location(), | 336 global_handles->MakeWeak(g1c1.location(), |
| 337 reinterpret_cast<void*>(1234), | 337 reinterpret_cast<void*>(1234), |
| 338 NULL, | 338 &WeakPointerCallback, |
| 339 &WeakPointerCallback); | 339 NULL); |
| 340 | 340 |
| 341 Handle<Object> g2s1 = | 341 Handle<Object> g2s1 = |
| 342 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); | 342 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); |
| 343 Handle<Object> g2s2 = | 343 Handle<Object> g2s2 = |
| 344 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); | 344 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); |
| 345 Handle<Object> g2c1 = | 345 Handle<Object> g2c1 = |
| 346 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); | 346 global_handles->Create(HEAP->AllocateFixedArray(1)->ToObjectChecked()); |
| 347 global_handles->MakeWeak(g2s1.location(), | 347 global_handles->MakeWeak(g2s1.location(), |
| 348 reinterpret_cast<void*>(1234), | 348 reinterpret_cast<void*>(1234), |
| 349 NULL, | 349 &WeakPointerCallback, |
| 350 &WeakPointerCallback); | 350 NULL); |
| 351 global_handles->MakeWeak(g2s2.location(), | 351 global_handles->MakeWeak(g2s2.location(), |
| 352 reinterpret_cast<void*>(1234), | 352 reinterpret_cast<void*>(1234), |
| 353 NULL, | 353 &WeakPointerCallback, |
| 354 &WeakPointerCallback); | 354 NULL); |
| 355 global_handles->MakeWeak(g2c1.location(), | 355 global_handles->MakeWeak(g2c1.location(), |
| 356 reinterpret_cast<void*>(1234), | 356 reinterpret_cast<void*>(1234), |
| 357 NULL, | 357 &WeakPointerCallback, |
| 358 &WeakPointerCallback); | 358 NULL); |
| 359 | 359 |
| 360 Handle<Object> root = global_handles->Create(*g1s1); // make a root. | 360 Handle<Object> root = global_handles->Create(*g1s1); // make a root. |
| 361 | 361 |
| 362 // Connect group 1 and 2, make a cycle. | 362 // Connect group 1 and 2, make a cycle. |
| 363 Handle<FixedArray>::cast(g1s2)->set(0, *g2s2); | 363 Handle<FixedArray>::cast(g1s2)->set(0, *g2s2); |
| 364 Handle<FixedArray>::cast(g2s1)->set(0, *g1s1); | 364 Handle<FixedArray>::cast(g2s1)->set(0, *g1s1); |
| 365 | 365 |
| 366 { | 366 { |
| 367 Object** g1_objects[] = { g1s1.location(), g1s2.location() }; | 367 Object** g1_objects[] = { g1s1.location(), g1s2.location() }; |
| 368 Object** g1_children[] = { g1c1.location() }; | 368 Object** g1_children[] = { g1c1.location() }; |
| 369 Object** g2_objects[] = { g2s1.location(), g2s2.location() }; | 369 Object** g2_objects[] = { g2s1.location(), g2s2.location() }; |
| 370 Object** g2_children[] = { g2c1.location() }; | 370 Object** g2_children[] = { g2c1.location() }; |
| 371 global_handles->AddObjectGroup(g1_objects, 2, NULL); | 371 global_handles->AddObjectGroup(g1_objects, 2, NULL); |
| 372 global_handles->AddImplicitReferences( | 372 global_handles->AddImplicitReferences( |
| 373 Handle<HeapObject>::cast(g1s1).location(), g1_children, 1); | 373 Handle<HeapObject>::cast(g1s1).location(), g1_children, 1); |
| 374 global_handles->AddObjectGroup(g2_objects, 2, NULL); | 374 global_handles->AddObjectGroup(g2_objects, 2, NULL); |
| 375 global_handles->AddImplicitReferences( | 375 global_handles->AddImplicitReferences( |
| 376 Handle<HeapObject>::cast(g2s1).location(), g2_children, 1); | 376 Handle<HeapObject>::cast(g2s1).location(), g2_children, 1); |
| 377 } | 377 } |
| 378 // Do a full GC | 378 // Do a full GC |
| 379 HEAP->CollectGarbage(OLD_POINTER_SPACE); | 379 HEAP->CollectGarbage(OLD_POINTER_SPACE); |
| 380 | 380 |
| 381 // All object should be alive. | 381 // All object should be alive. |
| 382 CHECK_EQ(0, NumberOfWeakCalls); | 382 CHECK_EQ(0, NumberOfWeakCalls); |
| 383 | 383 |
| 384 // Weaken the root. | 384 // Weaken the root. |
| 385 global_handles->MakeWeak(root.location(), | 385 global_handles->MakeWeak(root.location(), |
| 386 reinterpret_cast<void*>(1234), | 386 reinterpret_cast<void*>(1234), |
| 387 NULL, | 387 &WeakPointerCallback, |
| 388 &WeakPointerCallback); | 388 NULL); |
| 389 // But make children strong roots---all the objects (except for children) | 389 // But make children strong roots---all the objects (except for children) |
| 390 // should be collectable now. | 390 // should be collectable now. |
| 391 global_handles->ClearWeakness(g1c1.location()); | 391 global_handles->ClearWeakness(g1c1.location()); |
| 392 global_handles->ClearWeakness(g2c1.location()); | 392 global_handles->ClearWeakness(g2c1.location()); |
| 393 | 393 |
| 394 // Groups are deleted, rebuild groups. | 394 // Groups are deleted, rebuild groups. |
| 395 { | 395 { |
| 396 Object** g1_objects[] = { g1s1.location(), g1s2.location() }; | 396 Object** g1_objects[] = { g1s1.location(), g1s2.location() }; |
| 397 Object** g1_children[] = { g1c1.location() }; | 397 Object** g1_children[] = { g1c1.location() }; |
| 398 Object** g2_objects[] = { g2s1.location(), g2s2.location() }; | 398 Object** g2_objects[] = { g2s1.location(), g2s2.location() }; |
| 399 Object** g2_children[] = { g2c1.location() }; | 399 Object** g2_children[] = { g2c1.location() }; |
| 400 global_handles->AddObjectGroup(g1_objects, 2, NULL); | 400 global_handles->AddObjectGroup(g1_objects, 2, NULL); |
| 401 global_handles->AddImplicitReferences( | 401 global_handles->AddImplicitReferences( |
| 402 Handle<HeapObject>::cast(g1s1).location(), g1_children, 1); | 402 Handle<HeapObject>::cast(g1s1).location(), g1_children, 1); |
| 403 global_handles->AddObjectGroup(g2_objects, 2, NULL); | 403 global_handles->AddObjectGroup(g2_objects, 2, NULL); |
| 404 global_handles->AddImplicitReferences( | 404 global_handles->AddImplicitReferences( |
| 405 Handle<HeapObject>::cast(g2s1).location(), g2_children, 1); | 405 Handle<HeapObject>::cast(g2s1).location(), g2_children, 1); |
| 406 } | 406 } |
| 407 | 407 |
| 408 HEAP->CollectGarbage(OLD_POINTER_SPACE); | 408 HEAP->CollectGarbage(OLD_POINTER_SPACE); |
| 409 | 409 |
| 410 // All objects should be gone. 5 global handles in total. | 410 // All objects should be gone. 5 global handles in total. |
| 411 CHECK_EQ(5, NumberOfWeakCalls); | 411 CHECK_EQ(5, NumberOfWeakCalls); |
| 412 | 412 |
| 413 // And now make children weak again and collect them. | 413 // And now make children weak again and collect them. |
| 414 global_handles->MakeWeak(g1c1.location(), | 414 global_handles->MakeWeak(g1c1.location(), |
| 415 reinterpret_cast<void*>(1234), | 415 reinterpret_cast<void*>(1234), |
| 416 NULL, | 416 &WeakPointerCallback, |
| 417 &WeakPointerCallback); | 417 NULL); |
| 418 global_handles->MakeWeak(g2c1.location(), | 418 global_handles->MakeWeak(g2c1.location(), |
| 419 reinterpret_cast<void*>(1234), | 419 reinterpret_cast<void*>(1234), |
| 420 NULL, | 420 &WeakPointerCallback, |
| 421 &WeakPointerCallback); | 421 NULL); |
| 422 | 422 |
| 423 HEAP->CollectGarbage(OLD_POINTER_SPACE); | 423 HEAP->CollectGarbage(OLD_POINTER_SPACE); |
| 424 CHECK_EQ(7, NumberOfWeakCalls); | 424 CHECK_EQ(7, NumberOfWeakCalls); |
| 425 } | 425 } |
| 426 | 426 |
| 427 | 427 |
| 428 class TestRetainedObjectInfo : public v8::RetainedObjectInfo { | 428 class TestRetainedObjectInfo : public v8::RetainedObjectInfo { |
| 429 public: | 429 public: |
| 430 TestRetainedObjectInfo() : has_been_disposed_(false) {} | 430 TestRetainedObjectInfo() : has_been_disposed_(false) {} |
| 431 | 431 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 if (v8::internal::Snapshot::IsEnabled()) { | 563 if (v8::internal::Snapshot::IsEnabled()) { |
| 564 CHECK_LE(delta, 2900 * 1024); | 564 CHECK_LE(delta, 2900 * 1024); |
| 565 } else { | 565 } else { |
| 566 CHECK_LE(delta, 3400 * 1024); | 566 CHECK_LE(delta, 3400 * 1024); |
| 567 } | 567 } |
| 568 } | 568 } |
| 569 } | 569 } |
| 570 } | 570 } |
| 571 | 571 |
| 572 #endif // __linux__ and !USE_SIMULATOR | 572 #endif // __linux__ and !USE_SIMULATOR |
| OLD | NEW |