Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 "include/dart_api.h" | 5 #include "include/dart_api.h" |
| 6 | 6 |
| 7 #include "vm/assert.h" | 7 #include "vm/assert.h" |
| 8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
| 9 #include "vm/dart_api_state.h" | 9 #include "vm/dart_api_state.h" |
| 10 #include "vm/thread.h" | 10 #include "vm/thread.h" |
| (...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 757 | 757 |
| 758 // Make sure that the value transferred. | 758 // Make sure that the value transferred. |
| 759 EXPECT(Dart_IsBoolean(obj2)); | 759 EXPECT(Dart_IsBoolean(obj2)); |
| 760 bool value = false; | 760 bool value = false; |
| 761 Dart_Handle result = Dart_BooleanValue(obj2, &value); | 761 Dart_Handle result = Dart_BooleanValue(obj2, &value); |
| 762 EXPECT_VALID(result); | 762 EXPECT_VALID(result); |
| 763 EXPECT(value); | 763 EXPECT(value); |
| 764 } | 764 } |
| 765 | 765 |
| 766 | 766 |
| 767 TEST_CASE(WeakPersistentHandle) { | |
| 768 Dart_Handle weak_new_ref = Dart_Null(); | |
| 769 EXPECT(Dart_IsNull(weak_new_ref)); | |
| 770 | |
| 771 Dart_Handle weak_old_ref = Dart_Null(); | |
| 772 EXPECT(Dart_IsNull(weak_old_ref)); | |
| 773 | |
| 774 { | |
| 775 Dart_EnterScope(); | |
| 776 | |
| 777 // create an object in new space | |
| 778 Dart_Handle new_ref = Dart_NewString("new string"); | |
| 779 EXPECT_VALID(new_ref); | |
| 780 | |
| 781 // create an object in old space | |
| 782 Dart_Handle old_ref; | |
| 783 { | |
| 784 DARTSCOPE(Isolate::Current()); | |
| 785 const String& str = | |
| 786 String::Handle(String::New("old string", Heap::kOld)); | |
| 787 old_ref = Api::NewLocalHandle(str); | |
| 788 EXPECT_VALID(old_ref); | |
| 789 } | |
| 790 | |
| 791 // create a weak ref to the new space object | |
| 792 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref); | |
| 793 EXPECT_VALID(weak_new_ref); | |
| 794 EXPECT(!Dart_IsNull(weak_new_ref)); | |
| 795 | |
| 796 // create a weak ref to the old space object | |
| 797 weak_old_ref = Dart_NewWeakPersistentHandle(old_ref); | |
| 798 EXPECT_VALID(weak_old_ref); | |
| 799 EXPECT(!Dart_IsNull(weak_old_ref)); | |
| 800 | |
| 801 // garbage collect new space | |
| 802 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); | |
| 803 | |
| 804 // nothing should be invalidated or cleared | |
|
Ivan Posva
2011/12/19 22:41:36
Also the weak and non-weak handles should still be
cshapiro
2011/12/20 00:58:57
Sounds good. Done.
| |
| 805 EXPECT_VALID(new_ref); | |
| 806 EXPECT(!Dart_IsNull(new_ref)); | |
| 807 EXPECT_VALID(old_ref); | |
| 808 EXPECT(!Dart_IsNull(old_ref)); | |
| 809 EXPECT_VALID(weak_new_ref); | |
| 810 EXPECT(!Dart_IsNull(weak_new_ref)); | |
| 811 EXPECT_VALID(weak_old_ref); | |
| 812 EXPECT(!Dart_IsNull(weak_old_ref)); | |
| 813 | |
| 814 // garbage collect old space | |
| 815 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 816 | |
| 817 // nothing should be invalidated or cleared | |
|
Ivan Posva
2011/12/19 22:41:36
ditto.
cshapiro
2011/12/20 00:58:57
Done.
| |
| 818 EXPECT_VALID(new_ref); | |
| 819 EXPECT(!Dart_IsNull(new_ref)); | |
| 820 EXPECT_VALID(old_ref); | |
| 821 EXPECT(!Dart_IsNull(old_ref)); | |
| 822 EXPECT_VALID(weak_new_ref); | |
| 823 EXPECT(!Dart_IsNull(weak_new_ref)); | |
| 824 EXPECT_VALID(weak_old_ref); | |
| 825 EXPECT(!Dart_IsNull(weak_old_ref)); | |
| 826 | |
| 827 // delete local (strong) references | |
| 828 Dart_ExitScope(); | |
| 829 } | |
| 830 | |
| 831 // garbage collect new space again | |
| 832 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); | |
| 833 | |
| 834 // weak ref to new space object should now be cleared | |
| 835 EXPECT_VALID(weak_new_ref); | |
| 836 EXPECT(Dart_IsNull(weak_new_ref)); | |
| 837 EXPECT_VALID(weak_old_ref); | |
| 838 EXPECT(!Dart_IsNull(weak_old_ref)); | |
| 839 | |
| 840 // garbage collect old space again | |
| 841 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | |
| 842 | |
| 843 // weak ref to old space object should now be cleared | |
| 844 EXPECT_VALID(weak_new_ref); | |
| 845 EXPECT(Dart_IsNull(weak_new_ref)); | |
| 846 EXPECT_VALID(weak_old_ref); | |
| 847 EXPECT(Dart_IsNull(weak_old_ref)); | |
| 848 } | |
| 849 | |
| 850 | |
| 767 // Unit test for creating multiple scopes and local handles within them. | 851 // Unit test for creating multiple scopes and local handles within them. |
| 768 // Ensure that the local handles get all cleaned out when exiting the | 852 // Ensure that the local handles get all cleaned out when exiting the |
| 769 // scope. | 853 // scope. |
| 770 UNIT_TEST_CASE(LocalHandles) { | 854 UNIT_TEST_CASE(LocalHandles) { |
| 771 TestCase::CreateTestIsolate(); | 855 TestCase::CreateTestIsolate(); |
| 772 Isolate* isolate = Isolate::Current(); | 856 Isolate* isolate = Isolate::Current(); |
| 773 EXPECT(isolate != NULL); | 857 EXPECT(isolate != NULL); |
| 774 ApiState* state = isolate->api_state(); | 858 ApiState* state = isolate->api_state(); |
| 775 EXPECT(state != NULL); | 859 EXPECT(state != NULL); |
| 776 ApiLocalScope* scope = state->top_scope(); | 860 ApiLocalScope* scope = state->top_scope(); |
| (...skipping 2189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2966 EXPECT_EQ(3, interrupt_count); | 3050 EXPECT_EQ(3, interrupt_count); |
| 2967 | 3051 |
| 2968 // Give the spawned thread enough time to properly exit. | 3052 // Give the spawned thread enough time to properly exit. |
| 2969 OS::Sleep(20); | 3053 OS::Sleep(20); |
| 2970 Isolate::SetInterruptCallback(saved); | 3054 Isolate::SetInterruptCallback(saved); |
| 2971 } | 3055 } |
| 2972 | 3056 |
| 2973 #endif // TARGET_ARCH_IA32. | 3057 #endif // TARGET_ARCH_IA32. |
| 2974 | 3058 |
| 2975 } // namespace dart | 3059 } // namespace dart |
| OLD | NEW |