| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 &dispose_count)); | 443 &dispose_count)); |
| 444 CHECK(success); | 444 CHECK(success); |
| 445 Local<Script> script = Script::Compile(source); | 445 Local<Script> script = Script::Compile(source); |
| 446 Local<Value> value = script->Run(); | 446 Local<Value> value = script->Run(); |
| 447 CHECK(value->IsNumber()); | 447 CHECK(value->IsNumber()); |
| 448 CHECK_EQ(7, value->Int32Value()); | 448 CHECK_EQ(7, value->Int32Value()); |
| 449 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 449 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 450 CHECK_EQ(0, dispose_count); | 450 CHECK_EQ(0, dispose_count); |
| 451 } | 451 } |
| 452 i::Isolate::Current()->compilation_cache()->Clear(); | 452 i::Isolate::Current()->compilation_cache()->Clear(); |
| 453 // TODO(1608): This should use kAbortIncrementalMarking. | 453 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 454 HEAP->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); | |
| 455 CHECK_EQ(1, dispose_count); | 454 CHECK_EQ(1, dispose_count); |
| 456 } | 455 } |
| 457 | 456 |
| 458 | 457 |
| 459 THREADED_TEST(ScriptMakingExternalAsciiString) { | 458 THREADED_TEST(ScriptMakingExternalAsciiString) { |
| 460 int dispose_count = 0; | 459 int dispose_count = 0; |
| 461 const char* c_source = "1 + 2 * 3"; | 460 const char* c_source = "1 + 2 * 3"; |
| 462 { | 461 { |
| 463 v8::HandleScope scope; | 462 v8::HandleScope scope; |
| 464 LocalContext env; | 463 LocalContext env; |
| 465 Local<String> source = v8_str(c_source); | 464 Local<String> source = v8_str(c_source); |
| 466 // Trigger GCs so that the newly allocated string moves to old gen. | 465 // Trigger GCs so that the newly allocated string moves to old gen. |
| 467 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now | 466 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 468 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now | 467 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now |
| 469 bool success = source->MakeExternal( | 468 bool success = source->MakeExternal( |
| 470 new TestAsciiResource(i::StrDup(c_source), &dispose_count)); | 469 new TestAsciiResource(i::StrDup(c_source), &dispose_count)); |
| 471 CHECK(success); | 470 CHECK(success); |
| 472 Local<Script> script = Script::Compile(source); | 471 Local<Script> script = Script::Compile(source); |
| 473 Local<Value> value = script->Run(); | 472 Local<Value> value = script->Run(); |
| 474 CHECK(value->IsNumber()); | 473 CHECK(value->IsNumber()); |
| 475 CHECK_EQ(7, value->Int32Value()); | 474 CHECK_EQ(7, value->Int32Value()); |
| 476 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 475 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 477 CHECK_EQ(0, dispose_count); | 476 CHECK_EQ(0, dispose_count); |
| 478 } | 477 } |
| 479 i::Isolate::Current()->compilation_cache()->Clear(); | 478 i::Isolate::Current()->compilation_cache()->Clear(); |
| 480 // TODO(1608): This should use kAbortIncrementalMarking. | 479 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 481 HEAP->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); | |
| 482 CHECK_EQ(1, dispose_count); | 480 CHECK_EQ(1, dispose_count); |
| 483 } | 481 } |
| 484 | 482 |
| 485 | 483 |
| 486 TEST(MakingExternalStringConditions) { | 484 TEST(MakingExternalStringConditions) { |
| 487 v8::HandleScope scope; | 485 v8::HandleScope scope; |
| 488 LocalContext env; | 486 LocalContext env; |
| 489 | 487 |
| 490 // Free some space in the new space so that we can check freshness. | 488 // Free some space in the new space so that we can check freshness. |
| 491 HEAP->CollectGarbage(i::NEW_SPACE); | 489 HEAP->CollectGarbage(i::NEW_SPACE); |
| (...skipping 1754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2246 { | 2244 { |
| 2247 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; | 2245 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; |
| 2248 Persistent<Value> g1_children[] = { g1c1 }; | 2246 Persistent<Value> g1_children[] = { g1c1 }; |
| 2249 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; | 2247 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; |
| 2250 Persistent<Value> g2_children[] = { g2c1 }; | 2248 Persistent<Value> g2_children[] = { g2c1 }; |
| 2251 V8::AddObjectGroup(g1_objects, 2); | 2249 V8::AddObjectGroup(g1_objects, 2); |
| 2252 V8::AddImplicitReferences(g1s1, g1_children, 1); | 2250 V8::AddImplicitReferences(g1s1, g1_children, 1); |
| 2253 V8::AddObjectGroup(g2_objects, 2); | 2251 V8::AddObjectGroup(g2_objects, 2); |
| 2254 V8::AddImplicitReferences(g2s2, g2_children, 1); | 2252 V8::AddImplicitReferences(g2s2, g2_children, 1); |
| 2255 } | 2253 } |
| 2256 // Do a single full GC. Use kMakeHeapIterableMask to ensure that | 2254 // Do a single full GC, ensure incremental marking is stopped. |
| 2257 // incremental garbage collection is stopped. | 2255 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 2258 HEAP->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); | |
| 2259 | 2256 |
| 2260 // All object should be alive. | 2257 // All object should be alive. |
| 2261 CHECK_EQ(0, counter.NumberOfWeakCalls()); | 2258 CHECK_EQ(0, counter.NumberOfWeakCalls()); |
| 2262 | 2259 |
| 2263 // Weaken the root. | 2260 // Weaken the root. |
| 2264 root.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); | 2261 root.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); |
| 2265 // But make children strong roots---all the objects (except for children) | 2262 // But make children strong roots---all the objects (except for children) |
| 2266 // should be collectable now. | 2263 // should be collectable now. |
| 2267 g1c1.ClearWeak(); | 2264 g1c1.ClearWeak(); |
| 2268 g2c1.ClearWeak(); | 2265 g2c1.ClearWeak(); |
| 2269 | 2266 |
| 2270 // Groups are deleted, rebuild groups. | 2267 // Groups are deleted, rebuild groups. |
| 2271 { | 2268 { |
| 2272 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; | 2269 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; |
| 2273 Persistent<Value> g1_children[] = { g1c1 }; | 2270 Persistent<Value> g1_children[] = { g1c1 }; |
| 2274 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; | 2271 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; |
| 2275 Persistent<Value> g2_children[] = { g2c1 }; | 2272 Persistent<Value> g2_children[] = { g2c1 }; |
| 2276 V8::AddObjectGroup(g1_objects, 2); | 2273 V8::AddObjectGroup(g1_objects, 2); |
| 2277 V8::AddImplicitReferences(g1s1, g1_children, 1); | 2274 V8::AddImplicitReferences(g1s1, g1_children, 1); |
| 2278 V8::AddObjectGroup(g2_objects, 2); | 2275 V8::AddObjectGroup(g2_objects, 2); |
| 2279 V8::AddImplicitReferences(g2s2, g2_children, 1); | 2276 V8::AddImplicitReferences(g2s2, g2_children, 1); |
| 2280 } | 2277 } |
| 2281 | 2278 |
| 2282 HEAP->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); | 2279 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 2283 | 2280 |
| 2284 // All objects should be gone. 5 global handles in total. | 2281 // All objects should be gone. 5 global handles in total. |
| 2285 CHECK_EQ(5, counter.NumberOfWeakCalls()); | 2282 CHECK_EQ(5, counter.NumberOfWeakCalls()); |
| 2286 | 2283 |
| 2287 // And now make children weak again and collect them. | 2284 // And now make children weak again and collect them. |
| 2288 g1c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); | 2285 g1c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); |
| 2289 g2c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); | 2286 g2c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); |
| 2290 | 2287 |
| 2291 HEAP->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); | 2288 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 2292 CHECK_EQ(7, counter.NumberOfWeakCalls()); | 2289 CHECK_EQ(7, counter.NumberOfWeakCalls()); |
| 2293 } | 2290 } |
| 2294 | 2291 |
| 2295 | 2292 |
| 2296 THREADED_TEST(ApiObjectGroupsCycle) { | 2293 THREADED_TEST(ApiObjectGroupsCycle) { |
| 2297 HandleScope scope; | 2294 HandleScope scope; |
| 2298 LocalContext env; | 2295 LocalContext env; |
| 2299 | 2296 |
| 2300 WeakCallCounter counter(1234); | 2297 WeakCallCounter counter(1234); |
| 2301 | 2298 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2337 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; | 2334 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; |
| 2338 Persistent<Value> g3_children[] = { g1s1 }; | 2335 Persistent<Value> g3_children[] = { g1s1 }; |
| 2339 V8::AddObjectGroup(g1_objects, 2); | 2336 V8::AddObjectGroup(g1_objects, 2); |
| 2340 V8::AddImplicitReferences(g1s1, g1_children, 1); | 2337 V8::AddImplicitReferences(g1s1, g1_children, 1); |
| 2341 V8::AddObjectGroup(g2_objects, 2); | 2338 V8::AddObjectGroup(g2_objects, 2); |
| 2342 V8::AddImplicitReferences(g2s1, g2_children, 1); | 2339 V8::AddImplicitReferences(g2s1, g2_children, 1); |
| 2343 V8::AddObjectGroup(g3_objects, 2); | 2340 V8::AddObjectGroup(g3_objects, 2); |
| 2344 V8::AddImplicitReferences(g3s1, g3_children, 1); | 2341 V8::AddImplicitReferences(g3s1, g3_children, 1); |
| 2345 } | 2342 } |
| 2346 // Do a single full GC | 2343 // Do a single full GC |
| 2347 HEAP->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); | 2344 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 2348 | 2345 |
| 2349 // All object should be alive. | 2346 // All object should be alive. |
| 2350 CHECK_EQ(0, counter.NumberOfWeakCalls()); | 2347 CHECK_EQ(0, counter.NumberOfWeakCalls()); |
| 2351 | 2348 |
| 2352 // Weaken the root. | 2349 // Weaken the root. |
| 2353 root.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); | 2350 root.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); |
| 2354 | 2351 |
| 2355 // Groups are deleted, rebuild groups. | 2352 // Groups are deleted, rebuild groups. |
| 2356 { | 2353 { |
| 2357 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; | 2354 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; |
| 2358 Persistent<Value> g1_children[] = { g2s1 }; | 2355 Persistent<Value> g1_children[] = { g2s1 }; |
| 2359 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; | 2356 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; |
| 2360 Persistent<Value> g2_children[] = { g3s1 }; | 2357 Persistent<Value> g2_children[] = { g3s1 }; |
| 2361 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; | 2358 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; |
| 2362 Persistent<Value> g3_children[] = { g1s1 }; | 2359 Persistent<Value> g3_children[] = { g1s1 }; |
| 2363 V8::AddObjectGroup(g1_objects, 2); | 2360 V8::AddObjectGroup(g1_objects, 2); |
| 2364 V8::AddImplicitReferences(g1s1, g1_children, 1); | 2361 V8::AddImplicitReferences(g1s1, g1_children, 1); |
| 2365 V8::AddObjectGroup(g2_objects, 2); | 2362 V8::AddObjectGroup(g2_objects, 2); |
| 2366 V8::AddImplicitReferences(g2s1, g2_children, 1); | 2363 V8::AddImplicitReferences(g2s1, g2_children, 1); |
| 2367 V8::AddObjectGroup(g3_objects, 2); | 2364 V8::AddObjectGroup(g3_objects, 2); |
| 2368 V8::AddImplicitReferences(g3s1, g3_children, 1); | 2365 V8::AddImplicitReferences(g3s1, g3_children, 1); |
| 2369 } | 2366 } |
| 2370 | 2367 |
| 2371 HEAP->CollectAllGarbage(i::Heap::kMakeHeapIterableMask); | 2368 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 2372 | 2369 |
| 2373 // All objects should be gone. 7 global handles in total. | 2370 // All objects should be gone. 7 global handles in total. |
| 2374 CHECK_EQ(7, counter.NumberOfWeakCalls()); | 2371 CHECK_EQ(7, counter.NumberOfWeakCalls()); |
| 2375 } | 2372 } |
| 2376 | 2373 |
| 2377 | 2374 |
| 2378 THREADED_TEST(ScriptException) { | 2375 THREADED_TEST(ScriptException) { |
| 2379 v8::HandleScope scope; | 2376 v8::HandleScope scope; |
| 2380 LocalContext env; | 2377 LocalContext env; |
| 2381 Local<Script> script = Script::Compile(v8_str("throw 'panama!';")); | 2378 Local<Script> script = Script::Compile(v8_str("throw 'panama!';")); |
| (...skipping 13782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16164 | 16161 |
| 16165 TEST(SecondaryStubCache) { | 16162 TEST(SecondaryStubCache) { |
| 16166 StubCacheHelper(true); | 16163 StubCacheHelper(true); |
| 16167 } | 16164 } |
| 16168 | 16165 |
| 16169 | 16166 |
| 16170 TEST(PrimaryStubCache) { | 16167 TEST(PrimaryStubCache) { |
| 16171 StubCacheHelper(false); | 16168 StubCacheHelper(false); |
| 16172 } | 16169 } |
| 16173 | 16170 |
| OLD | NEW |