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 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 | 389 |
390 CHECK_EQ(*h4, *h2); | 390 CHECK_EQ(*h4, *h2); |
391 global_handles->Destroy(h2.location()); | 391 global_handles->Destroy(h2.location()); |
392 global_handles->Destroy(h4.location()); | 392 global_handles->Destroy(h4.location()); |
393 } | 393 } |
394 | 394 |
395 | 395 |
396 static bool WeakPointerCleared = false; | 396 static bool WeakPointerCleared = false; |
397 | 397 |
398 static void TestWeakGlobalHandleCallback(v8::Isolate* isolate, | 398 static void TestWeakGlobalHandleCallback(v8::Isolate* isolate, |
399 v8::Persistent<v8::Value> handle, | 399 v8::Persistent<v8::Value>* handle, |
400 void* id) { | 400 void* id) { |
401 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true; | 401 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true; |
402 handle.Dispose(isolate); | 402 handle->Dispose(isolate); |
403 } | 403 } |
404 | 404 |
405 | 405 |
406 TEST(WeakGlobalHandlesScavenge) { | 406 TEST(WeakGlobalHandlesScavenge) { |
407 CcTest::InitializeVM(); | 407 CcTest::InitializeVM(); |
408 Isolate* isolate = Isolate::Current(); | 408 Isolate* isolate = Isolate::Current(); |
409 Heap* heap = isolate->heap(); | 409 Heap* heap = isolate->heap(); |
410 Factory* factory = isolate->factory(); | 410 Factory* factory = isolate->factory(); |
411 GlobalHandles* global_handles = isolate->global_handles(); | 411 GlobalHandles* global_handles = isolate->global_handles(); |
412 | 412 |
413 WeakPointerCleared = false; | 413 WeakPointerCleared = false; |
414 | 414 |
415 Handle<Object> h1; | 415 Handle<Object> h1; |
416 Handle<Object> h2; | 416 Handle<Object> h2; |
417 | 417 |
418 { | 418 { |
419 HandleScope scope(isolate); | 419 HandleScope scope(isolate); |
420 | 420 |
421 Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk")); | 421 Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk")); |
422 Handle<Object> u = factory->NewNumber(1.12344); | 422 Handle<Object> u = factory->NewNumber(1.12344); |
423 | 423 |
424 h1 = global_handles->Create(*i); | 424 h1 = global_handles->Create(*i); |
425 h2 = global_handles->Create(*u); | 425 h2 = global_handles->Create(*u); |
426 } | 426 } |
427 | 427 |
428 global_handles->MakeWeak(h2.location(), | 428 global_handles->MakeWeak(h2.location(), |
429 reinterpret_cast<void*>(1234), | 429 reinterpret_cast<void*>(1234), |
430 NULL, | 430 &TestWeakGlobalHandleCallback, |
431 &TestWeakGlobalHandleCallback); | 431 NULL); |
432 | 432 |
433 // Scavenge treats weak pointers as normal roots. | 433 // Scavenge treats weak pointers as normal roots. |
434 heap->PerformScavenge(); | 434 heap->PerformScavenge(); |
435 | 435 |
436 CHECK((*h1)->IsString()); | 436 CHECK((*h1)->IsString()); |
437 CHECK((*h2)->IsHeapNumber()); | 437 CHECK((*h2)->IsHeapNumber()); |
438 | 438 |
439 CHECK(!WeakPointerCleared); | 439 CHECK(!WeakPointerCleared); |
440 CHECK(!global_handles->IsNearDeath(h2.location())); | 440 CHECK(!global_handles->IsNearDeath(h2.location())); |
441 CHECK(!global_handles->IsNearDeath(h1.location())); | 441 CHECK(!global_handles->IsNearDeath(h1.location())); |
(...skipping 25 matching lines...) Expand all Loading... |
467 h2 = global_handles->Create(*u); | 467 h2 = global_handles->Create(*u); |
468 } | 468 } |
469 | 469 |
470 // Make sure the objects are promoted. | 470 // Make sure the objects are promoted. |
471 heap->CollectGarbage(OLD_POINTER_SPACE); | 471 heap->CollectGarbage(OLD_POINTER_SPACE); |
472 heap->CollectGarbage(NEW_SPACE); | 472 heap->CollectGarbage(NEW_SPACE); |
473 CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2)); | 473 CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2)); |
474 | 474 |
475 global_handles->MakeWeak(h2.location(), | 475 global_handles->MakeWeak(h2.location(), |
476 reinterpret_cast<void*>(1234), | 476 reinterpret_cast<void*>(1234), |
477 NULL, | 477 &TestWeakGlobalHandleCallback, |
478 &TestWeakGlobalHandleCallback); | 478 NULL); |
479 CHECK(!GlobalHandles::IsNearDeath(h1.location())); | 479 CHECK(!GlobalHandles::IsNearDeath(h1.location())); |
480 CHECK(!GlobalHandles::IsNearDeath(h2.location())); | 480 CHECK(!GlobalHandles::IsNearDeath(h2.location())); |
481 | 481 |
482 // Incremental marking potentially marked handles before they turned weak. | 482 // Incremental marking potentially marked handles before they turned weak. |
483 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 483 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
484 | 484 |
485 CHECK((*h1)->IsString()); | 485 CHECK((*h1)->IsString()); |
486 | 486 |
487 CHECK(WeakPointerCleared); | 487 CHECK(WeakPointerCleared); |
488 CHECK(!GlobalHandles::IsNearDeath(h1.location())); | 488 CHECK(!GlobalHandles::IsNearDeath(h1.location())); |
(...skipping 15 matching lines...) Expand all Loading... |
504 | 504 |
505 { | 505 { |
506 HandleScope scope(isolate); | 506 HandleScope scope(isolate); |
507 | 507 |
508 Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk")); | 508 Handle<Object> i = factory->NewStringFromAscii(CStrVector("fisk")); |
509 h = global_handles->Create(*i); | 509 h = global_handles->Create(*i); |
510 } | 510 } |
511 | 511 |
512 global_handles->MakeWeak(h.location(), | 512 global_handles->MakeWeak(h.location(), |
513 reinterpret_cast<void*>(1234), | 513 reinterpret_cast<void*>(1234), |
514 NULL, | 514 &TestWeakGlobalHandleCallback, |
515 &TestWeakGlobalHandleCallback); | 515 NULL); |
516 | 516 |
517 // Scanvenge does not recognize weak reference. | 517 // Scanvenge does not recognize weak reference. |
518 heap->PerformScavenge(); | 518 heap->PerformScavenge(); |
519 | 519 |
520 CHECK(!WeakPointerCleared); | 520 CHECK(!WeakPointerCleared); |
521 | 521 |
522 // Mark-compact treats weak reference properly. | 522 // Mark-compact treats weak reference properly. |
523 heap->CollectGarbage(OLD_POINTER_SPACE); | 523 heap->CollectGarbage(OLD_POINTER_SPACE); |
524 | 524 |
525 CHECK(WeakPointerCleared); | 525 CHECK(WeakPointerCleared); |
(...skipping 2539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3065 } | 3065 } |
3066 // An entire block of handles has been filled. | 3066 // An entire block of handles has been filled. |
3067 // Next handle would require a new block. | 3067 // Next handle would require a new block. |
3068 ASSERT(data->next == data->limit); | 3068 ASSERT(data->next == data->limit); |
3069 | 3069 |
3070 DeferredHandleScope deferred(isolate); | 3070 DeferredHandleScope deferred(isolate); |
3071 DummyVisitor visitor; | 3071 DummyVisitor visitor; |
3072 isolate->handle_scope_implementer()->Iterate(&visitor); | 3072 isolate->handle_scope_implementer()->Iterate(&visitor); |
3073 deferred.Detach(); | 3073 deferred.Detach(); |
3074 } | 3074 } |
OLD | NEW |