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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 using ::v8::Message; | 60 using ::v8::Message; |
61 using ::v8::MessageCallback; | 61 using ::v8::MessageCallback; |
62 using ::v8::Object; | 62 using ::v8::Object; |
63 using ::v8::ObjectTemplate; | 63 using ::v8::ObjectTemplate; |
64 using ::v8::Persistent; | 64 using ::v8::Persistent; |
65 using ::v8::Script; | 65 using ::v8::Script; |
66 using ::v8::StackTrace; | 66 using ::v8::StackTrace; |
67 using ::v8::String; | 67 using ::v8::String; |
68 using ::v8::TryCatch; | 68 using ::v8::TryCatch; |
69 using ::v8::Undefined; | 69 using ::v8::Undefined; |
70 using ::v8::UniqueId; | |
71 using ::v8::V8; | 70 using ::v8::V8; |
72 using ::v8::Value; | 71 using ::v8::Value; |
73 | 72 |
74 | 73 |
75 static void ExpectString(const char* code, const char* expected) { | 74 static void ExpectString(const char* code, const char* expected) { |
76 Local<Value> result = CompileRun(code); | 75 Local<Value> result = CompileRun(code); |
77 CHECK(result->IsString()); | 76 CHECK(result->IsString()); |
78 String::AsciiValue ascii(result); | 77 String::AsciiValue ascii(result); |
79 CHECK_EQ(expected, *ascii); | 78 CHECK_EQ(expected, *ascii); |
80 } | 79 } |
(...skipping 2358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2439 static void WeakPointerCallback(v8::Isolate* isolate, | 2438 static void WeakPointerCallback(v8::Isolate* isolate, |
2440 Persistent<Value> handle, | 2439 Persistent<Value> handle, |
2441 void* id) { | 2440 void* id) { |
2442 WeakCallCounter* counter = reinterpret_cast<WeakCallCounter*>(id); | 2441 WeakCallCounter* counter = reinterpret_cast<WeakCallCounter*>(id); |
2443 CHECK_EQ(1234, counter->id()); | 2442 CHECK_EQ(1234, counter->id()); |
2444 counter->increment(); | 2443 counter->increment(); |
2445 handle.Dispose(isolate); | 2444 handle.Dispose(isolate); |
2446 } | 2445 } |
2447 | 2446 |
2448 | 2447 |
2449 THREADED_TEST(OldApiObjectGroups) { | 2448 THREADED_TEST(ApiObjectGroups) { |
2450 LocalContext env; | 2449 LocalContext env; |
2451 v8::Isolate* iso = env->GetIsolate(); | 2450 v8::Isolate* iso = env->GetIsolate(); |
2452 HandleScope scope(iso); | 2451 HandleScope scope(iso); |
2453 | 2452 |
2454 Persistent<Object> g1s1; | 2453 Persistent<Object> g1s1; |
2455 Persistent<Object> g1s2; | 2454 Persistent<Object> g1s2; |
2456 Persistent<Object> g1c1; | 2455 Persistent<Object> g1c1; |
2457 Persistent<Object> g2s1; | 2456 Persistent<Object> g2s1; |
2458 Persistent<Object> g2s2; | 2457 Persistent<Object> g2s2; |
2459 Persistent<Object> g2c1; | 2458 Persistent<Object> g2c1; |
(...skipping 24 matching lines...) Expand all Loading... |
2484 CHECK(g2s1->Set(0, g1s1)); | 2483 CHECK(g2s1->Set(0, g1s1)); |
2485 | 2484 |
2486 { | 2485 { |
2487 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; | 2486 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; |
2488 Persistent<Value> g1_children[] = { g1c1 }; | 2487 Persistent<Value> g1_children[] = { g1c1 }; |
2489 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; | 2488 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; |
2490 Persistent<Value> g2_children[] = { g2c1 }; | 2489 Persistent<Value> g2_children[] = { g2c1 }; |
2491 V8::AddObjectGroup(g1_objects, 2); | 2490 V8::AddObjectGroup(g1_objects, 2); |
2492 V8::AddImplicitReferences(g1s1, g1_children, 1); | 2491 V8::AddImplicitReferences(g1s1, g1_children, 1); |
2493 V8::AddObjectGroup(g2_objects, 2); | 2492 V8::AddObjectGroup(g2_objects, 2); |
2494 V8::AddImplicitReferences(g2s1, g2_children, 1); | 2493 V8::AddImplicitReferences(g2s2, g2_children, 1); |
2495 } | 2494 } |
2496 // Do a single full GC, ensure incremental marking is stopped. | 2495 // Do a single full GC, ensure incremental marking is stopped. |
2497 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 2496 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
2498 | 2497 |
2499 // All object should be alive. | 2498 // All object should be alive. |
2500 CHECK_EQ(0, counter.NumberOfWeakCalls()); | 2499 CHECK_EQ(0, counter.NumberOfWeakCalls()); |
2501 | 2500 |
2502 // Weaken the root. | 2501 // Weaken the root. |
2503 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | 2502 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); |
2504 // But make children strong roots---all the objects (except for children) | 2503 // But make children strong roots---all the objects (except for children) |
2505 // should be collectable now. | 2504 // should be collectable now. |
2506 g1c1.ClearWeak(iso); | 2505 g1c1.ClearWeak(iso); |
2507 g2c1.ClearWeak(iso); | 2506 g2c1.ClearWeak(iso); |
2508 | 2507 |
2509 // Groups are deleted, rebuild groups. | 2508 // Groups are deleted, rebuild groups. |
2510 { | 2509 { |
2511 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; | 2510 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; |
2512 Persistent<Value> g1_children[] = { g1c1 }; | 2511 Persistent<Value> g1_children[] = { g1c1 }; |
2513 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; | 2512 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; |
2514 Persistent<Value> g2_children[] = { g2c1 }; | 2513 Persistent<Value> g2_children[] = { g2c1 }; |
2515 V8::AddObjectGroup(g1_objects, 2); | 2514 V8::AddObjectGroup(g1_objects, 2); |
2516 V8::AddImplicitReferences(g1s1, g1_children, 1); | 2515 V8::AddImplicitReferences(g1s1, g1_children, 1); |
2517 V8::AddObjectGroup(g2_objects, 2); | 2516 V8::AddObjectGroup(g2_objects, 2); |
2518 V8::AddImplicitReferences(g2s1, g2_children, 1); | 2517 V8::AddImplicitReferences(g2s2, g2_children, 1); |
2519 } | 2518 } |
2520 | 2519 |
2521 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 2520 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
2522 | 2521 |
2523 // All objects should be gone. 5 global handles in total. | 2522 // All objects should be gone. 5 global handles in total. |
2524 CHECK_EQ(5, counter.NumberOfWeakCalls()); | 2523 CHECK_EQ(5, counter.NumberOfWeakCalls()); |
2525 | 2524 |
2526 // And now make children weak again and collect them. | 2525 // And now make children weak again and collect them. |
2527 g1c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | 2526 g1c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); |
2528 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | 2527 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); |
2529 | 2528 |
2530 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 2529 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
2531 CHECK_EQ(7, counter.NumberOfWeakCalls()); | 2530 CHECK_EQ(7, counter.NumberOfWeakCalls()); |
2532 } | 2531 } |
2533 | 2532 |
2534 | 2533 |
2535 THREADED_TEST(ApiObjectGroups) { | 2534 THREADED_TEST(ApiObjectGroupsCycle) { |
2536 LocalContext env; | 2535 LocalContext env; |
2537 v8::Isolate* iso = env->GetIsolate(); | 2536 v8::Isolate* iso = env->GetIsolate(); |
2538 HandleScope scope(iso); | 2537 HandleScope scope(iso); |
2539 | |
2540 Persistent<Object> g1s1; | |
2541 Persistent<Object> g1s2; | |
2542 Persistent<Object> g1c1; | |
2543 Persistent<Object> g2s1; | |
2544 Persistent<Object> g2s2; | |
2545 Persistent<Object> g2c1; | |
2546 | |
2547 WeakCallCounter counter(1234); | |
2548 | |
2549 { | |
2550 HandleScope scope(iso); | |
2551 g1s1 = Persistent<Object>::New(iso, Object::New()); | |
2552 g1s2 = Persistent<Object>::New(iso, Object::New()); | |
2553 g1c1 = Persistent<Object>::New(iso, Object::New()); | |
2554 g1s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2555 g1s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2556 g1c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2557 | |
2558 g2s1 = Persistent<Object>::New(iso, Object::New()); | |
2559 g2s2 = Persistent<Object>::New(iso, Object::New()); | |
2560 g2c1 = Persistent<Object>::New(iso, Object::New()); | |
2561 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2562 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2563 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2564 } | |
2565 | |
2566 Persistent<Object> root = Persistent<Object>::New(iso, g1s1); // make a root. | |
2567 | |
2568 // Connect group 1 and 2, make a cycle. | |
2569 CHECK(g1s2->Set(0, g2s2)); | |
2570 CHECK(g2s1->Set(0, g1s1)); | |
2571 | |
2572 { | |
2573 UniqueId id1(reinterpret_cast<intptr_t>(*g1s1)); | |
2574 UniqueId id2(reinterpret_cast<intptr_t>(*g2s2)); | |
2575 V8::SetObjectGroupId(iso, g1s1, id1); | |
2576 V8::SetObjectGroupId(iso, g1s2, id1); | |
2577 V8::SetObjectGroupRepresentative(iso, id1, g1s1); | |
2578 V8::AddImplicitReference(iso, id1, g1c1); | |
2579 V8::SetObjectGroupId(iso, g2s1, id2); | |
2580 V8::SetObjectGroupId(iso, g2s2, id2); | |
2581 V8::SetObjectGroupRepresentative(iso, id2, g2s1); | |
2582 V8::AddImplicitReference(iso, id2, g2c1); | |
2583 } | |
2584 // Do a single full GC, ensure incremental marking is stopped. | |
2585 v8::internal::Heap* heap = reinterpret_cast<v8::internal::Isolate*>( | |
2586 iso)->heap(); | |
2587 heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | |
2588 | |
2589 // All object should be alive. | |
2590 CHECK_EQ(0, counter.NumberOfWeakCalls()); | |
2591 | |
2592 // Weaken the root. | |
2593 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2594 // But make children strong roots---all the objects (except for children) | |
2595 // should be collectable now. | |
2596 g1c1.ClearWeak(iso); | |
2597 g2c1.ClearWeak(iso); | |
2598 | |
2599 // Groups are deleted, rebuild groups. | |
2600 { | |
2601 UniqueId id1(reinterpret_cast<intptr_t>(*g1s1)); | |
2602 UniqueId id2(reinterpret_cast<intptr_t>(*g2s2)); | |
2603 V8::SetObjectGroupId(iso, g1s1, id1); | |
2604 V8::SetObjectGroupId(iso, g1s2, id1); | |
2605 V8::SetObjectGroupRepresentative(iso, id1, g1s1); | |
2606 V8::AddImplicitReference(iso, id1, g1c1); | |
2607 V8::SetObjectGroupId(iso, g2s1, id2); | |
2608 V8::SetObjectGroupId(iso, g2s2, id2); | |
2609 V8::SetObjectGroupRepresentative(iso, id2, g2s1); | |
2610 V8::AddImplicitReference(iso, id2, g2c1); | |
2611 } | |
2612 | |
2613 heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | |
2614 | |
2615 // All objects should be gone. 5 global handles in total. | |
2616 CHECK_EQ(5, counter.NumberOfWeakCalls()); | |
2617 | |
2618 // And now make children weak again and collect them. | |
2619 g1c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2620 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2621 | |
2622 heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | |
2623 CHECK_EQ(7, counter.NumberOfWeakCalls()); | |
2624 } | |
2625 | |
2626 | |
2627 THREADED_TEST(OldApiObjectGroupsCycle) { | |
2628 LocalContext env; | |
2629 v8::Isolate* iso = env->GetIsolate(); | |
2630 HandleScope scope(iso); | |
2631 | 2538 |
2632 WeakCallCounter counter(1234); | 2539 WeakCallCounter counter(1234); |
2633 | 2540 |
2634 Persistent<Object> g1s1; | 2541 Persistent<Object> g1s1; |
2635 Persistent<Object> g1s2; | 2542 Persistent<Object> g1s2; |
2636 Persistent<Object> g2s1; | 2543 Persistent<Object> g2s1; |
2637 Persistent<Object> g2s2; | 2544 Persistent<Object> g2s2; |
2638 Persistent<Object> g3s1; | 2545 Persistent<Object> g3s1; |
2639 Persistent<Object> g3s2; | 2546 Persistent<Object> g3s2; |
2640 Persistent<Object> g4s1; | 2547 Persistent<Object> g4s1; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2723 V8::AddImplicitReferences(g4s1, g4_children, 1); | 2630 V8::AddImplicitReferences(g4s1, g4_children, 1); |
2724 } | 2631 } |
2725 | 2632 |
2726 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 2633 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
2727 | 2634 |
2728 // All objects should be gone. 9 global handles in total. | 2635 // All objects should be gone. 9 global handles in total. |
2729 CHECK_EQ(9, counter.NumberOfWeakCalls()); | 2636 CHECK_EQ(9, counter.NumberOfWeakCalls()); |
2730 } | 2637 } |
2731 | 2638 |
2732 | 2639 |
2733 THREADED_TEST(ApiObjectGroupsCycle) { | |
2734 LocalContext env; | |
2735 v8::Isolate* iso = env->GetIsolate(); | |
2736 HandleScope scope(iso); | |
2737 | |
2738 WeakCallCounter counter(1234); | |
2739 | |
2740 Persistent<Object> g1s1; | |
2741 Persistent<Object> g1s2; | |
2742 Persistent<Object> g2s1; | |
2743 Persistent<Object> g2s2; | |
2744 Persistent<Object> g3s1; | |
2745 Persistent<Object> g3s2; | |
2746 Persistent<Object> g4s1; | |
2747 Persistent<Object> g4s2; | |
2748 | |
2749 { | |
2750 HandleScope scope(iso); | |
2751 g1s1 = Persistent<Object>::New(iso, Object::New()); | |
2752 g1s2 = Persistent<Object>::New(iso, Object::New()); | |
2753 g1s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2754 g1s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2755 CHECK(g1s1.IsWeak(iso)); | |
2756 CHECK(g1s2.IsWeak(iso)); | |
2757 | |
2758 g2s1 = Persistent<Object>::New(iso, Object::New()); | |
2759 g2s2 = Persistent<Object>::New(iso, Object::New()); | |
2760 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2761 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2762 CHECK(g2s1.IsWeak(iso)); | |
2763 CHECK(g2s2.IsWeak(iso)); | |
2764 | |
2765 g3s1 = Persistent<Object>::New(iso, Object::New()); | |
2766 g3s2 = Persistent<Object>::New(iso, Object::New()); | |
2767 g3s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2768 g3s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2769 CHECK(g3s1.IsWeak(iso)); | |
2770 CHECK(g3s2.IsWeak(iso)); | |
2771 | |
2772 g4s1 = Persistent<Object>::New(iso, Object::New()); | |
2773 g4s2 = Persistent<Object>::New(iso, Object::New()); | |
2774 g4s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2775 g4s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2776 CHECK(g4s1.IsWeak(iso)); | |
2777 CHECK(g4s2.IsWeak(iso)); | |
2778 } | |
2779 | |
2780 Persistent<Object> root = Persistent<Object>::New(iso, g1s1); // make a root. | |
2781 | |
2782 // Connect groups. We're building the following cycle: | |
2783 // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other | |
2784 // groups. | |
2785 { | |
2786 UniqueId id1(reinterpret_cast<intptr_t>(*g1s1)); | |
2787 UniqueId id2(reinterpret_cast<intptr_t>(*g2s1)); | |
2788 UniqueId id3(reinterpret_cast<intptr_t>(*g3s1)); | |
2789 UniqueId id4(reinterpret_cast<intptr_t>(*g4s1)); | |
2790 V8::SetObjectGroupId(iso, g1s1, id1); | |
2791 V8::SetObjectGroupId(iso, g1s2, id1); | |
2792 V8::SetObjectGroupRepresentative(iso, id1, g1s1); | |
2793 V8::AddImplicitReference(iso, id1, g2s1); | |
2794 V8::SetObjectGroupId(iso, g2s1, id2); | |
2795 V8::SetObjectGroupId(iso, g2s2, id2); | |
2796 V8::SetObjectGroupRepresentative(iso, id2, g2s1); | |
2797 V8::AddImplicitReference(iso, id2, g3s1); | |
2798 V8::SetObjectGroupId(iso, g3s1, id3); | |
2799 V8::SetObjectGroupId(iso, g3s2, id3); | |
2800 V8::SetObjectGroupRepresentative(iso, id3, g3s1); | |
2801 V8::AddImplicitReference(iso, id3, g4s1); | |
2802 V8::SetObjectGroupId(iso, g4s1, id4); | |
2803 V8::SetObjectGroupId(iso, g4s2, id4); | |
2804 V8::SetObjectGroupRepresentative(iso, id4, g4s1); | |
2805 V8::AddImplicitReference(iso, id4, g1s1); | |
2806 } | |
2807 // Do a single full GC | |
2808 v8::internal::Heap* heap = reinterpret_cast<v8::internal::Isolate*>( | |
2809 iso)->heap(); | |
2810 heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | |
2811 | |
2812 // All object should be alive. | |
2813 CHECK_EQ(0, counter.NumberOfWeakCalls()); | |
2814 | |
2815 // Weaken the root. | |
2816 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2817 | |
2818 // Groups are deleted, rebuild groups. | |
2819 { | |
2820 UniqueId id1(reinterpret_cast<intptr_t>(*g1s1)); | |
2821 UniqueId id2(reinterpret_cast<intptr_t>(*g2s1)); | |
2822 UniqueId id3(reinterpret_cast<intptr_t>(*g3s1)); | |
2823 UniqueId id4(reinterpret_cast<intptr_t>(*g4s1)); | |
2824 V8::SetObjectGroupId(iso, g1s1, id1); | |
2825 V8::SetObjectGroupId(iso, g1s2, id1); | |
2826 V8::SetObjectGroupRepresentative(iso, id1, g1s1); | |
2827 V8::AddImplicitReference(iso, id1, g2s1); | |
2828 V8::SetObjectGroupId(iso, g2s1, id2); | |
2829 V8::SetObjectGroupId(iso, g2s2, id2); | |
2830 V8::SetObjectGroupRepresentative(iso, id2, g2s1); | |
2831 V8::AddImplicitReference(iso, id2, g3s1); | |
2832 V8::SetObjectGroupId(iso, g3s1, id3); | |
2833 V8::SetObjectGroupId(iso, g3s2, id3); | |
2834 V8::SetObjectGroupRepresentative(iso, id3, g3s1); | |
2835 V8::AddImplicitReference(iso, id3, g4s1); | |
2836 V8::SetObjectGroupId(iso, g4s1, id4); | |
2837 V8::SetObjectGroupId(iso, g4s2, id4); | |
2838 V8::SetObjectGroupRepresentative(iso, id4, g4s1); | |
2839 V8::AddImplicitReference(iso, id4, g1s1); | |
2840 } | |
2841 | |
2842 heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | |
2843 | |
2844 // All objects should be gone. 9 global handles in total. | |
2845 CHECK_EQ(9, counter.NumberOfWeakCalls()); | |
2846 } | |
2847 | |
2848 | |
2849 // TODO(mstarzinger): This should be a THREADED_TEST but causes failures | 2640 // TODO(mstarzinger): This should be a THREADED_TEST but causes failures |
2850 // on the buildbots, so was made non-threaded for the time being. | 2641 // on the buildbots, so was made non-threaded for the time being. |
2851 TEST(OldApiObjectGroupsCycleForScavenger) { | 2642 TEST(ApiObjectGroupsCycleForScavenger) { |
2852 i::FLAG_stress_compaction = false; | 2643 i::FLAG_stress_compaction = false; |
2853 i::FLAG_gc_global = false; | 2644 i::FLAG_gc_global = false; |
2854 LocalContext env; | 2645 LocalContext env; |
2855 v8::Isolate* iso = env->GetIsolate(); | 2646 v8::Isolate* iso = env->GetIsolate(); |
2856 HandleScope scope(iso); | 2647 HandleScope scope(iso); |
2857 | 2648 |
2858 WeakCallCounter counter(1234); | 2649 WeakCallCounter counter(1234); |
2859 | 2650 |
2860 Persistent<Object> g1s1; | 2651 Persistent<Object> g1s1; |
2861 Persistent<Object> g1s2; | 2652 Persistent<Object> g1s2; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2936 g3s1->Set(v8_str("x"), g1s1); | 2727 g3s1->Set(v8_str("x"), g1s1); |
2937 } | 2728 } |
2938 | 2729 |
2939 HEAP->CollectGarbage(i::NEW_SPACE); | 2730 HEAP->CollectGarbage(i::NEW_SPACE); |
2940 | 2731 |
2941 // All objects should be gone. 7 global handles in total. | 2732 // All objects should be gone. 7 global handles in total. |
2942 CHECK_EQ(7, counter.NumberOfWeakCalls()); | 2733 CHECK_EQ(7, counter.NumberOfWeakCalls()); |
2943 } | 2734 } |
2944 | 2735 |
2945 | 2736 |
2946 // TODO(mstarzinger): This should be a THREADED_TEST but causes failures | |
2947 // on the buildbots, so was made non-threaded for the time being. | |
2948 TEST(ApiObjectGroupsCycleForScavenger) { | |
2949 i::FLAG_stress_compaction = false; | |
2950 i::FLAG_gc_global = false; | |
2951 LocalContext env; | |
2952 v8::Isolate* iso = env->GetIsolate(); | |
2953 HandleScope scope(iso); | |
2954 | |
2955 WeakCallCounter counter(1234); | |
2956 | |
2957 Persistent<Object> g1s1; | |
2958 Persistent<Object> g1s2; | |
2959 Persistent<Object> g2s1; | |
2960 Persistent<Object> g2s2; | |
2961 Persistent<Object> g3s1; | |
2962 Persistent<Object> g3s2; | |
2963 | |
2964 { | |
2965 HandleScope scope(iso); | |
2966 g1s1 = Persistent<Object>::New(iso, Object::New()); | |
2967 g1s2 = Persistent<Object>::New(iso, Object::New()); | |
2968 g1s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2969 g1s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2970 | |
2971 g2s1 = Persistent<Object>::New(iso, Object::New()); | |
2972 g2s2 = Persistent<Object>::New(iso, Object::New()); | |
2973 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2974 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2975 | |
2976 g3s1 = Persistent<Object>::New(iso, Object::New()); | |
2977 g3s2 = Persistent<Object>::New(iso, Object::New()); | |
2978 g3s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2979 g3s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
2980 } | |
2981 | |
2982 // Make a root. | |
2983 Persistent<Object> root = Persistent<Object>::New(iso, g1s1); | |
2984 root.MarkPartiallyDependent(iso); | |
2985 | |
2986 // Connect groups. We're building the following cycle: | |
2987 // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other | |
2988 // groups. | |
2989 { | |
2990 g1s1.MarkPartiallyDependent(iso); | |
2991 g1s2.MarkPartiallyDependent(iso); | |
2992 g2s1.MarkPartiallyDependent(iso); | |
2993 g2s2.MarkPartiallyDependent(iso); | |
2994 g3s1.MarkPartiallyDependent(iso); | |
2995 g3s2.MarkPartiallyDependent(iso); | |
2996 V8::SetObjectGroupId(iso, g1s1, UniqueId(1)); | |
2997 V8::SetObjectGroupId(iso, g1s2, UniqueId(1)); | |
2998 g1s1->Set(v8_str("x"), g2s1); | |
2999 V8::SetObjectGroupId(iso, g2s1, UniqueId(2)); | |
3000 V8::SetObjectGroupId(iso, g2s2, UniqueId(2)); | |
3001 g2s1->Set(v8_str("x"), g3s1); | |
3002 V8::SetObjectGroupId(iso, g3s1, UniqueId(3)); | |
3003 V8::SetObjectGroupId(iso, g3s2, UniqueId(3)); | |
3004 g3s1->Set(v8_str("x"), g1s1); | |
3005 } | |
3006 | |
3007 v8::internal::Heap* heap = reinterpret_cast<v8::internal::Isolate*>( | |
3008 iso)->heap(); | |
3009 heap->CollectGarbage(i::NEW_SPACE); | |
3010 | |
3011 // All objects should be alive. | |
3012 CHECK_EQ(0, counter.NumberOfWeakCalls()); | |
3013 | |
3014 // Weaken the root. | |
3015 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback); | |
3016 root.MarkPartiallyDependent(iso); | |
3017 | |
3018 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | |
3019 // Groups are deleted, rebuild groups. | |
3020 { | |
3021 g1s1.MarkPartiallyDependent(isolate); | |
3022 g1s2.MarkPartiallyDependent(isolate); | |
3023 g2s1.MarkPartiallyDependent(isolate); | |
3024 g2s2.MarkPartiallyDependent(isolate); | |
3025 g3s1.MarkPartiallyDependent(isolate); | |
3026 g3s2.MarkPartiallyDependent(isolate); | |
3027 V8::SetObjectGroupId(iso, g1s1, UniqueId(1)); | |
3028 V8::SetObjectGroupId(iso, g1s2, UniqueId(1)); | |
3029 g1s1->Set(v8_str("x"), g2s1); | |
3030 V8::SetObjectGroupId(iso, g2s1, UniqueId(2)); | |
3031 V8::SetObjectGroupId(iso, g2s2, UniqueId(2)); | |
3032 g2s1->Set(v8_str("x"), g3s1); | |
3033 V8::SetObjectGroupId(iso, g3s1, UniqueId(3)); | |
3034 V8::SetObjectGroupId(iso, g3s2, UniqueId(3)); | |
3035 g3s1->Set(v8_str("x"), g1s1); | |
3036 } | |
3037 | |
3038 heap->CollectGarbage(i::NEW_SPACE); | |
3039 | |
3040 // All objects should be gone. 7 global handles in total. | |
3041 CHECK_EQ(7, counter.NumberOfWeakCalls()); | |
3042 } | |
3043 | |
3044 | |
3045 THREADED_TEST(ScriptException) { | 2737 THREADED_TEST(ScriptException) { |
3046 LocalContext env; | 2738 LocalContext env; |
3047 v8::HandleScope scope(env->GetIsolate()); | 2739 v8::HandleScope scope(env->GetIsolate()); |
3048 Local<Script> script = Script::Compile(v8_str("throw 'panama!';")); | 2740 Local<Script> script = Script::Compile(v8_str("throw 'panama!';")); |
3049 v8::TryCatch try_catch; | 2741 v8::TryCatch try_catch; |
3050 Local<Value> result = script->Run(); | 2742 Local<Value> result = script->Run(); |
3051 CHECK(result.IsEmpty()); | 2743 CHECK(result.IsEmpty()); |
3052 CHECK(try_catch.HasCaught()); | 2744 CHECK(try_catch.HasCaught()); |
3053 String::AsciiValue exception_value(try_catch.Exception()); | 2745 String::AsciiValue exception_value(try_catch.Exception()); |
3054 CHECK_EQ(*exception_value, "panama!"); | 2746 CHECK_EQ(*exception_value, "panama!"); |
(...skipping 15647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18702 i::Semaphore* sem_; | 18394 i::Semaphore* sem_; |
18703 volatile int sem_value_; | 18395 volatile int sem_value_; |
18704 }; | 18396 }; |
18705 | 18397 |
18706 | 18398 |
18707 THREADED_TEST(SemaphoreInterruption) { | 18399 THREADED_TEST(SemaphoreInterruption) { |
18708 ThreadInterruptTest().RunTest(); | 18400 ThreadInterruptTest().RunTest(); |
18709 } | 18401 } |
18710 | 18402 |
18711 #endif // WIN32 | 18403 #endif // WIN32 |
OLD | NEW |