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 |