| 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 1759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1770 // Check that result is true. | 1770 // Check that result is true. |
| 1771 EXPECT_VALID(result); | 1771 EXPECT_VALID(result); |
| 1772 EXPECT(Dart_IsBoolean(result)); | 1772 EXPECT(Dart_IsBoolean(result)); |
| 1773 bool value = false; | 1773 bool value = false; |
| 1774 result = Dart_BooleanValue(result, &value); | 1774 result = Dart_BooleanValue(result, &value); |
| 1775 EXPECT_VALID(result); | 1775 EXPECT_VALID(result); |
| 1776 EXPECT(value); | 1776 EXPECT(value); |
| 1777 } | 1777 } |
| 1778 | 1778 |
| 1779 | 1779 |
| 1780 static void ExternalTypedDataFinalizer(Dart_Isolate isolate, | 1780 static void NopCallback(void* isolate_callback_data, |
| 1781 Dart_WeakPersistentHandle handle, |
| 1782 void* peer) { |
| 1783 } |
| 1784 |
| 1785 |
| 1786 static void ExternalTypedDataFinalizer(void* isolate_callback_data, |
| 1781 Dart_WeakPersistentHandle handle, | 1787 Dart_WeakPersistentHandle handle, |
| 1782 void* peer) { | 1788 void* peer) { |
| 1783 Dart_DeleteWeakPersistentHandle(isolate, handle); | |
| 1784 *static_cast<int*>(peer) = 42; | 1789 *static_cast<int*>(peer) = 42; |
| 1785 } | 1790 } |
| 1786 | 1791 |
| 1787 | 1792 |
| 1788 TEST_CASE(ExternalTypedDataCallback) { | 1793 TEST_CASE(ExternalTypedDataCallback) { |
| 1789 int peer = 0; | 1794 int peer = 0; |
| 1790 { | 1795 { |
| 1791 Dart_EnterScope(); | 1796 Dart_EnterScope(); |
| 1792 uint8_t data[] = { 1, 2, 3, 4 }; | 1797 uint8_t data[] = { 1, 2, 3, 4 }; |
| 1793 Dart_Handle obj = Dart_NewExternalTypedData( | 1798 Dart_Handle obj = Dart_NewExternalTypedData( |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2029 static Dart_Handle AsHandle(Dart_PersistentHandle weak) { | 2034 static Dart_Handle AsHandle(Dart_PersistentHandle weak) { |
| 2030 return Dart_HandleFromPersistent(weak); | 2035 return Dart_HandleFromPersistent(weak); |
| 2031 } | 2036 } |
| 2032 | 2037 |
| 2033 | 2038 |
| 2034 static Dart_Handle AsHandle(Dart_WeakPersistentHandle weak) { | 2039 static Dart_Handle AsHandle(Dart_WeakPersistentHandle weak) { |
| 2035 return Dart_HandleFromWeakPersistent(weak); | 2040 return Dart_HandleFromWeakPersistent(weak); |
| 2036 } | 2041 } |
| 2037 | 2042 |
| 2038 | 2043 |
| 2044 static Dart_WeakPersistentHandle weak_new_ref = NULL; |
| 2045 static Dart_WeakPersistentHandle weak_old_ref = NULL; |
| 2046 |
| 2047 |
| 2048 static void WeakPersistentHandleCallback(void* isolate_callback_data, |
| 2049 Dart_WeakPersistentHandle handle, |
| 2050 void* peer) { |
| 2051 if (handle == weak_new_ref) { |
| 2052 weak_new_ref = NULL; |
| 2053 } else if (handle == weak_old_ref) { |
| 2054 weak_old_ref = NULL; |
| 2055 } |
| 2056 } |
| 2057 |
| 2058 |
| 2039 TEST_CASE(WeakPersistentHandle) { | 2059 TEST_CASE(WeakPersistentHandle) { |
| 2040 Dart_Handle local_new_ref = Dart_Null(); | 2060 Dart_Handle local_new_ref = Dart_Null(); |
| 2041 Dart_WeakPersistentHandle weak_new_ref = Dart_NewWeakPersistentHandle( | 2061 weak_new_ref = Dart_NewWeakPersistentHandle( |
| 2042 local_new_ref, NULL, 0, NULL); | 2062 local_new_ref, NULL, 0, WeakPersistentHandleCallback); |
| 2043 | 2063 |
| 2044 Dart_Handle local_old_ref = Dart_Null(); | 2064 Dart_Handle local_old_ref = Dart_Null(); |
| 2045 Dart_WeakPersistentHandle weak_old_ref = Dart_NewWeakPersistentHandle( | 2065 weak_old_ref = Dart_NewWeakPersistentHandle( |
| 2046 local_old_ref, NULL, 0, NULL); | 2066 local_old_ref, NULL, 0, WeakPersistentHandleCallback); |
| 2047 | 2067 |
| 2048 { | 2068 { |
| 2049 Dart_EnterScope(); | 2069 Dart_EnterScope(); |
| 2050 | 2070 |
| 2051 // Create an object in new space. | 2071 // Create an object in new space. |
| 2052 Dart_Handle new_ref = NewString("new string"); | 2072 Dart_Handle new_ref = NewString("new string"); |
| 2053 EXPECT_VALID(new_ref); | 2073 EXPECT_VALID(new_ref); |
| 2054 | 2074 |
| 2055 // Create an object in old space. | 2075 // Create an object in old space. |
| 2056 Dart_Handle old_ref; | 2076 Dart_Handle old_ref; |
| 2057 { | 2077 { |
| 2058 Isolate* isolate = Isolate::Current(); | 2078 Isolate* isolate = Isolate::Current(); |
| 2059 DARTSCOPE(isolate); | 2079 DARTSCOPE(isolate); |
| 2060 old_ref = Api::NewHandle(isolate, String::New("old string", Heap::kOld)); | 2080 old_ref = Api::NewHandle(isolate, String::New("old string", Heap::kOld)); |
| 2061 EXPECT_VALID(old_ref); | 2081 EXPECT_VALID(old_ref); |
| 2062 } | 2082 } |
| 2063 | 2083 |
| 2064 // Create a weak ref to the new space object. | 2084 // Create a weak ref to the new space object. |
| 2065 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, 0, NULL); | 2085 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, |
| 2086 NULL, |
| 2087 0, |
| 2088 WeakPersistentHandleCallback); |
| 2066 EXPECT_VALID(AsHandle(weak_new_ref)); | 2089 EXPECT_VALID(AsHandle(weak_new_ref)); |
| 2067 EXPECT(!Dart_IsNull(AsHandle(weak_new_ref))); | 2090 EXPECT(!Dart_IsNull(AsHandle(weak_new_ref))); |
| 2068 | 2091 |
| 2069 // Create a weak ref to the old space object. | 2092 // Create a weak ref to the old space object. |
| 2070 weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, 0, NULL); | 2093 weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, |
| 2094 NULL, |
| 2095 0, |
| 2096 WeakPersistentHandleCallback); |
| 2071 EXPECT_VALID(AsHandle(weak_old_ref)); | 2097 EXPECT_VALID(AsHandle(weak_old_ref)); |
| 2072 EXPECT(!Dart_IsNull(AsHandle(weak_old_ref))); | 2098 EXPECT(!Dart_IsNull(AsHandle(weak_old_ref))); |
| 2073 | 2099 |
| 2074 // Garbage collect new space. | 2100 // Garbage collect new space. |
| 2075 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2101 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2076 | 2102 |
| 2077 // Nothing should be invalidated or cleared. | 2103 // Nothing should be invalidated or cleared. |
| 2078 EXPECT_VALID(new_ref); | 2104 EXPECT_VALID(new_ref); |
| 2079 EXPECT(!Dart_IsNull(new_ref)); | 2105 EXPECT(!Dart_IsNull(new_ref)); |
| 2080 EXPECT_VALID(old_ref); | 2106 EXPECT_VALID(old_ref); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2108 // Delete local (strong) references. | 2134 // Delete local (strong) references. |
| 2109 Dart_ExitScope(); | 2135 Dart_ExitScope(); |
| 2110 } | 2136 } |
| 2111 | 2137 |
| 2112 // Garbage collect new space again. | 2138 // Garbage collect new space again. |
| 2113 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2139 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2114 | 2140 |
| 2115 { | 2141 { |
| 2116 Dart_EnterScope(); | 2142 Dart_EnterScope(); |
| 2117 // Weak ref to new space object should now be cleared. | 2143 // Weak ref to new space object should now be cleared. |
| 2118 EXPECT_VALID(AsHandle(weak_new_ref)); | 2144 EXPECT(weak_new_ref == NULL); |
| 2119 EXPECT(Dart_IsNull(AsHandle(weak_new_ref))); | |
| 2120 EXPECT_VALID(AsHandle(weak_old_ref)); | 2145 EXPECT_VALID(AsHandle(weak_old_ref)); |
| 2121 EXPECT(!Dart_IsNull(AsHandle(weak_old_ref))); | 2146 EXPECT(!Dart_IsNull(AsHandle(weak_old_ref))); |
| 2122 Dart_ExitScope(); | 2147 Dart_ExitScope(); |
| 2123 } | 2148 } |
| 2124 | 2149 |
| 2125 // Garbage collect old space again. | 2150 // Garbage collect old space again. |
| 2126 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2151 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2127 | 2152 |
| 2128 { | 2153 { |
| 2129 Dart_EnterScope(); | 2154 Dart_EnterScope(); |
| 2130 // Weak ref to old space object should now be cleared. | 2155 // Weak ref to old space object should now be cleared. |
| 2131 EXPECT_VALID(AsHandle(weak_new_ref)); | 2156 EXPECT(weak_new_ref == NULL); |
| 2132 EXPECT(Dart_IsNull(AsHandle(weak_new_ref))); | 2157 EXPECT(weak_old_ref == NULL); |
| 2133 EXPECT_VALID(AsHandle(weak_old_ref)); | |
| 2134 EXPECT(Dart_IsNull(AsHandle(weak_old_ref))); | |
| 2135 Dart_ExitScope(); | 2158 Dart_ExitScope(); |
| 2136 } | 2159 } |
| 2137 | 2160 |
| 2138 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); | |
| 2139 Dart_DeleteWeakPersistentHandle(isolate, weak_new_ref); | |
| 2140 Dart_DeleteWeakPersistentHandle(isolate, weak_old_ref); | |
| 2141 | |
| 2142 // Garbage collect one last time to revisit deleted handles. | 2161 // Garbage collect one last time to revisit deleted handles. |
| 2143 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); | 2162 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); |
| 2144 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2163 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2145 } | 2164 } |
| 2146 | 2165 |
| 2147 | 2166 |
| 2148 static void WeakPersistentHandlePeerFinalizer(Dart_Isolate isolate, | 2167 static void WeakPersistentHandlePeerFinalizer(void* isolate_callback_data, |
| 2149 Dart_WeakPersistentHandle handle, | 2168 Dart_WeakPersistentHandle handle, |
| 2150 void* peer) { | 2169 void* peer) { |
| 2151 *static_cast<int*>(peer) = 42; | 2170 *static_cast<int*>(peer) = 42; |
| 2152 } | 2171 } |
| 2153 | 2172 |
| 2154 | 2173 |
| 2155 TEST_CASE(WeakPersistentHandleCallback) { | 2174 TEST_CASE(WeakPersistentHandleCallback) { |
| 2156 Dart_WeakPersistentHandle weak_ref = NULL; | 2175 Dart_WeakPersistentHandle weak_ref = NULL; |
| 2157 int peer = 0; | 2176 int peer = 0; |
| 2158 { | 2177 { |
| 2159 Dart_EnterScope(); | 2178 Dart_EnterScope(); |
| 2160 Dart_Handle obj = NewString("new string"); | 2179 Dart_Handle obj = NewString("new string"); |
| 2161 EXPECT_VALID(obj); | 2180 EXPECT_VALID(obj); |
| 2162 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0, | 2181 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0, |
| 2163 WeakPersistentHandlePeerFinalizer); | 2182 WeakPersistentHandlePeerFinalizer); |
| 2164 EXPECT_VALID(AsHandle(weak_ref)); | 2183 EXPECT_VALID(AsHandle(weak_ref)); |
| 2165 EXPECT(peer == 0); | 2184 EXPECT(peer == 0); |
| 2166 Dart_ExitScope(); | 2185 Dart_ExitScope(); |
| 2167 } | 2186 } |
| 2168 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2187 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2169 EXPECT(peer == 0); | 2188 EXPECT(peer == 0); |
| 2170 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2189 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2171 EXPECT(peer == 42); | 2190 EXPECT(peer == 42); |
| 2172 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); | |
| 2173 Dart_DeleteWeakPersistentHandle(isolate, weak_ref); | |
| 2174 } | 2191 } |
| 2175 | 2192 |
| 2176 | 2193 |
| 2177 TEST_CASE(WeakPersistentHandleNoCallback) { | 2194 TEST_CASE(WeakPersistentHandleNoCallback) { |
| 2178 Dart_WeakPersistentHandle weak_ref = NULL; | 2195 Dart_WeakPersistentHandle weak_ref = NULL; |
| 2179 int peer = 0; | 2196 int peer = 0; |
| 2180 { | 2197 { |
| 2181 Dart_EnterScope(); | 2198 Dart_EnterScope(); |
| 2182 Dart_Handle obj = NewString("new string"); | 2199 Dart_Handle obj = NewString("new string"); |
| 2183 EXPECT_VALID(obj); | 2200 EXPECT_VALID(obj); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2214 TEST_CASE(WeakPersistentHandleExternalAllocationSize) { | 2231 TEST_CASE(WeakPersistentHandleExternalAllocationSize) { |
| 2215 Heap* heap = Isolate::Current()->heap(); | 2232 Heap* heap = Isolate::Current()->heap(); |
| 2216 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); | 2233 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); |
| 2217 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); | 2234 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); |
| 2218 Dart_WeakPersistentHandle weak1 = NULL; | 2235 Dart_WeakPersistentHandle weak1 = NULL; |
| 2219 static const intptr_t kWeak1ExternalSize = 1 * KB; | 2236 static const intptr_t kWeak1ExternalSize = 1 * KB; |
| 2220 { | 2237 { |
| 2221 Dart_EnterScope(); | 2238 Dart_EnterScope(); |
| 2222 Dart_Handle obj = NewString("weakly referenced string"); | 2239 Dart_Handle obj = NewString("weakly referenced string"); |
| 2223 EXPECT_VALID(obj); | 2240 EXPECT_VALID(obj); |
| 2224 weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize, NULL); | 2241 weak1 = Dart_NewWeakPersistentHandle(obj, |
| 2242 NULL, |
| 2243 kWeak1ExternalSize, |
| 2244 NopCallback); |
| 2225 EXPECT_VALID(AsHandle(weak1)); | 2245 EXPECT_VALID(AsHandle(weak1)); |
| 2226 EXPECT(!Dart_IsPrologueWeakPersistentHandle(weak1)); | 2246 EXPECT(!Dart_IsPrologueWeakPersistentHandle(weak1)); |
| 2227 Dart_ExitScope(); | 2247 Dart_ExitScope(); |
| 2228 } | 2248 } |
| 2229 Dart_PersistentHandle strong_ref = NULL; | 2249 Dart_PersistentHandle strong_ref = NULL; |
| 2230 Dart_WeakPersistentHandle weak2 = NULL; | 2250 Dart_WeakPersistentHandle weak2 = NULL; |
| 2231 static const intptr_t kWeak2ExternalSize = 2 * KB; | 2251 static const intptr_t kWeak2ExternalSize = 2 * KB; |
| 2232 { | 2252 { |
| 2233 Dart_EnterScope(); | 2253 Dart_EnterScope(); |
| 2234 Dart_Handle obj = NewString("strongly referenced string"); | 2254 Dart_Handle obj = NewString("strongly referenced string"); |
| 2235 EXPECT_VALID(obj); | 2255 EXPECT_VALID(obj); |
| 2236 strong_ref = Dart_NewPersistentHandle(obj); | 2256 strong_ref = Dart_NewPersistentHandle(obj); |
| 2237 weak2 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak2ExternalSize, NULL); | 2257 weak2 = Dart_NewWeakPersistentHandle(obj, |
| 2258 NULL, |
| 2259 kWeak2ExternalSize, |
| 2260 NopCallback); |
| 2238 EXPECT_VALID(AsHandle(strong_ref)); | 2261 EXPECT_VALID(AsHandle(strong_ref)); |
| 2239 Dart_ExitScope(); | 2262 Dart_ExitScope(); |
| 2240 } | 2263 } |
| 2241 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2264 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2242 EXPECT(heap->ExternalInWords(Heap::kNew) == | 2265 EXPECT(heap->ExternalInWords(Heap::kNew) == |
| 2243 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize); | 2266 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize); |
| 2244 // Collect weakly referenced string, and promote strongly referenced string. | 2267 // Collect weakly referenced string, and promote strongly referenced string. |
| 2245 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2268 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2246 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2269 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2247 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); | 2270 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2259 Heap* heap = Isolate::Current()->heap(); | 2282 Heap* heap = Isolate::Current()->heap(); |
| 2260 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); | 2283 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); |
| 2261 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); | 2284 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); |
| 2262 Dart_WeakPersistentHandle pwph = NULL; | 2285 Dart_WeakPersistentHandle pwph = NULL; |
| 2263 static const intptr_t kWeakExternalSize = 1 * KB; | 2286 static const intptr_t kWeakExternalSize = 1 * KB; |
| 2264 { | 2287 { |
| 2265 Dart_EnterScope(); | 2288 Dart_EnterScope(); |
| 2266 Dart_Handle obj = NewString("a string"); | 2289 Dart_Handle obj = NewString("a string"); |
| 2267 EXPECT_VALID(obj); | 2290 EXPECT_VALID(obj); |
| 2268 pwph = Dart_NewPrologueWeakPersistentHandle( | 2291 pwph = Dart_NewPrologueWeakPersistentHandle( |
| 2269 obj, NULL, kWeakExternalSize, NULL); | 2292 obj, NULL, kWeakExternalSize, NopCallback); |
| 2270 EXPECT_VALID(AsHandle(pwph)); | 2293 EXPECT_VALID(AsHandle(pwph)); |
| 2271 Dart_ExitScope(); | 2294 Dart_ExitScope(); |
| 2272 } | 2295 } |
| 2273 EXPECT(heap->ExternalInWords(Heap::kNew) == kWeakExternalSize / kWordSize); | 2296 EXPECT(heap->ExternalInWords(Heap::kNew) == kWeakExternalSize / kWordSize); |
| 2274 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); | 2297 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); |
| 2275 // Promoting the string should transfer the external size to old. | 2298 // Promoting the string should transfer the external size to old. |
| 2276 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2299 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2277 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2300 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2278 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); | 2301 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); |
| 2279 EXPECT(heap->ExternalInWords(Heap::kOld) == kWeakExternalSize / kWordSize); | 2302 EXPECT(heap->ExternalInWords(Heap::kOld) == kWeakExternalSize / kWordSize); |
| 2280 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2303 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2281 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); | 2304 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); |
| 2282 } | 2305 } |
| 2283 | 2306 |
| 2284 | 2307 |
| 2285 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOversized) { | 2308 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOversized) { |
| 2286 Heap* heap = Isolate::Current()->heap(); | 2309 Heap* heap = Isolate::Current()->heap(); |
| 2287 Dart_WeakPersistentHandle weak1 = NULL; | 2310 Dart_WeakPersistentHandle weak1 = NULL; |
| 2288 const intptr_t kWeak1ExternalSize = 100 * MB; | 2311 const intptr_t kWeak1ExternalSize = 100 * MB; |
| 2289 { | 2312 { |
| 2290 Dart_EnterScope(); | 2313 Dart_EnterScope(); |
| 2291 Dart_Handle obj = NewString("weakly referenced string"); | 2314 Dart_Handle obj = NewString("weakly referenced string"); |
| 2292 EXPECT_VALID(obj); | 2315 EXPECT_VALID(obj); |
| 2293 weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize, NULL); | 2316 weak1 = Dart_NewWeakPersistentHandle(obj, |
| 2317 NULL, |
| 2318 kWeak1ExternalSize, |
| 2319 NopCallback); |
| 2294 EXPECT_VALID(AsHandle(weak1)); | 2320 EXPECT_VALID(AsHandle(weak1)); |
| 2295 // While new space is "full" of external data, any allocation will | 2321 // While new space is "full" of external data, any allocation will |
| 2296 // trigger GC, so after two of them, obj should be promoted. | 2322 // trigger GC, so after two of them, obj should be promoted. |
| 2297 Dart_Handle trigger1 = NewString("trigger1"); | 2323 Dart_Handle trigger1 = NewString("trigger1"); |
| 2298 EXPECT_VALID(trigger1); | 2324 EXPECT_VALID(trigger1); |
| 2299 Dart_Handle trigger2 = NewString("trigger2"); | 2325 Dart_Handle trigger2 = NewString("trigger2"); |
| 2300 EXPECT_VALID(trigger2); | 2326 EXPECT_VALID(trigger2); |
| 2301 { | 2327 { |
| 2302 DARTSCOPE(Isolate::Current()); | 2328 DARTSCOPE(Isolate::Current()); |
| 2303 String& handle = String::Handle(); | 2329 String& handle = String::Handle(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2319 Heap* heap = Isolate::Current()->heap(); | 2345 Heap* heap = Isolate::Current()->heap(); |
| 2320 Dart_WeakPersistentHandle weak1 = NULL; | 2346 Dart_WeakPersistentHandle weak1 = NULL; |
| 2321 static const intptr_t kWeak1ExternalSize = 1 * KB; | 2347 static const intptr_t kWeak1ExternalSize = 1 * KB; |
| 2322 Dart_WeakPersistentHandle weak2 = NULL; | 2348 Dart_WeakPersistentHandle weak2 = NULL; |
| 2323 static const intptr_t kWeak2ExternalSize = 2 * KB; | 2349 static const intptr_t kWeak2ExternalSize = 2 * KB; |
| 2324 { | 2350 { |
| 2325 Dart_EnterScope(); | 2351 Dart_EnterScope(); |
| 2326 Dart_Handle dart_null = Dart_Null(); // VM heap object. | 2352 Dart_Handle dart_null = Dart_Null(); // VM heap object. |
| 2327 EXPECT_VALID(dart_null); | 2353 EXPECT_VALID(dart_null); |
| 2328 weak1 = Dart_NewWeakPersistentHandle( | 2354 weak1 = Dart_NewWeakPersistentHandle( |
| 2329 dart_null, NULL, kWeak1ExternalSize, NULL); | 2355 dart_null, NULL, kWeak1ExternalSize, NopCallback); |
| 2330 EXPECT_VALID(AsHandle(weak1)); | 2356 EXPECT_VALID(AsHandle(weak1)); |
| 2331 Dart_Handle zero = Dart_NewInteger(0); // Smi. | 2357 Dart_Handle zero = Dart_NewInteger(0); // Smi. |
| 2332 EXPECT_VALID(dart_null); | 2358 EXPECT_VALID(dart_null); |
| 2333 weak2 = Dart_NewWeakPersistentHandle( | 2359 weak2 = Dart_NewWeakPersistentHandle( |
| 2334 zero, NULL, kWeak2ExternalSize, NULL); | 2360 zero, NULL, kWeak2ExternalSize, NopCallback); |
| 2335 EXPECT_VALID(AsHandle(weak2)); | 2361 EXPECT_VALID(AsHandle(weak2)); |
| 2336 // Both should be charged to old space. | 2362 // Both should be charged to old space. |
| 2337 EXPECT(heap->ExternalInWords(Heap::kOld) == | 2363 EXPECT(heap->ExternalInWords(Heap::kOld) == |
| 2338 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize); | 2364 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize); |
| 2339 Dart_ExitScope(); | 2365 Dart_ExitScope(); |
| 2340 } | 2366 } |
| 2341 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); | 2367 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); |
| 2342 Dart_DeleteWeakPersistentHandle(isolate, weak1); | 2368 Dart_DeleteWeakPersistentHandle(isolate, weak1); |
| 2343 Dart_DeleteWeakPersistentHandle(isolate, weak2); | 2369 Dart_DeleteWeakPersistentHandle(isolate, weak2); |
| 2344 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2370 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2345 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); | 2371 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); |
| 2346 } | 2372 } |
| 2347 | 2373 |
| 2348 | 2374 |
| 2375 static Dart_WeakPersistentHandle weak1 = NULL; |
| 2376 static Dart_WeakPersistentHandle weak2 = NULL; |
| 2377 static Dart_WeakPersistentHandle weak3 = NULL; |
| 2378 static Dart_WeakPersistentHandle weak4 = NULL; |
| 2379 |
| 2380 |
| 2381 static void ObjectGroupsCallback(void* isolate_callback_data, |
| 2382 Dart_WeakPersistentHandle handle, |
| 2383 void* peer) { |
| 2384 if (handle == weak1) { |
| 2385 weak1 = NULL; |
| 2386 } else if (handle == weak2) { |
| 2387 weak2 = NULL; |
| 2388 } else if (handle == weak3) { |
| 2389 weak3 = NULL; |
| 2390 } else if (handle == weak4) { |
| 2391 weak4 = NULL; |
| 2392 } |
| 2393 } |
| 2394 |
| 2395 |
| 2349 TEST_CASE(ObjectGroups) { | 2396 TEST_CASE(ObjectGroups) { |
| 2350 Dart_PersistentHandle strong = NULL; | 2397 Dart_PersistentHandle strong = NULL; |
| 2351 Dart_WeakPersistentHandle strong_weak = NULL; | 2398 Dart_WeakPersistentHandle strong_weak = NULL; |
| 2352 | 2399 |
| 2353 Dart_WeakPersistentHandle weak1 = NULL; | |
| 2354 Dart_WeakPersistentHandle weak2 = NULL; | |
| 2355 Dart_WeakPersistentHandle weak3 = NULL; | |
| 2356 Dart_WeakPersistentHandle weak4 = NULL; | |
| 2357 | |
| 2358 Dart_EnterScope(); | 2400 Dart_EnterScope(); |
| 2359 { | 2401 { |
| 2360 Isolate* isolate = Isolate::Current(); | 2402 Isolate* isolate = Isolate::Current(); |
| 2361 DARTSCOPE(isolate); | 2403 DARTSCOPE(isolate); |
| 2362 | 2404 |
| 2363 Dart_Handle local = Api::NewHandle( | 2405 Dart_Handle local = Api::NewHandle( |
| 2364 isolate, String::New("strongly reachable", Heap::kOld)); | 2406 isolate, String::New("strongly reachable", Heap::kOld)); |
| 2365 strong = Dart_NewPersistentHandle(local); | 2407 strong = Dart_NewPersistentHandle(local); |
| 2366 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL); | 2408 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); |
| 2367 EXPECT_VALID(AsHandle(strong)); | 2409 EXPECT_VALID(AsHandle(strong)); |
| 2368 EXPECT(!Dart_IsNull(AsHandle(strong))); | 2410 EXPECT(!Dart_IsNull(AsHandle(strong))); |
| 2369 | 2411 |
| 2370 weak1 = Dart_NewWeakPersistentHandle( | 2412 weak1 = Dart_NewWeakPersistentHandle( |
| 2371 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)), | 2413 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)), |
| 2372 NULL, 0, NULL); | 2414 NULL, 0, ObjectGroupsCallback); |
| 2373 EXPECT_VALID(AsHandle(weak1)); | 2415 EXPECT_VALID(AsHandle(weak1)); |
| 2374 EXPECT(!Dart_IsNull(AsHandle(weak1))); | 2416 EXPECT(!Dart_IsNull(AsHandle(weak1))); |
| 2375 | 2417 |
| 2376 weak2 = Dart_NewWeakPersistentHandle( | 2418 weak2 = Dart_NewWeakPersistentHandle( |
| 2377 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)), | 2419 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)), |
| 2378 NULL, 0, NULL); | 2420 NULL, 0, ObjectGroupsCallback); |
| 2379 EXPECT_VALID(AsHandle(weak2)); | 2421 EXPECT_VALID(AsHandle(weak2)); |
| 2380 EXPECT(!Dart_IsNull(AsHandle(weak2))); | 2422 EXPECT(!Dart_IsNull(AsHandle(weak2))); |
| 2381 | 2423 |
| 2382 weak3 = Dart_NewWeakPersistentHandle( | 2424 weak3 = Dart_NewWeakPersistentHandle( |
| 2383 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)), | 2425 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)), |
| 2384 NULL, 0, NULL); | 2426 NULL, 0, ObjectGroupsCallback); |
| 2385 EXPECT_VALID(AsHandle(weak3)); | 2427 EXPECT_VALID(AsHandle(weak3)); |
| 2386 EXPECT(!Dart_IsNull(AsHandle(weak3))); | 2428 EXPECT(!Dart_IsNull(AsHandle(weak3))); |
| 2387 | 2429 |
| 2388 weak4 = Dart_NewWeakPersistentHandle( | 2430 weak4 = Dart_NewWeakPersistentHandle( |
| 2389 Api::NewHandle(isolate, String::New("weakly reachable 4", Heap::kOld)), | 2431 Api::NewHandle(isolate, String::New("weakly reachable 4", Heap::kOld)), |
| 2390 NULL, 0, NULL); | 2432 NULL, 0, ObjectGroupsCallback); |
| 2391 EXPECT_VALID(AsHandle(weak4)); | 2433 EXPECT_VALID(AsHandle(weak4)); |
| 2392 EXPECT(!Dart_IsNull(AsHandle(weak4))); | 2434 EXPECT(!Dart_IsNull(AsHandle(weak4))); |
| 2393 } | 2435 } |
| 2394 Dart_ExitScope(); | 2436 Dart_ExitScope(); |
| 2395 | 2437 |
| 2396 { | 2438 { |
| 2397 Dart_EnterScope(); | 2439 Dart_EnterScope(); |
| 2398 EXPECT_VALID(AsHandle(strong)); | 2440 EXPECT_VALID(AsHandle(strong)); |
| 2399 EXPECT_VALID(AsHandle(weak1)); | 2441 EXPECT_VALID(AsHandle(weak1)); |
| 2400 EXPECT_VALID(AsHandle(weak2)); | 2442 EXPECT_VALID(AsHandle(weak2)); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2506 | 2548 |
| 2507 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2549 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2508 } | 2550 } |
| 2509 | 2551 |
| 2510 { | 2552 { |
| 2511 Dart_EnterScope(); | 2553 Dart_EnterScope(); |
| 2512 // Only weak1 and weak2 should be preserved. | 2554 // Only weak1 and weak2 should be preserved. |
| 2513 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); | 2555 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); |
| 2514 EXPECT(!Dart_IsNull(AsHandle(weak1))); | 2556 EXPECT(!Dart_IsNull(AsHandle(weak1))); |
| 2515 EXPECT(!Dart_IsNull(AsHandle(weak2))); | 2557 EXPECT(!Dart_IsNull(AsHandle(weak2))); |
| 2516 EXPECT(Dart_IsNull(AsHandle(weak3))); | 2558 EXPECT(weak3 == NULL); |
| 2517 EXPECT(Dart_IsNull(AsHandle(weak4))); | 2559 EXPECT(weak4 == NULL); |
| 2518 Dart_ExitScope(); | 2560 Dart_ExitScope(); |
| 2519 } | 2561 } |
| 2520 | 2562 |
| 2521 { | 2563 { |
| 2564 Dart_WeakPersistentHandle lweak3 = Dart_NewWeakPersistentHandle( |
| 2565 Dart_Null(), NULL, 0, NopCallback); |
| 2522 Dart_WeakPersistentHandle array1[] = { weak1, strong_weak }; | 2566 Dart_WeakPersistentHandle array1[] = { weak1, strong_weak }; |
| 2523 EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1), | 2567 EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1), |
| 2524 array1, ARRAY_SIZE(array1))); | 2568 array1, ARRAY_SIZE(array1))); |
| 2525 | 2569 |
| 2526 // weak3 is cleared so weak2 is unreferenced and should be cleared | 2570 // lweak3 is unreferenced so weak2 is unreferenced and should be cleared |
| 2527 Dart_WeakPersistentHandle array2[] = { weak2, weak3 }; | 2571 Dart_WeakPersistentHandle array2[] = { weak2, lweak3 }; |
| 2528 EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2), | 2572 EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2), |
| 2529 array2, ARRAY_SIZE(array2))); | 2573 array2, ARRAY_SIZE(array2))); |
| 2530 | 2574 |
| 2531 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2575 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2532 } | 2576 } |
| 2533 | 2577 |
| 2534 { | 2578 { |
| 2535 Dart_EnterScope(); | 2579 Dart_EnterScope(); |
| 2536 // Only weak1 should be preserved, weak3 should not preserve weak2. | 2580 // Only weak1 should be preserved, weak3 should not preserve weak2. |
| 2537 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); | 2581 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); |
| 2538 EXPECT(!Dart_IsNull(AsHandle(weak1))); | 2582 EXPECT(!Dart_IsNull(AsHandle(weak1))); |
| 2539 EXPECT(Dart_IsNull(AsHandle(weak2))); | 2583 EXPECT(weak2 == NULL); |
| 2540 EXPECT(Dart_IsNull(AsHandle(weak3))); // was cleared, should remain cleared | 2584 EXPECT(weak3 == NULL); // was cleared, should remain cleared |
| 2541 EXPECT(Dart_IsNull(AsHandle(weak4))); // was cleared, should remain cleared | 2585 EXPECT(weak4 == NULL); // was cleared, should remain cleared |
| 2542 Dart_ExitScope(); | 2586 Dart_ExitScope(); |
| 2543 } | 2587 } |
| 2544 | 2588 |
| 2545 { | 2589 { |
| 2546 // weak{2,3,4} are cleared and should have no effect on weak1 | 2590 Dart_WeakPersistentHandle lweak2 = Dart_NewWeakPersistentHandle( |
| 2547 Dart_WeakPersistentHandle array1[] = { strong_weak, weak2, weak3, weak4 }; | 2591 Dart_Null(), NULL, 0, NopCallback); |
| 2592 Dart_WeakPersistentHandle lweak3 = Dart_NewWeakPersistentHandle( |
| 2593 Dart_Null(), NULL, 0, NopCallback); |
| 2594 Dart_WeakPersistentHandle lweak4 = Dart_NewWeakPersistentHandle( |
| 2595 Dart_Null(), NULL, 0, NopCallback); |
| 2596 // lweak{2,3,4} are cleared and should have no effect on weak1 |
| 2597 Dart_WeakPersistentHandle array1[] = { strong_weak, |
| 2598 lweak2, |
| 2599 lweak3, |
| 2600 lweak4 }; |
| 2548 EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1), | 2601 EXPECT_VALID(Dart_NewWeakReferenceSet(array1, ARRAY_SIZE(array1), |
| 2549 array1, ARRAY_SIZE(array1))); | 2602 array1, ARRAY_SIZE(array1))); |
| 2550 | 2603 |
| 2551 // weak1 is weakly reachable and should be cleared | 2604 // weak1 is weakly reachable and should be cleared |
| 2552 Dart_WeakPersistentHandle array2[] = { weak1 }; | 2605 Dart_WeakPersistentHandle array2[] = { weak1 }; |
| 2553 EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2), | 2606 EXPECT_VALID(Dart_NewWeakReferenceSet(array2, ARRAY_SIZE(array2), |
| 2554 array2, ARRAY_SIZE(array2))); | 2607 array2, ARRAY_SIZE(array2))); |
| 2555 | 2608 |
| 2556 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2609 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2557 } | 2610 } |
| 2558 | 2611 |
| 2559 { | 2612 { |
| 2560 Dart_EnterScope(); | 2613 Dart_EnterScope(); |
| 2561 // All weak references should now be cleared. | 2614 // All weak references should now be cleared. |
| 2562 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); | 2615 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); |
| 2563 EXPECT(Dart_IsNull(AsHandle(weak1))); | 2616 EXPECT(weak1 == NULL); |
| 2564 EXPECT(Dart_IsNull(AsHandle(weak2))); | 2617 EXPECT(weak2 == NULL); |
| 2565 EXPECT(Dart_IsNull(AsHandle(weak3))); | 2618 EXPECT(weak3 == NULL); |
| 2566 EXPECT(Dart_IsNull(AsHandle(weak4))); | 2619 EXPECT(weak4 == NULL); |
| 2567 Dart_ExitScope(); | 2620 Dart_ExitScope(); |
| 2568 } | 2621 } |
| 2569 } | 2622 } |
| 2570 | 2623 |
| 2571 | 2624 |
| 2625 static Dart_WeakPersistentHandle old_pwph = NULL; |
| 2626 static Dart_WeakPersistentHandle new_pwph = NULL; |
| 2627 |
| 2628 |
| 2629 static void PrologueWeakHandleCallback(void* isolate_callback_data, |
| 2630 Dart_WeakPersistentHandle handle, |
| 2631 void* peer) { |
| 2632 if (handle == old_pwph) { |
| 2633 old_pwph = NULL; |
| 2634 } else if (handle == new_pwph) { |
| 2635 new_pwph = NULL; |
| 2636 } |
| 2637 } |
| 2638 |
| 2639 |
| 2572 TEST_CASE(PrologueWeakPersistentHandles) { | 2640 TEST_CASE(PrologueWeakPersistentHandles) { |
| 2573 Dart_WeakPersistentHandle old_pwph = NULL; | |
| 2574 Dart_WeakPersistentHandle new_pwph = NULL; | |
| 2575 | |
| 2576 Dart_EnterScope(); | 2641 Dart_EnterScope(); |
| 2577 { | 2642 { |
| 2578 Isolate* isolate = Isolate::Current(); | 2643 Isolate* isolate = Isolate::Current(); |
| 2579 DARTSCOPE(isolate); | 2644 DARTSCOPE(isolate); |
| 2580 new_pwph = Dart_NewPrologueWeakPersistentHandle( | 2645 new_pwph = Dart_NewPrologueWeakPersistentHandle( |
| 2581 Api::NewHandle(isolate, | 2646 Api::NewHandle(isolate, |
| 2582 String::New("new space prologue weak", Heap::kNew)), | 2647 String::New("new space prologue weak", Heap::kNew)), |
| 2583 NULL, 0, NULL); | 2648 NULL, 0, PrologueWeakHandleCallback); |
| 2584 EXPECT_VALID(AsHandle(new_pwph)); | 2649 EXPECT_VALID(AsHandle(new_pwph)); |
| 2585 EXPECT(!Dart_IsNull(AsHandle(new_pwph))); | 2650 EXPECT(!Dart_IsNull(AsHandle(new_pwph))); |
| 2586 old_pwph = Dart_NewPrologueWeakPersistentHandle( | 2651 old_pwph = Dart_NewPrologueWeakPersistentHandle( |
| 2587 Api::NewHandle(isolate, | 2652 Api::NewHandle(isolate, |
| 2588 String::New("old space prologue weak", Heap::kOld)), | 2653 String::New("old space prologue weak", Heap::kOld)), |
| 2589 NULL, 0, NULL); | 2654 NULL, 0, PrologueWeakHandleCallback); |
| 2590 EXPECT_VALID(AsHandle(old_pwph)); | 2655 EXPECT_VALID(AsHandle(old_pwph)); |
| 2591 EXPECT(!Dart_IsNull(AsHandle(old_pwph))); | 2656 EXPECT(!Dart_IsNull(AsHandle(old_pwph))); |
| 2592 } | 2657 } |
| 2593 Dart_ExitScope(); | 2658 Dart_ExitScope(); |
| 2594 | 2659 |
| 2595 { | 2660 { |
| 2596 Dart_EnterScope(); | 2661 Dart_EnterScope(); |
| 2597 EXPECT_VALID(AsHandle(new_pwph)); | 2662 EXPECT_VALID(AsHandle(new_pwph)); |
| 2598 EXPECT(!Dart_IsNull(AsHandle(new_pwph))); | 2663 EXPECT(!Dart_IsNull(AsHandle(new_pwph))); |
| 2599 EXPECT(Dart_IsPrologueWeakPersistentHandle(new_pwph)); | 2664 EXPECT(Dart_IsPrologueWeakPersistentHandle(new_pwph)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2626 Dart_ExitScope(); | 2691 Dart_ExitScope(); |
| 2627 } | 2692 } |
| 2628 | 2693 |
| 2629 // Garbage collect new space invoking API callbacks. | 2694 // Garbage collect new space invoking API callbacks. |
| 2630 GCTestHelper::CollectNewSpace(Heap::kInvokeApiCallbacks); | 2695 GCTestHelper::CollectNewSpace(Heap::kInvokeApiCallbacks); |
| 2631 | 2696 |
| 2632 { | 2697 { |
| 2633 Dart_EnterScope(); | 2698 Dart_EnterScope(); |
| 2634 // The prologue weak handle with a new space referent should now be | 2699 // The prologue weak handle with a new space referent should now be |
| 2635 // cleared. The old space referent should be preserved. | 2700 // cleared. The old space referent should be preserved. |
| 2636 EXPECT(Dart_IsNull(AsHandle(new_pwph))); | 2701 EXPECT(new_pwph == NULL); |
| 2637 EXPECT(!Dart_IsNull(AsHandle(old_pwph))); | 2702 EXPECT(!Dart_IsNull(AsHandle(old_pwph))); |
| 2638 Dart_ExitScope(); | 2703 Dart_ExitScope(); |
| 2639 } | 2704 } |
| 2640 | 2705 |
| 2641 Isolate::Current()->heap()->CollectGarbage(Heap::kOld, | 2706 Isolate::Current()->heap()->CollectGarbage(Heap::kOld, |
| 2642 Heap::kInvokeApiCallbacks); | 2707 Heap::kInvokeApiCallbacks); |
| 2643 | 2708 |
| 2644 { | 2709 { |
| 2645 Dart_EnterScope(); | 2710 Dart_EnterScope(); |
| 2646 // The prologue weak handle with an old space referent should now be | 2711 // The prologue weak handle with an old space referent should now be |
| 2647 // cleared. The new space referent should remain cleared. | 2712 // cleared. The new space referent should remain cleared. |
| 2648 EXPECT(Dart_IsNull(AsHandle(new_pwph))); | 2713 EXPECT(new_pwph == NULL); |
| 2649 EXPECT(Dart_IsNull(AsHandle(old_pwph))); | 2714 EXPECT(old_pwph == NULL); |
| 2650 Dart_ExitScope(); | 2715 Dart_ExitScope(); |
| 2651 } | 2716 } |
| 2652 } | 2717 } |
| 2653 | 2718 |
| 2654 | 2719 |
| 2720 static void ImplicitReferencesCallback(void* isolate_callback_data, |
| 2721 Dart_WeakPersistentHandle handle, |
| 2722 void* peer) { |
| 2723 if (handle == weak1) { |
| 2724 weak1 = NULL; |
| 2725 } else if (handle == weak2) { |
| 2726 weak2 = NULL; |
| 2727 } else if (handle == weak3) { |
| 2728 weak3 = NULL; |
| 2729 } |
| 2730 } |
| 2731 |
| 2732 |
| 2655 TEST_CASE(ImplicitReferencesOldSpace) { | 2733 TEST_CASE(ImplicitReferencesOldSpace) { |
| 2656 Dart_PersistentHandle strong = NULL; | 2734 Dart_PersistentHandle strong = NULL; |
| 2657 Dart_WeakPersistentHandle strong_weak = NULL; | 2735 Dart_WeakPersistentHandle strong_weak = NULL; |
| 2658 | 2736 |
| 2659 Dart_WeakPersistentHandle weak1 = NULL; | |
| 2660 Dart_WeakPersistentHandle weak2 = NULL; | |
| 2661 Dart_WeakPersistentHandle weak3 = NULL; | |
| 2662 | |
| 2663 Dart_EnterScope(); | 2737 Dart_EnterScope(); |
| 2664 { | 2738 { |
| 2665 Isolate* isolate = Isolate::Current(); | 2739 Isolate* isolate = Isolate::Current(); |
| 2666 DARTSCOPE(isolate); | 2740 DARTSCOPE(isolate); |
| 2667 | 2741 |
| 2668 Dart_Handle local = Api::NewHandle( | 2742 Dart_Handle local = Api::NewHandle( |
| 2669 isolate, String::New("strongly reachable", Heap::kOld)); | 2743 isolate, String::New("strongly reachable", Heap::kOld)); |
| 2670 strong = Dart_NewPersistentHandle(local); | 2744 strong = Dart_NewPersistentHandle(local); |
| 2671 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL); | 2745 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); |
| 2672 | 2746 |
| 2673 EXPECT(!Dart_IsNull(AsHandle(strong))); | 2747 EXPECT(!Dart_IsNull(AsHandle(strong))); |
| 2674 EXPECT_VALID(AsHandle(strong)); | 2748 EXPECT_VALID(AsHandle(strong)); |
| 2675 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); | 2749 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); |
| 2676 EXPECT_VALID(AsHandle(strong_weak)); | 2750 EXPECT_VALID(AsHandle(strong_weak)); |
| 2677 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) | 2751 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) |
| 2678 | 2752 |
| 2679 weak1 = Dart_NewWeakPersistentHandle( | 2753 weak1 = Dart_NewWeakPersistentHandle( |
| 2680 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)), | 2754 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)), |
| 2681 NULL, 0, NULL); | 2755 NULL, 0, ImplicitReferencesCallback); |
| 2682 EXPECT(!Dart_IsNull(AsHandle(weak1))); | 2756 EXPECT(!Dart_IsNull(AsHandle(weak1))); |
| 2683 EXPECT_VALID(AsHandle(weak1)); | 2757 EXPECT_VALID(AsHandle(weak1)); |
| 2684 | 2758 |
| 2685 weak2 = Dart_NewWeakPersistentHandle( | 2759 weak2 = Dart_NewWeakPersistentHandle( |
| 2686 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)), | 2760 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)), |
| 2687 NULL, 0, NULL); | 2761 NULL, 0, ImplicitReferencesCallback); |
| 2688 EXPECT(!Dart_IsNull(AsHandle(weak2))); | 2762 EXPECT(!Dart_IsNull(AsHandle(weak2))); |
| 2689 EXPECT_VALID(AsHandle(weak2)); | 2763 EXPECT_VALID(AsHandle(weak2)); |
| 2690 | 2764 |
| 2691 weak3 = Dart_NewWeakPersistentHandle( | 2765 weak3 = Dart_NewWeakPersistentHandle( |
| 2692 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)), | 2766 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)), |
| 2693 NULL, 0, NULL); | 2767 NULL, 0, ImplicitReferencesCallback); |
| 2694 EXPECT(!Dart_IsNull(AsHandle(weak3))); | 2768 EXPECT(!Dart_IsNull(AsHandle(weak3))); |
| 2695 EXPECT_VALID(AsHandle(weak3)); | 2769 EXPECT_VALID(AsHandle(weak3)); |
| 2696 } | 2770 } |
| 2697 Dart_ExitScope(); | 2771 Dart_ExitScope(); |
| 2698 | 2772 |
| 2699 { | 2773 { |
| 2700 Dart_EnterScope(); | 2774 Dart_EnterScope(); |
| 2701 EXPECT_VALID(AsHandle(strong_weak)); | 2775 EXPECT_VALID(AsHandle(strong_weak)); |
| 2702 EXPECT_VALID(AsHandle(weak1)); | 2776 EXPECT_VALID(AsHandle(weak1)); |
| 2703 EXPECT_VALID(AsHandle(weak2)); | 2777 EXPECT_VALID(AsHandle(weak2)); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2745 values, ARRAY_SIZE(values))); | 2819 values, ARRAY_SIZE(values))); |
| 2746 | 2820 |
| 2747 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); | 2821 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); |
| 2748 } | 2822 } |
| 2749 | 2823 |
| 2750 { | 2824 { |
| 2751 Dart_EnterScope(); | 2825 Dart_EnterScope(); |
| 2752 // All weak references except weak3 should be preserved. | 2826 // All weak references except weak3 should be preserved. |
| 2753 EXPECT(!Dart_IsNull(AsHandle(weak1))); | 2827 EXPECT(!Dart_IsNull(AsHandle(weak1))); |
| 2754 EXPECT(!Dart_IsNull(AsHandle(weak2))); | 2828 EXPECT(!Dart_IsNull(AsHandle(weak2))); |
| 2755 EXPECT(Dart_IsNull(AsHandle(weak3))); | 2829 EXPECT(weak3 == NULL); |
| 2756 Dart_ExitScope(); | 2830 Dart_ExitScope(); |
| 2757 } | 2831 } |
| 2758 } | 2832 } |
| 2759 | 2833 |
| 2760 | 2834 |
| 2761 TEST_CASE(ImplicitReferencesNewSpace) { | 2835 TEST_CASE(ImplicitReferencesNewSpace) { |
| 2762 Dart_PersistentHandle strong = NULL; | 2836 Dart_PersistentHandle strong = NULL; |
| 2763 Dart_WeakPersistentHandle strong_weak = NULL; | 2837 Dart_WeakPersistentHandle strong_weak = NULL; |
| 2764 | 2838 |
| 2765 Dart_WeakPersistentHandle weak1 = NULL; | |
| 2766 Dart_WeakPersistentHandle weak2 = NULL; | |
| 2767 Dart_WeakPersistentHandle weak3 = NULL; | |
| 2768 | 2839 |
| 2769 Dart_EnterScope(); | 2840 Dart_EnterScope(); |
| 2770 { | 2841 { |
| 2771 Isolate* isolate = Isolate::Current(); | 2842 Isolate* isolate = Isolate::Current(); |
| 2772 DARTSCOPE(isolate); | 2843 DARTSCOPE(isolate); |
| 2773 | 2844 |
| 2774 Dart_Handle local = Api::NewHandle( | 2845 Dart_Handle local = Api::NewHandle( |
| 2775 isolate, String::New("strongly reachable", Heap::kOld)); | 2846 isolate, String::New("strongly reachable", Heap::kOld)); |
| 2776 strong = Dart_NewPersistentHandle(local); | 2847 strong = Dart_NewPersistentHandle(local); |
| 2777 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NULL); | 2848 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); |
| 2778 | 2849 |
| 2779 EXPECT(!Dart_IsNull(AsHandle(strong))); | 2850 EXPECT(!Dart_IsNull(AsHandle(strong))); |
| 2780 EXPECT_VALID(AsHandle(strong)); | 2851 EXPECT_VALID(AsHandle(strong)); |
| 2781 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); | 2852 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); |
| 2782 EXPECT_VALID(AsHandle(strong_weak)); | 2853 EXPECT_VALID(AsHandle(strong_weak)); |
| 2783 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) | 2854 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) |
| 2784 | 2855 |
| 2785 weak1 = Dart_NewWeakPersistentHandle( | 2856 weak1 = Dart_NewWeakPersistentHandle( |
| 2786 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kNew)), | 2857 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kNew)), |
| 2787 NULL, 0, NULL); | 2858 NULL, 0, ImplicitReferencesCallback); |
| 2788 EXPECT(!Dart_IsNull(AsHandle(weak1))); | 2859 EXPECT(!Dart_IsNull(AsHandle(weak1))); |
| 2789 EXPECT_VALID(AsHandle(weak1)); | 2860 EXPECT_VALID(AsHandle(weak1)); |
| 2790 | 2861 |
| 2791 weak2 = Dart_NewWeakPersistentHandle( | 2862 weak2 = Dart_NewWeakPersistentHandle( |
| 2792 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kNew)), | 2863 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kNew)), |
| 2793 NULL, 0, NULL); | 2864 NULL, 0, ImplicitReferencesCallback); |
| 2794 EXPECT(!Dart_IsNull(AsHandle(weak2))); | 2865 EXPECT(!Dart_IsNull(AsHandle(weak2))); |
| 2795 EXPECT_VALID(AsHandle(weak2)); | 2866 EXPECT_VALID(AsHandle(weak2)); |
| 2796 | 2867 |
| 2797 weak3 = Dart_NewWeakPersistentHandle( | 2868 weak3 = Dart_NewWeakPersistentHandle( |
| 2798 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kNew)), | 2869 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kNew)), |
| 2799 NULL, 0, NULL); | 2870 NULL, 0, ImplicitReferencesCallback); |
| 2800 EXPECT(!Dart_IsNull(AsHandle(weak3))); | 2871 EXPECT(!Dart_IsNull(AsHandle(weak3))); |
| 2801 EXPECT_VALID(AsHandle(weak3)); | 2872 EXPECT_VALID(AsHandle(weak3)); |
| 2802 } | 2873 } |
| 2803 Dart_ExitScope(); | 2874 Dart_ExitScope(); |
| 2804 | 2875 |
| 2805 { | 2876 { |
| 2806 Dart_EnterScope(); | 2877 Dart_EnterScope(); |
| 2807 EXPECT_VALID(AsHandle(strong_weak)); | 2878 EXPECT_VALID(AsHandle(strong_weak)); |
| 2808 EXPECT_VALID(AsHandle(weak1)); | 2879 EXPECT_VALID(AsHandle(weak1)); |
| 2809 EXPECT_VALID(AsHandle(weak2)); | 2880 EXPECT_VALID(AsHandle(weak2)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2839 EXPECT(!Dart_IsNull(AsHandle(weak2))); | 2910 EXPECT(!Dart_IsNull(AsHandle(weak2))); |
| 2840 EXPECT(!Dart_IsNull(AsHandle(weak3))); | 2911 EXPECT(!Dart_IsNull(AsHandle(weak3))); |
| 2841 Dart_ExitScope(); | 2912 Dart_ExitScope(); |
| 2842 } | 2913 } |
| 2843 | 2914 |
| 2844 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); | 2915 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); |
| 2845 | 2916 |
| 2846 { | 2917 { |
| 2847 Dart_EnterScope(); | 2918 Dart_EnterScope(); |
| 2848 // No weak references should be preserved. | 2919 // No weak references should be preserved. |
| 2849 EXPECT(Dart_IsNull(AsHandle(weak1))); | 2920 EXPECT(weak1 == NULL); |
| 2850 EXPECT(Dart_IsNull(AsHandle(weak2))); | 2921 EXPECT(weak2 == NULL); |
| 2851 EXPECT(Dart_IsNull(AsHandle(weak3))); | 2922 EXPECT(weak3 == NULL); |
| 2852 Dart_ExitScope(); | 2923 Dart_ExitScope(); |
| 2853 } | 2924 } |
| 2854 } | 2925 } |
| 2855 | 2926 |
| 2856 | 2927 |
| 2857 static int global_prologue_callback_status; | 2928 static int global_prologue_callback_status; |
| 2858 | 2929 |
| 2859 | 2930 |
| 2860 static void PrologueCallbackTimes2() { | 2931 static void PrologueCallbackTimes2() { |
| 2861 global_prologue_callback_status *= 2; | 2932 global_prologue_callback_status *= 2; |
| (...skipping 5149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8011 NewString("main"), | 8082 NewString("main"), |
| 8012 1, | 8083 1, |
| 8013 dart_args); | 8084 dart_args); |
| 8014 int64_t value = 0; | 8085 int64_t value = 0; |
| 8015 result = Dart_IntegerToInt64(result, &value); | 8086 result = Dart_IntegerToInt64(result, &value); |
| 8016 EXPECT_VALID(result); | 8087 EXPECT_VALID(result); |
| 8017 EXPECT_EQ(6, value); | 8088 EXPECT_EQ(6, value); |
| 8018 } | 8089 } |
| 8019 | 8090 |
| 8020 } // namespace dart | 8091 } // namespace dart |
| OLD | NEW |