| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "vm/assembler.h" | 6 #include "vm/assembler.h" |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
| 9 #include "vm/object.h" | 9 #include "vm/object.h" |
| 10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
| (...skipping 2470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2481 EXPECT_STREQ(f.ToCString(), | 2481 EXPECT_STREQ(f.ToCString(), |
| 2482 String::Handle(Field::NameFromSetter(setter_f)).ToCString()); | 2482 String::Handle(Field::NameFromSetter(setter_f)).ToCString()); |
| 2483 } | 2483 } |
| 2484 | 2484 |
| 2485 | 2485 |
| 2486 // Expose helper function from object.cc for testing. | 2486 // Expose helper function from object.cc for testing. |
| 2487 bool EqualsIgnoringPrivate(const String& name, const String& private_name); | 2487 bool EqualsIgnoringPrivate(const String& name, const String& private_name); |
| 2488 | 2488 |
| 2489 | 2489 |
| 2490 TEST_CASE(EqualsIgnoringPrivate) { | 2490 TEST_CASE(EqualsIgnoringPrivate) { |
| 2491 OneByteString& mangled_name = OneByteString::Handle(); | 2491 String& mangled_name = String::Handle(); |
| 2492 OneByteString& bare_name = OneByteString::Handle(); | 2492 String& bare_name = String::Handle(); |
| 2493 | 2493 |
| 2494 // Simple matches. | 2494 // Simple matches. |
| 2495 mangled_name = OneByteString::New("foo"); | 2495 mangled_name = OneByteString::New("foo"); |
| 2496 bare_name = OneByteString::New("foo"); | 2496 bare_name = OneByteString::New("foo"); |
| 2497 EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2497 EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2498 | 2498 |
| 2499 mangled_name = OneByteString::New("foo."); | 2499 mangled_name = OneByteString::New("foo."); |
| 2500 bare_name = OneByteString::New("foo."); | 2500 bare_name = OneByteString::New("foo."); |
| 2501 EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2501 EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2502 | 2502 |
| 2503 mangled_name = OneByteString::New("foo.named"); | 2503 mangled_name = OneByteString::New("foo.named"); |
| 2504 bare_name = OneByteString::New("foo.named"); | 2504 bare_name = OneByteString::New("foo.named"); |
| 2505 EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2505 EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2506 | 2506 |
| 2507 // Simple mismatches. | 2507 // Simple mismatches. |
| 2508 mangled_name = OneByteString::New("bar"); | 2508 mangled_name = OneByteString::New("bar"); |
| 2509 bare_name = OneByteString::New("foo"); | 2509 bare_name = OneByteString::New("foo"); |
| 2510 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2510 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2511 | 2511 |
| 2512 mangled_name = OneByteString::New("foo."); | 2512 mangled_name = OneByteString::New("foo."); |
| 2513 bare_name = OneByteString::New("foo"); | 2513 bare_name = OneByteString::New("foo"); |
| 2514 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2514 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2515 | 2515 |
| 2516 mangled_name = OneByteString::New("foo"); | 2516 mangled_name = OneByteString::New("foo"); |
| 2517 bare_name = OneByteString::New("foo."); | 2517 bare_name = OneByteString::New("foo."); |
| 2518 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2518 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2519 | 2519 |
| 2520 mangled_name = OneByteString::New("foo.name"); | 2520 mangled_name = OneByteString::New("foo.name"); |
| 2521 bare_name = OneByteString::New("foo.named"); | 2521 bare_name = OneByteString::New("foo.named"); |
| 2522 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2522 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2523 | 2523 |
| 2524 mangled_name = OneByteString::New("foo.named"); | 2524 mangled_name = OneByteString::New("foo.named"); |
| 2525 bare_name = OneByteString::New("foo.name"); | 2525 bare_name = OneByteString::New("foo.name"); |
| 2526 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2526 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2527 | 2527 |
| 2528 // Private match. | 2528 // Private match. |
| 2529 mangled_name = OneByteString::New("foo@12345"); | 2529 mangled_name = OneByteString::New("foo@12345"); |
| 2530 bare_name = OneByteString::New("foo"); | 2530 bare_name = OneByteString::New("foo"); |
| 2531 EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2531 EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2532 | 2532 |
| 2533 // Private mismatch. | 2533 // Private mismatch. |
| 2534 mangled_name = OneByteString::New("food@12345"); | 2534 mangled_name = OneByteString::New("food@12345"); |
| 2535 bare_name = OneByteString::New("foo"); | 2535 bare_name = OneByteString::New("foo"); |
| 2536 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2536 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2537 | 2537 |
| 2538 // Private mismatch 2. | 2538 // Private mismatch 2. |
| 2539 mangled_name = OneByteString::New("foo@12345"); | 2539 mangled_name = OneByteString::New("foo@12345"); |
| 2540 bare_name = OneByteString::New("food"); | 2540 bare_name = OneByteString::New("food"); |
| 2541 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2541 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2542 | 2542 |
| 2543 // Private constructor match. | 2543 // Private constructor match. |
| 2544 mangled_name = OneByteString::New("foo@12345."); | 2544 mangled_name = OneByteString::New("foo@12345."); |
| 2545 bare_name = OneByteString::New("foo."); | 2545 bare_name = OneByteString::New("foo."); |
| 2546 EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2546 EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2547 | 2547 |
| 2548 // Private constructor mismatch. | 2548 // Private constructor mismatch. |
| 2549 mangled_name = OneByteString::New("foo@12345."); | 2549 mangled_name = OneByteString::New("foo@12345."); |
| 2550 bare_name = OneByteString::New("foo"); | 2550 bare_name = OneByteString::New("foo"); |
| 2551 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2551 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2552 | 2552 |
| 2553 // Private constructor mismatch 2. | 2553 // Private constructor mismatch 2. |
| 2554 mangled_name = OneByteString::New("foo@12345"); | 2554 mangled_name = OneByteString::New("foo@12345"); |
| 2555 bare_name = OneByteString::New("foo."); | 2555 bare_name = OneByteString::New("foo."); |
| 2556 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2556 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2557 | 2557 |
| 2558 // Named private constructor match. | 2558 // Named private constructor match. |
| 2559 mangled_name = OneByteString::New("foo@12345.named"); | 2559 mangled_name = OneByteString::New("foo@12345.named"); |
| 2560 bare_name = OneByteString::New("foo.named"); | 2560 bare_name = OneByteString::New("foo.named"); |
| 2561 EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2561 EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2562 | 2562 |
| 2563 // Named private constructor mismatch. | 2563 // Named private constructor mismatch. |
| 2564 mangled_name = OneByteString::New("foo@12345.name"); | 2564 mangled_name = OneByteString::New("foo@12345.name"); |
| 2565 bare_name = OneByteString::New("foo.named"); | 2565 bare_name = OneByteString::New("foo.named"); |
| 2566 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2566 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2567 | 2567 |
| 2568 // Named private constructor mismatch 2. | 2568 // Named private constructor mismatch 2. |
| 2569 mangled_name = OneByteString::New("foo@12345.named"); | 2569 mangled_name = OneByteString::New("foo@12345.named"); |
| 2570 bare_name = OneByteString::New("foo.name"); | 2570 bare_name = OneByteString::New("foo.name"); |
| 2571 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2571 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2572 | 2572 |
| 2573 // Named double-private constructor match. Yes, this happens. | 2573 // Named double-private constructor match. Yes, this happens. |
| 2574 mangled_name = OneByteString::New("foo@12345.named@12345"); | 2574 mangled_name = OneByteString::New("foo@12345.named@12345"); |
| 2575 bare_name = OneByteString::New("foo.named"); | 2575 bare_name = OneByteString::New("foo.named"); |
| 2576 EXPECT(mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2576 EXPECT(OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2577 | 2577 |
| 2578 // Named double-private constructor mismatch. | 2578 // Named double-private constructor mismatch. |
| 2579 mangled_name = OneByteString::New("foo@12345.name@12345"); | 2579 mangled_name = OneByteString::New("foo@12345.name@12345"); |
| 2580 bare_name = OneByteString::New("foo.named"); | 2580 bare_name = OneByteString::New("foo.named"); |
| 2581 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2581 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2582 | 2582 |
| 2583 // Named double-private constructor mismatch. | 2583 // Named double-private constructor mismatch. |
| 2584 mangled_name = OneByteString::New("foo@12345.named@12345"); | 2584 mangled_name = OneByteString::New("foo@12345.named@12345"); |
| 2585 bare_name = OneByteString::New("foo.name"); | 2585 bare_name = OneByteString::New("foo.name"); |
| 2586 EXPECT(!mangled_name.EqualsIgnoringPrivateKey(bare_name)); | 2586 EXPECT(!OneByteString::EqualsIgnoringPrivateKey(mangled_name, bare_name)); |
| 2587 } | 2587 } |
| 2588 | 2588 |
| 2589 | 2589 |
| 2590 TEST_CASE(ArrayNew_Overflow_Crash) { | 2590 TEST_CASE(ArrayNew_Overflow_Crash) { |
| 2591 Array::Handle(Array::New(Array::kMaxElements + 1)); | 2591 Array::Handle(Array::New(Array::kMaxElements + 1)); |
| 2592 } | 2592 } |
| 2593 | 2593 |
| 2594 | 2594 |
| 2595 TEST_CASE(StackTraceFormat) { | 2595 TEST_CASE(StackTraceFormat) { |
| 2596 const char* kScriptChars = | 2596 const char* kScriptChars = |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2652 "#10 main (dart:test-lib:37:24)"); | 2652 "#10 main (dart:test-lib:37:24)"); |
| 2653 } | 2653 } |
| 2654 | 2654 |
| 2655 | 2655 |
| 2656 TEST_CASE(WeakProperty_PreserveCrossGen) { | 2656 TEST_CASE(WeakProperty_PreserveCrossGen) { |
| 2657 Isolate* isolate = Isolate::Current(); | 2657 Isolate* isolate = Isolate::Current(); |
| 2658 WeakProperty& weak = WeakProperty::Handle(); | 2658 WeakProperty& weak = WeakProperty::Handle(); |
| 2659 { | 2659 { |
| 2660 // Weak property and value in new. Key in old. | 2660 // Weak property and value in new. Key in old. |
| 2661 HANDLESCOPE(isolate); | 2661 HANDLESCOPE(isolate); |
| 2662 OneByteString& key = OneByteString::Handle(); | 2662 String& key = String::Handle(); |
| 2663 key ^= OneByteString::New("key", Heap::kOld); | 2663 key ^= OneByteString::New("key", Heap::kOld); |
| 2664 OneByteString& value = OneByteString::Handle(); | 2664 String& value = String::Handle(); |
| 2665 value ^= OneByteString::New("value", Heap::kNew); | 2665 value ^= OneByteString::New("value", Heap::kNew); |
| 2666 weak ^= WeakProperty::New(Heap::kNew); | 2666 weak ^= WeakProperty::New(Heap::kNew); |
| 2667 weak.set_key(key); | 2667 weak.set_key(key); |
| 2668 weak.set_value(value); | 2668 weak.set_value(value); |
| 2669 key ^= OneByteString::null(); | 2669 key ^= OneByteString::null(); |
| 2670 value ^= OneByteString::null(); | 2670 value ^= OneByteString::null(); |
| 2671 } | 2671 } |
| 2672 isolate->heap()->CollectAllGarbage(); | 2672 isolate->heap()->CollectAllGarbage(); |
| 2673 // Weak property key and value should survive due to cross-generation | 2673 // Weak property key and value should survive due to cross-generation |
| 2674 // pointers. | 2674 // pointers. |
| 2675 EXPECT(weak.key() != Object::null()); | 2675 EXPECT(weak.key() != Object::null()); |
| 2676 EXPECT(weak.value() != Object::null()); | 2676 EXPECT(weak.value() != Object::null()); |
| 2677 { | 2677 { |
| 2678 // Weak property and value in old. Key in new. | 2678 // Weak property and value in old. Key in new. |
| 2679 HANDLESCOPE(isolate); | 2679 HANDLESCOPE(isolate); |
| 2680 OneByteString& key = OneByteString::Handle(); | 2680 String& key = String::Handle(); |
| 2681 key ^= OneByteString::New("key", Heap::kNew); | 2681 key ^= OneByteString::New("key", Heap::kNew); |
| 2682 OneByteString& value = OneByteString::Handle(); | 2682 String& value = String::Handle(); |
| 2683 value ^= OneByteString::New("value", Heap::kOld); | 2683 value ^= OneByteString::New("value", Heap::kOld); |
| 2684 weak ^= WeakProperty::New(Heap::kOld); | 2684 weak ^= WeakProperty::New(Heap::kOld); |
| 2685 weak.set_key(key); | 2685 weak.set_key(key); |
| 2686 weak.set_value(value); | 2686 weak.set_value(value); |
| 2687 key ^= OneByteString::null(); | 2687 key ^= OneByteString::null(); |
| 2688 value ^= OneByteString::null(); | 2688 value ^= OneByteString::null(); |
| 2689 } | 2689 } |
| 2690 isolate->heap()->CollectAllGarbage(); | 2690 isolate->heap()->CollectAllGarbage(); |
| 2691 // Weak property key and value should survive due to cross-generation | 2691 // Weak property key and value should survive due to cross-generation |
| 2692 // pointers. | 2692 // pointers. |
| 2693 EXPECT(weak.key() != Object::null()); | 2693 EXPECT(weak.key() != Object::null()); |
| 2694 EXPECT(weak.value() != Object::null()); | 2694 EXPECT(weak.value() != Object::null()); |
| 2695 { | 2695 { |
| 2696 // Weak property and value in new. Key is a Smi. | 2696 // Weak property and value in new. Key is a Smi. |
| 2697 HANDLESCOPE(isolate); | 2697 HANDLESCOPE(isolate); |
| 2698 Integer& key = Integer::Handle(); | 2698 Integer& key = Integer::Handle(); |
| 2699 key ^= Integer::New(31); | 2699 key ^= Integer::New(31); |
| 2700 OneByteString& value = OneByteString::Handle(); | 2700 String& value = String::Handle(); |
| 2701 value ^= OneByteString::New("value", Heap::kNew); | 2701 value ^= OneByteString::New("value", Heap::kNew); |
| 2702 weak ^= WeakProperty::New(Heap::kNew); | 2702 weak ^= WeakProperty::New(Heap::kNew); |
| 2703 weak.set_key(key); | 2703 weak.set_key(key); |
| 2704 weak.set_value(value); | 2704 weak.set_value(value); |
| 2705 key ^= Integer::null(); | 2705 key ^= Integer::null(); |
| 2706 value ^= OneByteString::null(); | 2706 value ^= OneByteString::null(); |
| 2707 } | 2707 } |
| 2708 isolate->heap()->CollectAllGarbage(); | 2708 isolate->heap()->CollectAllGarbage(); |
| 2709 // Weak property key and value should survive due implicit liveness of | 2709 // Weak property key and value should survive due implicit liveness of |
| 2710 // non-heap objects. | 2710 // non-heap objects. |
| 2711 EXPECT(weak.key() != Object::null()); | 2711 EXPECT(weak.key() != Object::null()); |
| 2712 EXPECT(weak.value() != Object::null()); | 2712 EXPECT(weak.value() != Object::null()); |
| 2713 { | 2713 { |
| 2714 // Weak property and value in old. Key is a Smi. | 2714 // Weak property and value in old. Key is a Smi. |
| 2715 HANDLESCOPE(isolate); | 2715 HANDLESCOPE(isolate); |
| 2716 Integer& key = Integer::Handle(); | 2716 Integer& key = Integer::Handle(); |
| 2717 key ^= Integer::New(32); | 2717 key ^= Integer::New(32); |
| 2718 OneByteString& value = OneByteString::Handle(); | 2718 String& value = String::Handle(); |
| 2719 value ^= OneByteString::New("value", Heap::kOld); | 2719 value ^= OneByteString::New("value", Heap::kOld); |
| 2720 weak ^= WeakProperty::New(Heap::kOld); | 2720 weak ^= WeakProperty::New(Heap::kOld); |
| 2721 weak.set_key(key); | 2721 weak.set_key(key); |
| 2722 weak.set_value(value); | 2722 weak.set_value(value); |
| 2723 key ^= OneByteString::null(); | 2723 key ^= OneByteString::null(); |
| 2724 value ^= OneByteString::null(); | 2724 value ^= OneByteString::null(); |
| 2725 } | 2725 } |
| 2726 isolate->heap()->CollectAllGarbage(); | 2726 isolate->heap()->CollectAllGarbage(); |
| 2727 // Weak property key and value should survive due implicit liveness of | 2727 // Weak property key and value should survive due implicit liveness of |
| 2728 // non-heap objects. | 2728 // non-heap objects. |
| 2729 EXPECT(weak.key() != Object::null()); | 2729 EXPECT(weak.key() != Object::null()); |
| 2730 EXPECT(weak.value() != Object::null()); | 2730 EXPECT(weak.value() != Object::null()); |
| 2731 { | 2731 { |
| 2732 // Weak property and value in new. Key in VM isolate. | 2732 // Weak property and value in new. Key in VM isolate. |
| 2733 HANDLESCOPE(isolate); | 2733 HANDLESCOPE(isolate); |
| 2734 OneByteString& key = OneByteString::Handle(); | 2734 String& key = String::Handle(); |
| 2735 key ^= Symbols::Dot(); | 2735 key ^= Symbols::Dot(); |
| 2736 OneByteString& value = OneByteString::Handle(); | 2736 String& value = String::Handle(); |
| 2737 value ^= OneByteString::New("value", Heap::kNew); | 2737 value ^= OneByteString::New("value", Heap::kNew); |
| 2738 weak ^= WeakProperty::New(Heap::kNew); | 2738 weak ^= WeakProperty::New(Heap::kNew); |
| 2739 weak.set_key(key); | 2739 weak.set_key(key); |
| 2740 weak.set_value(value); | 2740 weak.set_value(value); |
| 2741 key ^= OneByteString::null(); | 2741 key ^= OneByteString::null(); |
| 2742 value ^= OneByteString::null(); | 2742 value ^= OneByteString::null(); |
| 2743 } | 2743 } |
| 2744 isolate->heap()->CollectAllGarbage(); | 2744 isolate->heap()->CollectAllGarbage(); |
| 2745 // Weak property key and value should survive due to cross-generation | 2745 // Weak property key and value should survive due to cross-generation |
| 2746 // pointers. | 2746 // pointers. |
| 2747 EXPECT(weak.key() != Object::null()); | 2747 EXPECT(weak.key() != Object::null()); |
| 2748 EXPECT(weak.value() != Object::null()); | 2748 EXPECT(weak.value() != Object::null()); |
| 2749 { | 2749 { |
| 2750 // Weak property and value in old. Key in VM isolate. | 2750 // Weak property and value in old. Key in VM isolate. |
| 2751 HANDLESCOPE(isolate); | 2751 HANDLESCOPE(isolate); |
| 2752 OneByteString& key = OneByteString::Handle(); | 2752 String& key = String::Handle(); |
| 2753 key ^= Symbols::Dot(); | 2753 key ^= Symbols::Dot(); |
| 2754 OneByteString& value = OneByteString::Handle(); | 2754 String& value = String::Handle(); |
| 2755 value ^= OneByteString::New("value", Heap::kOld); | 2755 value ^= OneByteString::New("value", Heap::kOld); |
| 2756 weak ^= WeakProperty::New(Heap::kOld); | 2756 weak ^= WeakProperty::New(Heap::kOld); |
| 2757 weak.set_key(key); | 2757 weak.set_key(key); |
| 2758 weak.set_value(value); | 2758 weak.set_value(value); |
| 2759 key ^= OneByteString::null(); | 2759 key ^= OneByteString::null(); |
| 2760 value ^= OneByteString::null(); | 2760 value ^= OneByteString::null(); |
| 2761 } | 2761 } |
| 2762 isolate->heap()->CollectAllGarbage(); | 2762 isolate->heap()->CollectAllGarbage(); |
| 2763 // Weak property key and value should survive due to cross-generation | 2763 // Weak property key and value should survive due to cross-generation |
| 2764 // pointers. | 2764 // pointers. |
| 2765 EXPECT(weak.key() != Object::null()); | 2765 EXPECT(weak.key() != Object::null()); |
| 2766 EXPECT(weak.value() != Object::null()); | 2766 EXPECT(weak.value() != Object::null()); |
| 2767 } | 2767 } |
| 2768 | 2768 |
| 2769 | 2769 |
| 2770 TEST_CASE(WeakProperty_PreserveRecurse) { | 2770 TEST_CASE(WeakProperty_PreserveRecurse) { |
| 2771 // This used to end in an infinite recursion. Caused by scavenging the weak | 2771 // This used to end in an infinite recursion. Caused by scavenging the weak |
| 2772 // property before scavenging the key. | 2772 // property before scavenging the key. |
| 2773 Isolate* isolate = Isolate::Current(); | 2773 Isolate* isolate = Isolate::Current(); |
| 2774 WeakProperty& weak = WeakProperty::Handle(); | 2774 WeakProperty& weak = WeakProperty::Handle(); |
| 2775 Array& arr = Array::Handle(Array::New(1)); | 2775 Array& arr = Array::Handle(Array::New(1)); |
| 2776 { | 2776 { |
| 2777 HANDLESCOPE(isolate); | 2777 HANDLESCOPE(isolate); |
| 2778 OneByteString& key = OneByteString::Handle(); | 2778 String& key = String::Handle(); |
| 2779 key ^= OneByteString::New("key"); | 2779 key ^= OneByteString::New("key"); |
| 2780 arr.SetAt(0, key); | 2780 arr.SetAt(0, key); |
| 2781 OneByteString& value = OneByteString::Handle(); | 2781 String& value = String::Handle(); |
| 2782 value ^= OneByteString::New("value"); | 2782 value ^= OneByteString::New("value"); |
| 2783 weak ^= WeakProperty::New(); | 2783 weak ^= WeakProperty::New(); |
| 2784 weak.set_key(key); | 2784 weak.set_key(key); |
| 2785 weak.set_value(value); | 2785 weak.set_value(value); |
| 2786 } | 2786 } |
| 2787 isolate->heap()->CollectAllGarbage(); | 2787 isolate->heap()->CollectAllGarbage(); |
| 2788 EXPECT(weak.key() != Object::null()); | 2788 EXPECT(weak.key() != Object::null()); |
| 2789 EXPECT(weak.value() != Object::null()); | 2789 EXPECT(weak.value() != Object::null()); |
| 2790 } | 2790 } |
| 2791 | 2791 |
| 2792 | 2792 |
| 2793 TEST_CASE(WeakProperty_PreserveOne_NewSpace) { | 2793 TEST_CASE(WeakProperty_PreserveOne_NewSpace) { |
| 2794 Isolate* isolate = Isolate::Current(); | 2794 Isolate* isolate = Isolate::Current(); |
| 2795 WeakProperty& weak = WeakProperty::Handle(); | 2795 WeakProperty& weak = WeakProperty::Handle(); |
| 2796 OneByteString& key = OneByteString::Handle(); | 2796 String& key = String::Handle(); |
| 2797 key ^= OneByteString::New("key"); | 2797 key ^= OneByteString::New("key"); |
| 2798 { | 2798 { |
| 2799 HANDLESCOPE(isolate); | 2799 HANDLESCOPE(isolate); |
| 2800 OneByteString& value = OneByteString::Handle(); | 2800 String& value = String::Handle(); |
| 2801 value ^= OneByteString::New("value"); | 2801 value ^= OneByteString::New("value"); |
| 2802 weak ^= WeakProperty::New(); | 2802 weak ^= WeakProperty::New(); |
| 2803 weak.set_key(key); | 2803 weak.set_key(key); |
| 2804 weak.set_value(value); | 2804 weak.set_value(value); |
| 2805 } | 2805 } |
| 2806 isolate->heap()->CollectAllGarbage(); | 2806 isolate->heap()->CollectAllGarbage(); |
| 2807 EXPECT(weak.key() != Object::null()); | 2807 EXPECT(weak.key() != Object::null()); |
| 2808 EXPECT(weak.value() != Object::null()); | 2808 EXPECT(weak.value() != Object::null()); |
| 2809 } | 2809 } |
| 2810 | 2810 |
| 2811 | 2811 |
| 2812 TEST_CASE(WeakProperty_PreserveTwo_NewSpace) { | 2812 TEST_CASE(WeakProperty_PreserveTwo_NewSpace) { |
| 2813 Isolate* isolate = Isolate::Current(); | 2813 Isolate* isolate = Isolate::Current(); |
| 2814 WeakProperty& weak1 = WeakProperty::Handle(); | 2814 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2815 OneByteString& key1 = OneByteString::Handle(); | 2815 String& key1 = String::Handle(); |
| 2816 key1 ^= OneByteString::New("key1"); | 2816 key1 ^= OneByteString::New("key1"); |
| 2817 WeakProperty& weak2 = WeakProperty::Handle(); | 2817 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2818 OneByteString& key2 = OneByteString::Handle(); | 2818 String& key2 = String::Handle(); |
| 2819 key2 ^= OneByteString::New("key2"); | 2819 key2 ^= OneByteString::New("key2"); |
| 2820 { | 2820 { |
| 2821 HANDLESCOPE(isolate); | 2821 HANDLESCOPE(isolate); |
| 2822 OneByteString& value1 = OneByteString::Handle(); | 2822 String& value1 = String::Handle(); |
| 2823 value1 ^= OneByteString::New("value1"); | 2823 value1 ^= OneByteString::New("value1"); |
| 2824 weak1 ^= WeakProperty::New(); | 2824 weak1 ^= WeakProperty::New(); |
| 2825 weak1.set_key(key1); | 2825 weak1.set_key(key1); |
| 2826 weak1.set_value(value1); | 2826 weak1.set_value(value1); |
| 2827 OneByteString& value2 = OneByteString::Handle(); | 2827 String& value2 = String::Handle(); |
| 2828 value2 ^= OneByteString::New("value2"); | 2828 value2 ^= OneByteString::New("value2"); |
| 2829 weak2 ^= WeakProperty::New(); | 2829 weak2 ^= WeakProperty::New(); |
| 2830 weak2.set_key(key2); | 2830 weak2.set_key(key2); |
| 2831 weak2.set_value(value2); | 2831 weak2.set_value(value2); |
| 2832 } | 2832 } |
| 2833 isolate->heap()->CollectAllGarbage(); | 2833 isolate->heap()->CollectAllGarbage(); |
| 2834 EXPECT(weak1.key() != Object::null()); | 2834 EXPECT(weak1.key() != Object::null()); |
| 2835 EXPECT(weak1.value() != Object::null()); | 2835 EXPECT(weak1.value() != Object::null()); |
| 2836 EXPECT(weak2.key() != Object::null()); | 2836 EXPECT(weak2.key() != Object::null()); |
| 2837 EXPECT(weak2.value() != Object::null()); | 2837 EXPECT(weak2.value() != Object::null()); |
| 2838 } | 2838 } |
| 2839 | 2839 |
| 2840 | 2840 |
| 2841 TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) { | 2841 TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) { |
| 2842 Isolate* isolate = Isolate::Current(); | 2842 Isolate* isolate = Isolate::Current(); |
| 2843 WeakProperty& weak1 = WeakProperty::Handle(); | 2843 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2844 WeakProperty& weak2 = WeakProperty::Handle(); | 2844 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2845 OneByteString& key = OneByteString::Handle(); | 2845 String& key = String::Handle(); |
| 2846 key ^= OneByteString::New("key"); | 2846 key ^= OneByteString::New("key"); |
| 2847 { | 2847 { |
| 2848 HANDLESCOPE(isolate); | 2848 HANDLESCOPE(isolate); |
| 2849 OneByteString& value1 = OneByteString::Handle(); | 2849 String& value1 = String::Handle(); |
| 2850 value1 ^= OneByteString::New("value1"); | 2850 value1 ^= OneByteString::New("value1"); |
| 2851 weak1 ^= WeakProperty::New(); | 2851 weak1 ^= WeakProperty::New(); |
| 2852 weak1.set_key(key); | 2852 weak1.set_key(key); |
| 2853 weak1.set_value(value1); | 2853 weak1.set_value(value1); |
| 2854 OneByteString& value2 = OneByteString::Handle(); | 2854 String& value2 = String::Handle(); |
| 2855 value2 ^= OneByteString::New("value2"); | 2855 value2 ^= OneByteString::New("value2"); |
| 2856 weak2 ^= WeakProperty::New(); | 2856 weak2 ^= WeakProperty::New(); |
| 2857 weak2.set_key(key); | 2857 weak2.set_key(key); |
| 2858 weak2.set_value(value2); | 2858 weak2.set_value(value2); |
| 2859 } | 2859 } |
| 2860 isolate->heap()->CollectAllGarbage(); | 2860 isolate->heap()->CollectAllGarbage(); |
| 2861 EXPECT(weak1.key() != Object::null()); | 2861 EXPECT(weak1.key() != Object::null()); |
| 2862 EXPECT(weak1.value() != Object::null()); | 2862 EXPECT(weak1.value() != Object::null()); |
| 2863 EXPECT(weak2.key() != Object::null()); | 2863 EXPECT(weak2.key() != Object::null()); |
| 2864 EXPECT(weak2.value() != Object::null()); | 2864 EXPECT(weak2.value() != Object::null()); |
| 2865 } | 2865 } |
| 2866 | 2866 |
| 2867 | 2867 |
| 2868 TEST_CASE(WeakProperty_PreserveOne_OldSpace) { | 2868 TEST_CASE(WeakProperty_PreserveOne_OldSpace) { |
| 2869 Isolate* isolate = Isolate::Current(); | 2869 Isolate* isolate = Isolate::Current(); |
| 2870 WeakProperty& weak = WeakProperty::Handle(); | 2870 WeakProperty& weak = WeakProperty::Handle(); |
| 2871 OneByteString& key = OneByteString::Handle(); | 2871 String& key = String::Handle(); |
| 2872 key ^= OneByteString::New("key", Heap::kOld); | 2872 key ^= OneByteString::New("key", Heap::kOld); |
| 2873 { | 2873 { |
| 2874 HANDLESCOPE(isolate); | 2874 HANDLESCOPE(isolate); |
| 2875 OneByteString& value = OneByteString::Handle(); | 2875 String& value = String::Handle(); |
| 2876 value ^= OneByteString::New("value", Heap::kOld); | 2876 value ^= OneByteString::New("value", Heap::kOld); |
| 2877 weak ^= WeakProperty::New(Heap::kOld); | 2877 weak ^= WeakProperty::New(Heap::kOld); |
| 2878 weak.set_key(key); | 2878 weak.set_key(key); |
| 2879 weak.set_value(value); | 2879 weak.set_value(value); |
| 2880 } | 2880 } |
| 2881 isolate->heap()->CollectAllGarbage(); | 2881 isolate->heap()->CollectAllGarbage(); |
| 2882 EXPECT(weak.key() != Object::null()); | 2882 EXPECT(weak.key() != Object::null()); |
| 2883 EXPECT(weak.value() != Object::null()); | 2883 EXPECT(weak.value() != Object::null()); |
| 2884 } | 2884 } |
| 2885 | 2885 |
| 2886 | 2886 |
| 2887 TEST_CASE(WeakProperty_PreserveTwo_OldSpace) { | 2887 TEST_CASE(WeakProperty_PreserveTwo_OldSpace) { |
| 2888 Isolate* isolate = Isolate::Current(); | 2888 Isolate* isolate = Isolate::Current(); |
| 2889 WeakProperty& weak1 = WeakProperty::Handle(); | 2889 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2890 OneByteString& key1 = OneByteString::Handle(); | 2890 String& key1 = String::Handle(); |
| 2891 key1 ^= OneByteString::New("key1", Heap::kOld); | 2891 key1 ^= OneByteString::New("key1", Heap::kOld); |
| 2892 WeakProperty& weak2 = WeakProperty::Handle(); | 2892 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2893 OneByteString& key2 = OneByteString::Handle(); | 2893 String& key2 = String::Handle(); |
| 2894 key2 ^= OneByteString::New("key2", Heap::kOld); | 2894 key2 ^= OneByteString::New("key2", Heap::kOld); |
| 2895 { | 2895 { |
| 2896 HANDLESCOPE(isolate); | 2896 HANDLESCOPE(isolate); |
| 2897 OneByteString& value1 = OneByteString::Handle(); | 2897 String& value1 = String::Handle(); |
| 2898 value1 ^= OneByteString::New("value1", Heap::kOld); | 2898 value1 ^= OneByteString::New("value1", Heap::kOld); |
| 2899 weak1 ^= WeakProperty::New(Heap::kOld); | 2899 weak1 ^= WeakProperty::New(Heap::kOld); |
| 2900 weak1.set_key(key1); | 2900 weak1.set_key(key1); |
| 2901 weak1.set_value(value1); | 2901 weak1.set_value(value1); |
| 2902 OneByteString& value2 = OneByteString::Handle(); | 2902 String& value2 = String::Handle(); |
| 2903 value2 ^= OneByteString::New("value2", Heap::kOld); | 2903 value2 ^= OneByteString::New("value2", Heap::kOld); |
| 2904 weak2 ^= WeakProperty::New(Heap::kOld); | 2904 weak2 ^= WeakProperty::New(Heap::kOld); |
| 2905 weak2.set_key(key2); | 2905 weak2.set_key(key2); |
| 2906 weak2.set_value(value2); | 2906 weak2.set_value(value2); |
| 2907 } | 2907 } |
| 2908 isolate->heap()->CollectAllGarbage(); | 2908 isolate->heap()->CollectAllGarbage(); |
| 2909 EXPECT(weak1.key() != Object::null()); | 2909 EXPECT(weak1.key() != Object::null()); |
| 2910 EXPECT(weak1.value() != Object::null()); | 2910 EXPECT(weak1.value() != Object::null()); |
| 2911 EXPECT(weak2.key() != Object::null()); | 2911 EXPECT(weak2.key() != Object::null()); |
| 2912 EXPECT(weak2.value() != Object::null()); | 2912 EXPECT(weak2.value() != Object::null()); |
| 2913 } | 2913 } |
| 2914 | 2914 |
| 2915 | 2915 |
| 2916 TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) { | 2916 TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) { |
| 2917 Isolate* isolate = Isolate::Current(); | 2917 Isolate* isolate = Isolate::Current(); |
| 2918 WeakProperty& weak1 = WeakProperty::Handle(); | 2918 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2919 WeakProperty& weak2 = WeakProperty::Handle(); | 2919 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2920 OneByteString& key = OneByteString::Handle(); | 2920 String& key = String::Handle(); |
| 2921 key ^= OneByteString::New("key", Heap::kOld); | 2921 key ^= OneByteString::New("key", Heap::kOld); |
| 2922 { | 2922 { |
| 2923 HANDLESCOPE(isolate); | 2923 HANDLESCOPE(isolate); |
| 2924 OneByteString& value1 = OneByteString::Handle(); | 2924 String& value1 = String::Handle(); |
| 2925 value1 ^= OneByteString::New("value1", Heap::kOld); | 2925 value1 ^= OneByteString::New("value1", Heap::kOld); |
| 2926 weak1 ^= WeakProperty::New(Heap::kOld); | 2926 weak1 ^= WeakProperty::New(Heap::kOld); |
| 2927 weak1.set_key(key); | 2927 weak1.set_key(key); |
| 2928 weak1.set_value(value1); | 2928 weak1.set_value(value1); |
| 2929 OneByteString& value2 = OneByteString::Handle(); | 2929 String& value2 = String::Handle(); |
| 2930 value2 ^= OneByteString::New("value2", Heap::kOld); | 2930 value2 ^= OneByteString::New("value2", Heap::kOld); |
| 2931 weak2 ^= WeakProperty::New(Heap::kOld); | 2931 weak2 ^= WeakProperty::New(Heap::kOld); |
| 2932 weak2.set_key(key); | 2932 weak2.set_key(key); |
| 2933 weak2.set_value(value2); | 2933 weak2.set_value(value2); |
| 2934 } | 2934 } |
| 2935 isolate->heap()->CollectAllGarbage(); | 2935 isolate->heap()->CollectAllGarbage(); |
| 2936 EXPECT(weak1.key() != Object::null()); | 2936 EXPECT(weak1.key() != Object::null()); |
| 2937 EXPECT(weak1.value() != Object::null()); | 2937 EXPECT(weak1.value() != Object::null()); |
| 2938 EXPECT(weak2.key() != Object::null()); | 2938 EXPECT(weak2.key() != Object::null()); |
| 2939 EXPECT(weak2.value() != Object::null()); | 2939 EXPECT(weak2.value() != Object::null()); |
| 2940 } | 2940 } |
| 2941 | 2941 |
| 2942 | 2942 |
| 2943 TEST_CASE(WeakProperty_ClearOne_NewSpace) { | 2943 TEST_CASE(WeakProperty_ClearOne_NewSpace) { |
| 2944 Isolate* isolate = Isolate::Current(); | 2944 Isolate* isolate = Isolate::Current(); |
| 2945 WeakProperty& weak = WeakProperty::Handle(); | 2945 WeakProperty& weak = WeakProperty::Handle(); |
| 2946 { | 2946 { |
| 2947 HANDLESCOPE(isolate); | 2947 HANDLESCOPE(isolate); |
| 2948 OneByteString& key = OneByteString::Handle(); | 2948 String& key = String::Handle(); |
| 2949 key ^= OneByteString::New("key"); | 2949 key ^= OneByteString::New("key"); |
| 2950 OneByteString& value = OneByteString::Handle(); | 2950 String& value = String::Handle(); |
| 2951 value ^= OneByteString::New("value"); | 2951 value ^= OneByteString::New("value"); |
| 2952 weak ^= WeakProperty::New(); | 2952 weak ^= WeakProperty::New(); |
| 2953 weak.set_key(key); | 2953 weak.set_key(key); |
| 2954 weak.set_value(value); | 2954 weak.set_value(value); |
| 2955 key ^= OneByteString::null(); | 2955 key ^= OneByteString::null(); |
| 2956 value ^= OneByteString::null(); | 2956 value ^= OneByteString::null(); |
| 2957 } | 2957 } |
| 2958 isolate->heap()->CollectAllGarbage(); | 2958 isolate->heap()->CollectAllGarbage(); |
| 2959 EXPECT(weak.key() == Object::null()); | 2959 EXPECT(weak.key() == Object::null()); |
| 2960 EXPECT(weak.value() == Object::null()); | 2960 EXPECT(weak.value() == Object::null()); |
| 2961 } | 2961 } |
| 2962 | 2962 |
| 2963 | 2963 |
| 2964 TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) { | 2964 TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) { |
| 2965 Isolate* isolate = Isolate::Current(); | 2965 Isolate* isolate = Isolate::Current(); |
| 2966 WeakProperty& weak1 = WeakProperty::Handle(); | 2966 WeakProperty& weak1 = WeakProperty::Handle(); |
| 2967 WeakProperty& weak2 = WeakProperty::Handle(); | 2967 WeakProperty& weak2 = WeakProperty::Handle(); |
| 2968 { | 2968 { |
| 2969 HANDLESCOPE(isolate); | 2969 HANDLESCOPE(isolate); |
| 2970 OneByteString& key = OneByteString::Handle(); | 2970 String& key = String::Handle(); |
| 2971 key ^= OneByteString::New("key"); | 2971 key ^= OneByteString::New("key"); |
| 2972 OneByteString& value1 = OneByteString::Handle(); | 2972 String& value1 = String::Handle(); |
| 2973 value1 ^= OneByteString::New("value1"); | 2973 value1 ^= OneByteString::New("value1"); |
| 2974 weak1 ^= WeakProperty::New(); | 2974 weak1 ^= WeakProperty::New(); |
| 2975 weak1.set_key(key); | 2975 weak1.set_key(key); |
| 2976 weak1.set_value(value1); | 2976 weak1.set_value(value1); |
| 2977 OneByteString& value2 = OneByteString::Handle(); | 2977 String& value2 = String::Handle(); |
| 2978 value2 ^= OneByteString::New("value2"); | 2978 value2 ^= OneByteString::New("value2"); |
| 2979 weak2 ^= WeakProperty::New(); | 2979 weak2 ^= WeakProperty::New(); |
| 2980 weak2.set_key(key); | 2980 weak2.set_key(key); |
| 2981 weak2.set_value(value2); | 2981 weak2.set_value(value2); |
| 2982 } | 2982 } |
| 2983 isolate->heap()->CollectAllGarbage(); | 2983 isolate->heap()->CollectAllGarbage(); |
| 2984 EXPECT(weak1.key() == Object::null()); | 2984 EXPECT(weak1.key() == Object::null()); |
| 2985 EXPECT(weak1.value() == Object::null()); | 2985 EXPECT(weak1.value() == Object::null()); |
| 2986 EXPECT(weak2.key() == Object::null()); | 2986 EXPECT(weak2.key() == Object::null()); |
| 2987 EXPECT(weak2.value() == Object::null()); | 2987 EXPECT(weak2.value() == Object::null()); |
| 2988 } | 2988 } |
| 2989 | 2989 |
| 2990 | 2990 |
| 2991 TEST_CASE(WeakProperty_ClearOne_OldSpace) { | 2991 TEST_CASE(WeakProperty_ClearOne_OldSpace) { |
| 2992 Isolate* isolate = Isolate::Current(); | 2992 Isolate* isolate = Isolate::Current(); |
| 2993 WeakProperty& weak = WeakProperty::Handle(); | 2993 WeakProperty& weak = WeakProperty::Handle(); |
| 2994 { | 2994 { |
| 2995 HANDLESCOPE(isolate); | 2995 HANDLESCOPE(isolate); |
| 2996 OneByteString& key = OneByteString::Handle(); | 2996 String& key = String::Handle(); |
| 2997 key ^= OneByteString::New("key", Heap::kOld); | 2997 key ^= OneByteString::New("key", Heap::kOld); |
| 2998 OneByteString& value = OneByteString::Handle(); | 2998 String& value = String::Handle(); |
| 2999 value ^= OneByteString::New("value", Heap::kOld); | 2999 value ^= OneByteString::New("value", Heap::kOld); |
| 3000 weak ^= WeakProperty::New(Heap::kOld); | 3000 weak ^= WeakProperty::New(Heap::kOld); |
| 3001 weak.set_key(key); | 3001 weak.set_key(key); |
| 3002 weak.set_value(value); | 3002 weak.set_value(value); |
| 3003 key ^= OneByteString::null(); | 3003 key ^= OneByteString::null(); |
| 3004 value ^= OneByteString::null(); | 3004 value ^= OneByteString::null(); |
| 3005 } | 3005 } |
| 3006 isolate->heap()->CollectAllGarbage(); | 3006 isolate->heap()->CollectAllGarbage(); |
| 3007 EXPECT(weak.key() == Object::null()); | 3007 EXPECT(weak.key() == Object::null()); |
| 3008 EXPECT(weak.value() == Object::null()); | 3008 EXPECT(weak.value() == Object::null()); |
| 3009 } | 3009 } |
| 3010 | 3010 |
| 3011 | 3011 |
| 3012 TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) { | 3012 TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) { |
| 3013 Isolate* isolate = Isolate::Current(); | 3013 Isolate* isolate = Isolate::Current(); |
| 3014 WeakProperty& weak1 = WeakProperty::Handle(); | 3014 WeakProperty& weak1 = WeakProperty::Handle(); |
| 3015 WeakProperty& weak2 = WeakProperty::Handle(); | 3015 WeakProperty& weak2 = WeakProperty::Handle(); |
| 3016 { | 3016 { |
| 3017 HANDLESCOPE(isolate); | 3017 HANDLESCOPE(isolate); |
| 3018 OneByteString& key = OneByteString::Handle(); | 3018 String& key = String::Handle(); |
| 3019 key ^= OneByteString::New("key", Heap::kOld); | 3019 key ^= OneByteString::New("key", Heap::kOld); |
| 3020 OneByteString& value1 = OneByteString::Handle(); | 3020 String& value1 = String::Handle(); |
| 3021 value1 ^= OneByteString::New("value1"); | 3021 value1 ^= OneByteString::New("value1"); |
| 3022 weak1 ^= WeakProperty::New(Heap::kOld); | 3022 weak1 ^= WeakProperty::New(Heap::kOld); |
| 3023 weak1.set_key(key); | 3023 weak1.set_key(key); |
| 3024 weak1.set_value(value1); | 3024 weak1.set_value(value1); |
| 3025 OneByteString& value2 = OneByteString::Handle(); | 3025 String& value2 = String::Handle(); |
| 3026 value2 ^= OneByteString::New("value2", Heap::kOld); | 3026 value2 ^= OneByteString::New("value2", Heap::kOld); |
| 3027 weak2 ^= WeakProperty::New(Heap::kOld); | 3027 weak2 ^= WeakProperty::New(Heap::kOld); |
| 3028 weak2.set_key(key); | 3028 weak2.set_key(key); |
| 3029 weak2.set_value(value2); | 3029 weak2.set_value(value2); |
| 3030 } | 3030 } |
| 3031 isolate->heap()->CollectAllGarbage(); | 3031 isolate->heap()->CollectAllGarbage(); |
| 3032 EXPECT(weak1.key() == Object::null()); | 3032 EXPECT(weak1.key() == Object::null()); |
| 3033 EXPECT(weak1.value() == Object::null()); | 3033 EXPECT(weak1.value() == Object::null()); |
| 3034 EXPECT(weak2.key() == Object::null()); | 3034 EXPECT(weak2.key() == Object::null()); |
| 3035 EXPECT(weak2.value() == Object::null()); | 3035 EXPECT(weak2.value() == Object::null()); |
| 3036 } | 3036 } |
| 3037 | 3037 |
| 3038 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 3038 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 3039 | 3039 |
| 3040 } // namespace dart | 3040 } // namespace dart |
| OLD | NEW |