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 "bin/builtin.h" | 5 #include "bin/builtin.h" |
6 #include "include/dart_api.h" | 6 #include "include/dart_api.h" |
7 #include "include/dart_debugger_api.h" | 7 #include "include/dart_debugger_api.h" |
8 #include "include/dart_mirrors_api.h" | 8 #include "include/dart_mirrors_api.h" |
9 #include "include/dart_native_api.h" | 9 #include "include/dart_native_api.h" |
10 #include "platform/assert.h" | 10 #include "platform/assert.h" |
(...skipping 1678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 // Check that result is true. | 1689 // Check that result is true. |
1690 EXPECT_VALID(result); | 1690 EXPECT_VALID(result); |
1691 EXPECT(Dart_IsBoolean(result)); | 1691 EXPECT(Dart_IsBoolean(result)); |
1692 bool value = false; | 1692 bool value = false; |
1693 result = Dart_BooleanValue(result, &value); | 1693 result = Dart_BooleanValue(result, &value); |
1694 EXPECT_VALID(result); | 1694 EXPECT_VALID(result); |
1695 EXPECT(value); | 1695 EXPECT(value); |
1696 } | 1696 } |
1697 | 1697 |
1698 | 1698 |
1699 static void ExternalTypedDataFinalizer(Dart_WeakPersistentHandle handle, | 1699 static void ExternalTypedDataFinalizer(Dart_Isolate isolate, |
1700 void* peer) { | 1700 Dart_WeakPersistentHandle handle, |
1701 Dart_DeleteWeakPersistentHandle(handle); | 1701 void* peer) { |
| 1702 Dart_DeleteWeakPersistentHandle(isolate, handle); |
1702 *static_cast<int*>(peer) = 42; | 1703 *static_cast<int*>(peer) = 42; |
1703 } | 1704 } |
1704 | 1705 |
1705 | 1706 |
1706 TEST_CASE(ExternalTypedDataCallback) { | 1707 TEST_CASE(ExternalTypedDataCallback) { |
1707 int peer = 0; | 1708 int peer = 0; |
1708 { | 1709 { |
1709 Dart_EnterScope(); | 1710 Dart_EnterScope(); |
1710 uint8_t data[] = { 1, 2, 3, 4 }; | 1711 uint8_t data[] = { 1, 2, 3, 4 }; |
1711 Dart_Handle obj = Dart_NewExternalTypedData( | 1712 Dart_Handle obj = Dart_NewExternalTypedData( |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2044 { | 2045 { |
2045 Dart_EnterScope(); | 2046 Dart_EnterScope(); |
2046 // Weak ref to old space object should now be cleared. | 2047 // Weak ref to old space object should now be cleared. |
2047 EXPECT_VALID(AsHandle(weak_new_ref)); | 2048 EXPECT_VALID(AsHandle(weak_new_ref)); |
2048 EXPECT(Dart_IsNull(AsHandle(weak_new_ref))); | 2049 EXPECT(Dart_IsNull(AsHandle(weak_new_ref))); |
2049 EXPECT_VALID(AsHandle(weak_old_ref)); | 2050 EXPECT_VALID(AsHandle(weak_old_ref)); |
2050 EXPECT(Dart_IsNull(AsHandle(weak_old_ref))); | 2051 EXPECT(Dart_IsNull(AsHandle(weak_old_ref))); |
2051 Dart_ExitScope(); | 2052 Dart_ExitScope(); |
2052 } | 2053 } |
2053 | 2054 |
2054 Dart_DeleteWeakPersistentHandle(weak_new_ref); | 2055 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); |
2055 Dart_DeleteWeakPersistentHandle(weak_old_ref); | 2056 Dart_DeleteWeakPersistentHandle(isolate, weak_new_ref); |
| 2057 Dart_DeleteWeakPersistentHandle(isolate, weak_old_ref); |
2056 | 2058 |
2057 // Garbage collect one last time to revisit deleted handles. | 2059 // Garbage collect one last time to revisit deleted handles. |
2058 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); | 2060 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); |
2059 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2061 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
2060 } | 2062 } |
2061 | 2063 |
2062 | 2064 |
2063 static void WeakPersistentHandlePeerFinalizer( | 2065 static void WeakPersistentHandlePeerFinalizer(Dart_Isolate isolate, |
2064 Dart_WeakPersistentHandle handle, void* peer) { | 2066 Dart_WeakPersistentHandle handle, |
| 2067 void* peer) { |
2065 *static_cast<int*>(peer) = 42; | 2068 *static_cast<int*>(peer) = 42; |
2066 } | 2069 } |
2067 | 2070 |
2068 | 2071 |
2069 TEST_CASE(WeakPersistentHandleCallback) { | 2072 TEST_CASE(WeakPersistentHandleCallback) { |
2070 Dart_WeakPersistentHandle weak_ref = NULL; | 2073 Dart_WeakPersistentHandle weak_ref = NULL; |
2071 int peer = 0; | 2074 int peer = 0; |
2072 { | 2075 { |
2073 Dart_EnterScope(); | 2076 Dart_EnterScope(); |
2074 Dart_Handle obj = NewString("new string"); | 2077 Dart_Handle obj = NewString("new string"); |
2075 EXPECT_VALID(obj); | 2078 EXPECT_VALID(obj); |
2076 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, | 2079 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, |
2077 WeakPersistentHandlePeerFinalizer); | 2080 WeakPersistentHandlePeerFinalizer); |
2078 EXPECT_VALID(AsHandle(weak_ref)); | 2081 EXPECT_VALID(AsHandle(weak_ref)); |
2079 EXPECT(peer == 0); | 2082 EXPECT(peer == 0); |
2080 Dart_ExitScope(); | 2083 Dart_ExitScope(); |
2081 } | 2084 } |
2082 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2085 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
2083 EXPECT(peer == 0); | 2086 EXPECT(peer == 0); |
2084 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2087 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
2085 EXPECT(peer == 42); | 2088 EXPECT(peer == 42); |
2086 Dart_DeleteWeakPersistentHandle(weak_ref); | 2089 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); |
| 2090 Dart_DeleteWeakPersistentHandle(isolate, weak_ref); |
2087 } | 2091 } |
2088 | 2092 |
2089 | 2093 |
2090 TEST_CASE(WeakPersistentHandleNoCallback) { | 2094 TEST_CASE(WeakPersistentHandleNoCallback) { |
2091 Dart_WeakPersistentHandle weak_ref = NULL; | 2095 Dart_WeakPersistentHandle weak_ref = NULL; |
2092 int peer = 0; | 2096 int peer = 0; |
2093 { | 2097 { |
2094 Dart_EnterScope(); | 2098 Dart_EnterScope(); |
2095 Dart_Handle obj = NewString("new string"); | 2099 Dart_Handle obj = NewString("new string"); |
2096 EXPECT_VALID(obj); | 2100 EXPECT_VALID(obj); |
2097 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, | 2101 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, |
2098 WeakPersistentHandlePeerFinalizer); | 2102 WeakPersistentHandlePeerFinalizer); |
2099 Dart_ExitScope(); | 2103 Dart_ExitScope(); |
2100 } | 2104 } |
2101 // A finalizer is not invoked on a deleted handle. Therefore, the | 2105 // A finalizer is not invoked on a deleted handle. Therefore, the |
2102 // peer value should not change after the referent is collected. | 2106 // peer value should not change after the referent is collected. |
2103 Dart_DeleteWeakPersistentHandle(weak_ref); | 2107 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); |
| 2108 Dart_DeleteWeakPersistentHandle(isolate, weak_ref); |
2104 EXPECT(peer == 0); | 2109 EXPECT(peer == 0); |
2105 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2110 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
2106 EXPECT(peer == 0); | 2111 EXPECT(peer == 0); |
2107 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2112 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
2108 EXPECT(peer == 0); | 2113 EXPECT(peer == 0); |
2109 } | 2114 } |
2110 | 2115 |
2111 | 2116 |
2112 UNIT_TEST_CASE(WeakPersistentHandlesCallbackShutdown) { | 2117 UNIT_TEST_CASE(WeakPersistentHandlesCallbackShutdown) { |
2113 TestCase::CreateTestIsolate(); | 2118 TestCase::CreateTestIsolate(); |
(...skipping 5798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7912 NewString("main"), | 7917 NewString("main"), |
7913 1, | 7918 1, |
7914 dart_args); | 7919 dart_args); |
7915 int64_t value = 0; | 7920 int64_t value = 0; |
7916 result = Dart_IntegerToInt64(result, &value); | 7921 result = Dart_IntegerToInt64(result, &value); |
7917 EXPECT_VALID(result); | 7922 EXPECT_VALID(result); |
7918 EXPECT_EQ(6, value); | 7923 EXPECT_EQ(6, value); |
7919 } | 7924 } |
7920 | 7925 |
7921 } // namespace dart | 7926 } // namespace dart |
OLD | NEW |