Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Side by Side Diff: runtime/vm/dart_api_impl_test.cc

Issue 205153002: Auto delete persistent weak handles during finalization after invoking the callback associated with… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698