| 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 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 EXPECT(!Dart_IsNull(weak_old_ref)); | 824 EXPECT(!Dart_IsNull(weak_old_ref)); |
| 825 | 825 |
| 826 // garbage collect old space again | 826 // garbage collect old space again |
| 827 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 827 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 828 | 828 |
| 829 // weak ref to old space object should now be cleared | 829 // weak ref to old space object should now be cleared |
| 830 EXPECT_VALID(weak_new_ref); | 830 EXPECT_VALID(weak_new_ref); |
| 831 EXPECT(Dart_IsNull(weak_new_ref)); | 831 EXPECT(Dart_IsNull(weak_new_ref)); |
| 832 EXPECT_VALID(weak_old_ref); | 832 EXPECT_VALID(weak_old_ref); |
| 833 EXPECT(Dart_IsNull(weak_old_ref)); | 833 EXPECT(Dart_IsNull(weak_old_ref)); |
| 834 |
| 835 Dart_DeletePersistentHandle(weak_new_ref); |
| 836 Dart_DeletePersistentHandle(weak_old_ref); |
| 837 } |
| 838 |
| 839 |
| 840 static void WeakPersistentHandlePeerFinalizer(void* peer) { |
| 841 *static_cast<int*>(peer) = 42; |
| 842 } |
| 843 |
| 844 |
| 845 TEST_CASE(WeakPersistentHandleCallback) { |
| 846 Dart_Handle weak_ref = Dart_Null(); |
| 847 EXPECT(Dart_IsNull(weak_ref)); |
| 848 int* peer = new int(); |
| 849 { |
| 850 Dart_EnterScope(); |
| 851 Dart_Handle obj = Dart_NewString("new string"); |
| 852 EXPECT_VALID(obj); |
| 853 weak_ref = Dart_NewWeakPersistentHandle(obj, peer, |
| 854 WeakPersistentHandlePeerFinalizer); |
| 855 Dart_ExitScope(); |
| 856 } |
| 857 EXPECT_VALID(weak_ref); |
| 858 EXPECT(*peer == 0); |
| 859 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 860 EXPECT(*peer == 0); |
| 861 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); |
| 862 EXPECT(*peer == 42); |
| 863 delete peer; |
| 864 Dart_DeletePersistentHandle(weak_ref); |
| 834 } | 865 } |
| 835 | 866 |
| 836 #endif | 867 #endif |
| 837 | 868 |
| 838 | 869 |
| 839 // Unit test for creating multiple scopes and local handles within them. | 870 // Unit test for creating multiple scopes and local handles within them. |
| 840 // Ensure that the local handles get all cleaned out when exiting the | 871 // Ensure that the local handles get all cleaned out when exiting the |
| 841 // scope. | 872 // scope. |
| 842 UNIT_TEST_CASE(LocalHandles) { | 873 UNIT_TEST_CASE(LocalHandles) { |
| 843 TestCase::CreateTestIsolate(); | 874 TestCase::CreateTestIsolate(); |
| (...skipping 2127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2971 // We should have received the expected number of interrupts. | 3002 // We should have received the expected number of interrupts. |
| 2972 EXPECT_EQ(kInterruptCount, interrupt_count); | 3003 EXPECT_EQ(kInterruptCount, interrupt_count); |
| 2973 | 3004 |
| 2974 // Give the spawned thread enough time to properly exit. | 3005 // Give the spawned thread enough time to properly exit. |
| 2975 Isolate::SetInterruptCallback(saved); | 3006 Isolate::SetInterruptCallback(saved); |
| 2976 } | 3007 } |
| 2977 | 3008 |
| 2978 #endif // TARGET_ARCH_IA32. | 3009 #endif // TARGET_ARCH_IA32. |
| 2979 | 3010 |
| 2980 } // namespace dart | 3011 } // namespace dart |
| OLD | NEW |