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

Side by Side Diff: test/cctest/test-api.cc

Issue 12033011: Add Isolate parameter to Persistent class. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Added new kind of callback Created 7 years, 11 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 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 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 174
175 CHECK(!env->InContext()); 175 CHECK(!env->InContext());
176 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 176 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent());
177 env->Enter(); 177 env->Enter();
178 CHECK(env->InContext()); 178 CHECK(env->InContext());
179 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 179 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent());
180 env->Exit(); 180 env->Exit();
181 CHECK(!env->InContext()); 181 CHECK(!env->InContext());
182 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent()); 182 CHECK(env->GetIsolate() == v8::Isolate::GetCurrent());
183 183
184 env.Dispose(); 184 env.Dispose(env->GetIsolate());
185 } 185 }
186 186
187 187
188 THREADED_TEST(ReceiverSignature) { 188 THREADED_TEST(ReceiverSignature) {
189 v8::HandleScope scope; 189 v8::HandleScope scope;
190 LocalContext env; 190 LocalContext env;
191 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(); 191 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New();
192 v8::Handle<v8::Signature> sig = v8::Signature::New(fun); 192 v8::Handle<v8::Signature> sig = v8::Signature::New(fun);
193 fun->PrototypeTemplate()->Set( 193 fun->PrototypeTemplate()->Set(
194 v8_str("m"), 194 v8_str("m"),
(...skipping 2122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2317 2317
2318 2318
2319 THREADED_TEST(GlobalHandle) { 2319 THREADED_TEST(GlobalHandle) {
2320 v8::Persistent<String> global; 2320 v8::Persistent<String> global;
2321 { 2321 {
2322 v8::HandleScope scope; 2322 v8::HandleScope scope;
2323 Local<String> str = v8_str("str"); 2323 Local<String> str = v8_str("str");
2324 global = v8::Persistent<String>::New(str); 2324 global = v8::Persistent<String>::New(str);
2325 } 2325 }
2326 CHECK_EQ(global->Length(), 3); 2326 CHECK_EQ(global->Length(), 3);
2327 global.Dispose(); 2327 global.Dispose(v8::Isolate::GetCurrent());
2328 2328
2329 { 2329 {
2330 v8::HandleScope scope; 2330 v8::HandleScope scope;
2331 Local<String> str = v8_str("str"); 2331 Local<String> str = v8_str("str");
2332 global = v8::Persistent<String>::New(str); 2332 global = v8::Persistent<String>::New(str);
2333 } 2333 }
2334 CHECK_EQ(global->Length(), 3); 2334 CHECK_EQ(global->Length(), 3);
2335 global.Dispose(v8::Isolate::GetCurrent()); 2335 global.Dispose(v8::Isolate::GetCurrent());
2336 } 2336 }
2337 2337
(...skipping 13 matching lines...) Expand all
2351 explicit WeakCallCounter(int id) : id_(id), number_of_weak_calls_(0) { } 2351 explicit WeakCallCounter(int id) : id_(id), number_of_weak_calls_(0) { }
2352 int id() { return id_; } 2352 int id() { return id_; }
2353 void increment() { number_of_weak_calls_++; } 2353 void increment() { number_of_weak_calls_++; }
2354 int NumberOfWeakCalls() { return number_of_weak_calls_; } 2354 int NumberOfWeakCalls() { return number_of_weak_calls_; }
2355 private: 2355 private:
2356 int id_; 2356 int id_;
2357 int number_of_weak_calls_; 2357 int number_of_weak_calls_;
2358 }; 2358 };
2359 2359
2360 2360
2361 static void WeakPointerCallback(Persistent<Value> handle, void* id) { 2361 static void WeakPointerCallback(v8::Isolate* isolate,
2362 Persistent<Value> handle,
2363 void* id) {
2362 WeakCallCounter* counter = reinterpret_cast<WeakCallCounter*>(id); 2364 WeakCallCounter* counter = reinterpret_cast<WeakCallCounter*>(id);
2363 CHECK_EQ(1234, counter->id()); 2365 CHECK_EQ(1234, counter->id());
2364 counter->increment(); 2366 counter->increment();
2365 handle.Dispose(); 2367 handle.Dispose(isolate);
2366 } 2368 }
2367 2369
2368 2370
2369 THREADED_TEST(ApiObjectGroups) { 2371 THREADED_TEST(ApiObjectGroups) {
2370 HandleScope scope; 2372 HandleScope scope;
2371 LocalContext env; 2373 LocalContext env;
2374 v8::Isolate* iso = env->GetIsolate();
2372 2375
2373 Persistent<Object> g1s1; 2376 Persistent<Object> g1s1;
2374 Persistent<Object> g1s2; 2377 Persistent<Object> g1s2;
2375 Persistent<Object> g1c1; 2378 Persistent<Object> g1c1;
2376 Persistent<Object> g2s1; 2379 Persistent<Object> g2s1;
2377 Persistent<Object> g2s2; 2380 Persistent<Object> g2s2;
2378 Persistent<Object> g2c1; 2381 Persistent<Object> g2c1;
2379 2382
2380 WeakCallCounter counter(1234); 2383 WeakCallCounter counter(1234);
2381 2384
2382 { 2385 {
2383 HandleScope scope; 2386 HandleScope scope;
2384 g1s1 = Persistent<Object>::New(Object::New()); 2387 g1s1 = Persistent<Object>::New(Object::New());
2385 g1s2 = Persistent<Object>::New(Object::New()); 2388 g1s2 = Persistent<Object>::New(Object::New());
2386 g1c1 = Persistent<Object>::New(Object::New()); 2389 g1c1 = Persistent<Object>::New(Object::New());
2387 g1s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2390 g1s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2388 g1s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2391 g1s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2389 g1c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2392 g1c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2390 2393
2391 g2s1 = Persistent<Object>::New(Object::New()); 2394 g2s1 = Persistent<Object>::New(Object::New());
2392 g2s2 = Persistent<Object>::New(Object::New()); 2395 g2s2 = Persistent<Object>::New(Object::New());
2393 g2c1 = Persistent<Object>::New(Object::New()); 2396 g2c1 = Persistent<Object>::New(Object::New());
2394 g2s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2397 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2395 g2s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2398 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2396 g2c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2399 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2397 } 2400 }
2398 2401
2399 Persistent<Object> root = Persistent<Object>::New(g1s1); // make a root. 2402 Persistent<Object> root = Persistent<Object>::New(g1s1); // make a root.
2400 2403
2401 // Connect group 1 and 2, make a cycle. 2404 // Connect group 1 and 2, make a cycle.
2402 CHECK(g1s2->Set(0, g2s2)); 2405 CHECK(g1s2->Set(0, g2s2));
2403 CHECK(g2s1->Set(0, g1s1)); 2406 CHECK(g2s1->Set(0, g1s1));
2404 2407
2405 { 2408 {
2406 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2409 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2407 Persistent<Value> g1_children[] = { g1c1 }; 2410 Persistent<Value> g1_children[] = { g1c1 };
2408 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2411 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2409 Persistent<Value> g2_children[] = { g2c1 }; 2412 Persistent<Value> g2_children[] = { g2c1 };
2410 V8::AddObjectGroup(g1_objects, 2); 2413 V8::AddObjectGroup(g1_objects, 2);
2411 V8::AddImplicitReferences(g1s1, g1_children, 1); 2414 V8::AddImplicitReferences(g1s1, g1_children, 1);
2412 V8::AddObjectGroup(g2_objects, 2); 2415 V8::AddObjectGroup(g2_objects, 2);
2413 V8::AddImplicitReferences(g2s2, g2_children, 1); 2416 V8::AddImplicitReferences(g2s2, g2_children, 1);
2414 } 2417 }
2415 // Do a single full GC, ensure incremental marking is stopped. 2418 // Do a single full GC, ensure incremental marking is stopped.
2416 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); 2419 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
2417 2420
2418 // All object should be alive. 2421 // All object should be alive.
2419 CHECK_EQ(0, counter.NumberOfWeakCalls()); 2422 CHECK_EQ(0, counter.NumberOfWeakCalls());
2420 2423
2421 // Weaken the root. 2424 // Weaken the root.
2422 root.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2425 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2423 // But make children strong roots---all the objects (except for children) 2426 // But make children strong roots---all the objects (except for children)
2424 // should be collectable now. 2427 // should be collectable now.
2425 g1c1.ClearWeak(); 2428 g1c1.ClearWeak(iso);
2426 g2c1.ClearWeak(); 2429 g2c1.ClearWeak(iso);
2427 2430
2428 // Groups are deleted, rebuild groups. 2431 // Groups are deleted, rebuild groups.
2429 { 2432 {
2430 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2433 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2431 Persistent<Value> g1_children[] = { g1c1 }; 2434 Persistent<Value> g1_children[] = { g1c1 };
2432 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2435 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2433 Persistent<Value> g2_children[] = { g2c1 }; 2436 Persistent<Value> g2_children[] = { g2c1 };
2434 V8::AddObjectGroup(g1_objects, 2); 2437 V8::AddObjectGroup(g1_objects, 2);
2435 V8::AddImplicitReferences(g1s1, g1_children, 1); 2438 V8::AddImplicitReferences(g1s1, g1_children, 1);
2436 V8::AddObjectGroup(g2_objects, 2); 2439 V8::AddObjectGroup(g2_objects, 2);
2437 V8::AddImplicitReferences(g2s2, g2_children, 1); 2440 V8::AddImplicitReferences(g2s2, g2_children, 1);
2438 } 2441 }
2439 2442
2440 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); 2443 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
2441 2444
2442 // All objects should be gone. 5 global handles in total. 2445 // All objects should be gone. 5 global handles in total.
2443 CHECK_EQ(5, counter.NumberOfWeakCalls()); 2446 CHECK_EQ(5, counter.NumberOfWeakCalls());
2444 2447
2445 // And now make children weak again and collect them. 2448 // And now make children weak again and collect them.
2446 g1c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2449 g1c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2447 g2c1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2450 g2c1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2448 2451
2449 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); 2452 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
2450 CHECK_EQ(7, counter.NumberOfWeakCalls()); 2453 CHECK_EQ(7, counter.NumberOfWeakCalls());
2451 } 2454 }
2452 2455
2453 2456
2454 THREADED_TEST(ApiObjectGroupsCycle) { 2457 THREADED_TEST(ApiObjectGroupsCycle) {
2455 HandleScope scope; 2458 HandleScope scope;
2456 LocalContext env; 2459 LocalContext env;
2460 v8::Isolate* iso = env->GetIsolate();
2457 2461
2458 WeakCallCounter counter(1234); 2462 WeakCallCounter counter(1234);
2459 2463
2460 Persistent<Object> g1s1; 2464 Persistent<Object> g1s1;
2461 Persistent<Object> g1s2; 2465 Persistent<Object> g1s2;
2462 Persistent<Object> g2s1; 2466 Persistent<Object> g2s1;
2463 Persistent<Object> g2s2; 2467 Persistent<Object> g2s2;
2464 Persistent<Object> g3s1; 2468 Persistent<Object> g3s1;
2465 Persistent<Object> g3s2; 2469 Persistent<Object> g3s2;
2466 Persistent<Object> g4s1; 2470 Persistent<Object> g4s1;
2467 Persistent<Object> g4s2; 2471 Persistent<Object> g4s2;
2468 2472
2469 v8::Isolate* isolate = v8::Isolate::GetCurrent();
2470 { 2473 {
2471 HandleScope scope; 2474 HandleScope scope;
2472 g1s1 = Persistent<Object>::New(Object::New()); 2475 g1s1 = Persistent<Object>::New(Object::New());
2473 g1s2 = Persistent<Object>::New(Object::New()); 2476 g1s2 = Persistent<Object>::New(Object::New());
2474 g1s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2477 g1s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2475 g1s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2478 g1s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2476 CHECK(g1s1.IsWeak()); 2479 CHECK(g1s1.IsWeak(iso));
2477 CHECK(g1s2.IsWeak()); 2480 CHECK(g1s2.IsWeak(iso));
2478 2481
2479 g2s1 = Persistent<Object>::New(Object::New()); 2482 g2s1 = Persistent<Object>::New(Object::New());
2480 g2s2 = Persistent<Object>::New(Object::New()); 2483 g2s2 = Persistent<Object>::New(Object::New());
2481 g2s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2484 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2482 g2s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2485 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2483 CHECK(g2s1.IsWeak()); 2486 CHECK(g2s1.IsWeak(iso));
2484 CHECK(g2s2.IsWeak()); 2487 CHECK(g2s2.IsWeak(iso));
2485 2488
2486 g3s1 = Persistent<Object>::New(Object::New()); 2489 g3s1 = Persistent<Object>::New(Object::New());
2487 g3s2 = Persistent<Object>::New(Object::New()); 2490 g3s2 = Persistent<Object>::New(Object::New());
2488 g3s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2491 g3s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2489 g3s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2492 g3s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2490 CHECK(g3s1.IsWeak()); 2493 CHECK(g3s1.IsWeak(iso));
2491 CHECK(g3s2.IsWeak()); 2494 CHECK(g3s2.IsWeak(iso));
2492 2495
2493 g4s1 = Persistent<Object>::New(Object::New()); 2496 g4s1 = Persistent<Object>::New(Object::New());
2494 g4s2 = Persistent<Object>::New(Object::New()); 2497 g4s2 = Persistent<Object>::New(Object::New());
2495 g4s1.MakeWeak(isolate, 2498 g4s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2496 reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2499 g4s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2497 g4s2.MakeWeak(isolate, 2500 CHECK(g4s1.IsWeak(iso));
2498 reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2501 CHECK(g4s2.IsWeak(iso));
2499 CHECK(g4s1.IsWeak(isolate));
2500 CHECK(g4s2.IsWeak(isolate));
2501 } 2502 }
2502 2503
2503 Persistent<Object> root = Persistent<Object>::New(g1s1); // make a root. 2504 Persistent<Object> root = Persistent<Object>::New(g1s1); // make a root.
2504 2505
2505 // Connect groups. We're building the following cycle: 2506 // Connect groups. We're building the following cycle:
2506 // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other 2507 // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other
2507 // groups. 2508 // groups.
2508 { 2509 {
2509 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2510 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2510 Persistent<Value> g1_children[] = { g2s1 }; 2511 Persistent<Value> g1_children[] = { g2s1 };
2511 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2512 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2512 Persistent<Value> g2_children[] = { g3s1 }; 2513 Persistent<Value> g2_children[] = { g3s1 };
2513 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; 2514 Persistent<Value> g3_objects[] = { g3s1, g3s2 };
2514 Persistent<Value> g3_children[] = { g4s1 }; 2515 Persistent<Value> g3_children[] = { g4s1 };
2515 Persistent<Value> g4_objects[] = { g4s1, g4s2 }; 2516 Persistent<Value> g4_objects[] = { g4s1, g4s2 };
2516 Persistent<Value> g4_children[] = { g1s1 }; 2517 Persistent<Value> g4_children[] = { g1s1 };
2517 V8::AddObjectGroup(g1_objects, 2); 2518 V8::AddObjectGroup(g1_objects, 2);
2518 V8::AddImplicitReferences(g1s1, g1_children, 1); 2519 V8::AddImplicitReferences(g1s1, g1_children, 1);
2519 V8::AddObjectGroup(g2_objects, 2); 2520 V8::AddObjectGroup(g2_objects, 2);
2520 V8::AddImplicitReferences(g2s1, g2_children, 1); 2521 V8::AddImplicitReferences(g2s1, g2_children, 1);
2521 V8::AddObjectGroup(g3_objects, 2); 2522 V8::AddObjectGroup(g3_objects, 2);
2522 V8::AddImplicitReferences(g3s1, g3_children, 1); 2523 V8::AddImplicitReferences(g3s1, g3_children, 1);
2523 V8::AddObjectGroup(isolate, g4_objects, 2); 2524 V8::AddObjectGroup(iso, g4_objects, 2);
2524 V8::AddImplicitReferences(g4s1, g4_children, 1); 2525 V8::AddImplicitReferences(g4s1, g4_children, 1);
2525 } 2526 }
2526 // Do a single full GC 2527 // Do a single full GC
2527 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); 2528 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
2528 2529
2529 // All object should be alive. 2530 // All object should be alive.
2530 CHECK_EQ(0, counter.NumberOfWeakCalls()); 2531 CHECK_EQ(0, counter.NumberOfWeakCalls());
2531 2532
2532 // Weaken the root. 2533 // Weaken the root.
2533 root.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2534 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2534 2535
2535 // Groups are deleted, rebuild groups. 2536 // Groups are deleted, rebuild groups.
2536 { 2537 {
2537 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2538 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2538 Persistent<Value> g1_children[] = { g2s1 }; 2539 Persistent<Value> g1_children[] = { g2s1 };
2539 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2540 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2540 Persistent<Value> g2_children[] = { g3s1 }; 2541 Persistent<Value> g2_children[] = { g3s1 };
2541 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; 2542 Persistent<Value> g3_objects[] = { g3s1, g3s2 };
2542 Persistent<Value> g3_children[] = { g4s1 }; 2543 Persistent<Value> g3_children[] = { g4s1 };
2543 Persistent<Value> g4_objects[] = { g4s1, g4s2 }; 2544 Persistent<Value> g4_objects[] = { g4s1, g4s2 };
(...skipping 15 matching lines...) Expand all
2559 } 2560 }
2560 2561
2561 2562
2562 // TODO(mstarzinger): This should be a THREADED_TEST but causes failures 2563 // TODO(mstarzinger): This should be a THREADED_TEST but causes failures
2563 // on the buildbots, so was made non-threaded for the time being. 2564 // on the buildbots, so was made non-threaded for the time being.
2564 TEST(ApiObjectGroupsCycleForScavenger) { 2565 TEST(ApiObjectGroupsCycleForScavenger) {
2565 i::FLAG_stress_compaction = false; 2566 i::FLAG_stress_compaction = false;
2566 i::FLAG_gc_global = false; 2567 i::FLAG_gc_global = false;
2567 HandleScope scope; 2568 HandleScope scope;
2568 LocalContext env; 2569 LocalContext env;
2570 v8::Isolate* iso = env->GetIsolate();
2569 2571
2570 WeakCallCounter counter(1234); 2572 WeakCallCounter counter(1234);
2571 2573
2572 Persistent<Object> g1s1; 2574 Persistent<Object> g1s1;
2573 Persistent<Object> g1s2; 2575 Persistent<Object> g1s2;
2574 Persistent<Object> g2s1; 2576 Persistent<Object> g2s1;
2575 Persistent<Object> g2s2; 2577 Persistent<Object> g2s2;
2576 Persistent<Object> g3s1; 2578 Persistent<Object> g3s1;
2577 Persistent<Object> g3s2; 2579 Persistent<Object> g3s2;
2578 2580
2579 { 2581 {
2580 HandleScope scope; 2582 HandleScope scope;
2581 g1s1 = Persistent<Object>::New(Object::New()); 2583 g1s1 = Persistent<Object>::New(Object::New());
2582 g1s2 = Persistent<Object>::New(Object::New()); 2584 g1s2 = Persistent<Object>::New(Object::New());
2583 g1s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2585 g1s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2584 g1s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2586 g1s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2585 2587
2586 g2s1 = Persistent<Object>::New(Object::New()); 2588 g2s1 = Persistent<Object>::New(Object::New());
2587 g2s2 = Persistent<Object>::New(Object::New()); 2589 g2s2 = Persistent<Object>::New(Object::New());
2588 g2s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2590 g2s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2589 g2s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2591 g2s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2590 2592
2591 g3s1 = Persistent<Object>::New(Object::New()); 2593 g3s1 = Persistent<Object>::New(Object::New());
2592 g3s2 = Persistent<Object>::New(Object::New()); 2594 g3s2 = Persistent<Object>::New(Object::New());
2593 g3s1.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2595 g3s1.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2594 g3s2.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2596 g3s2.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2595 } 2597 }
2596 2598
2597 // Make a root. 2599 // Make a root.
2598 Persistent<Object> root = Persistent<Object>::New(g1s1); 2600 Persistent<Object> root = Persistent<Object>::New(g1s1);
2599 root.MarkPartiallyDependent(); 2601 root.MarkPartiallyDependent(iso);
2600 2602
2601 // Connect groups. We're building the following cycle: 2603 // Connect groups. We're building the following cycle:
2602 // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other 2604 // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other
2603 // groups. 2605 // groups.
2604 { 2606 {
2605 g1s1.MarkPartiallyDependent(); 2607 g1s1.MarkPartiallyDependent(iso);
2606 g1s2.MarkPartiallyDependent(); 2608 g1s2.MarkPartiallyDependent(iso);
2607 g2s1.MarkPartiallyDependent(); 2609 g2s1.MarkPartiallyDependent(iso);
2608 g2s2.MarkPartiallyDependent(); 2610 g2s2.MarkPartiallyDependent(iso);
2609 g3s1.MarkPartiallyDependent(); 2611 g3s1.MarkPartiallyDependent(iso);
2610 g3s2.MarkPartiallyDependent(); 2612 g3s2.MarkPartiallyDependent(iso);
2611 Persistent<Value> g1_objects[] = { g1s1, g1s2 }; 2613 Persistent<Value> g1_objects[] = { g1s1, g1s2 };
2612 Persistent<Value> g2_objects[] = { g2s1, g2s2 }; 2614 Persistent<Value> g2_objects[] = { g2s1, g2s2 };
2613 Persistent<Value> g3_objects[] = { g3s1, g3s2 }; 2615 Persistent<Value> g3_objects[] = { g3s1, g3s2 };
2614 V8::AddObjectGroup(g1_objects, 2); 2616 V8::AddObjectGroup(g1_objects, 2);
2615 g1s1->Set(v8_str("x"), g2s1); 2617 g1s1->Set(v8_str("x"), g2s1);
2616 V8::AddObjectGroup(g2_objects, 2); 2618 V8::AddObjectGroup(g2_objects, 2);
2617 g2s1->Set(v8_str("x"), g3s1); 2619 g2s1->Set(v8_str("x"), g3s1);
2618 V8::AddObjectGroup(g3_objects, 2); 2620 V8::AddObjectGroup(g3_objects, 2);
2619 g3s1->Set(v8_str("x"), g1s1); 2621 g3s1->Set(v8_str("x"), g1s1);
2620 } 2622 }
2621 2623
2622 HEAP->CollectGarbage(i::NEW_SPACE); 2624 HEAP->CollectGarbage(i::NEW_SPACE);
2623 2625
2624 // All objects should be alive. 2626 // All objects should be alive.
2625 CHECK_EQ(0, counter.NumberOfWeakCalls()); 2627 CHECK_EQ(0, counter.NumberOfWeakCalls());
2626 2628
2627 // Weaken the root. 2629 // Weaken the root.
2628 root.MakeWeak(reinterpret_cast<void*>(&counter), &WeakPointerCallback); 2630 root.MakeWeak(iso, reinterpret_cast<void*>(&counter), &WeakPointerCallback);
2629 root.MarkPartiallyDependent(); 2631 root.MarkPartiallyDependent(iso);
2630 2632
2631 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 2633 v8::Isolate* isolate = v8::Isolate::GetCurrent();
2632 // Groups are deleted, rebuild groups. 2634 // Groups are deleted, rebuild groups.
2633 { 2635 {
2634 g1s1.MarkPartiallyDependent(isolate); 2636 g1s1.MarkPartiallyDependent(isolate);
2635 g1s2.MarkPartiallyDependent(isolate); 2637 g1s2.MarkPartiallyDependent(isolate);
2636 g2s1.MarkPartiallyDependent(isolate); 2638 g2s1.MarkPartiallyDependent(isolate);
2637 g2s2.MarkPartiallyDependent(isolate); 2639 g2s2.MarkPartiallyDependent(isolate);
2638 g3s1.MarkPartiallyDependent(isolate); 2640 g3s1.MarkPartiallyDependent(isolate);
2639 g3s2.MarkPartiallyDependent(isolate); 2641 g3s2.MarkPartiallyDependent(isolate);
(...skipping 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after
3777 CHECK(!v8_num(1)->StrictEquals(v8_num(2))); 3779 CHECK(!v8_num(1)->StrictEquals(v8_num(2)));
3778 CHECK(v8_num(0)->StrictEquals(v8_num(-0))); 3780 CHECK(v8_num(0)->StrictEquals(v8_num(-0)));
3779 Local<Value> not_a_number = v8_num(i::OS::nan_value()); 3781 Local<Value> not_a_number = v8_num(i::OS::nan_value());
3780 CHECK(!not_a_number->StrictEquals(not_a_number)); 3782 CHECK(!not_a_number->StrictEquals(not_a_number));
3781 CHECK(v8::False()->StrictEquals(v8::False())); 3783 CHECK(v8::False()->StrictEquals(v8::False()));
3782 CHECK(!v8::False()->StrictEquals(v8::Undefined())); 3784 CHECK(!v8::False()->StrictEquals(v8::Undefined()));
3783 3785
3784 v8::Handle<v8::Object> obj = v8::Object::New(); 3786 v8::Handle<v8::Object> obj = v8::Object::New();
3785 v8::Persistent<v8::Object> alias = v8::Persistent<v8::Object>::New(obj); 3787 v8::Persistent<v8::Object> alias = v8::Persistent<v8::Object>::New(obj);
3786 CHECK(alias->StrictEquals(obj)); 3788 CHECK(alias->StrictEquals(obj));
3787 alias.Dispose(); 3789 alias.Dispose(context->GetIsolate());
3788 } 3790 }
3789 3791
3790 3792
3791 THREADED_TEST(MultiRun) { 3793 THREADED_TEST(MultiRun) {
3792 v8::HandleScope scope; 3794 v8::HandleScope scope;
3793 LocalContext context; 3795 LocalContext context;
3794 Local<Script> script = Script::Compile(v8_str("x")); 3796 Local<Script> script = Script::Compile(v8_str("x"));
3795 for (int i = 0; i < 10; i++) 3797 for (int i = 0; i < 10; i++)
3796 script->Run(); 3798 script->Run();
3797 } 3799 }
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
4090 v8::HandleScope scope; 4092 v8::HandleScope scope;
4091 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4093 Local<ObjectTemplate> templ = ObjectTemplate::New();
4092 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); 4094 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut"));
4093 LocalContext context; 4095 LocalContext context;
4094 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 4096 context->Global()->Set(v8_str("obj"), templ->NewInstance());
4095 Local<Script> script = Script::Compile(v8_str("obj.x = 4")); 4097 Local<Script> script = Script::Compile(v8_str("obj.x = 4"));
4096 for (int i = 0; i < 10; i++) { 4098 for (int i = 0; i < 10; i++) {
4097 CHECK(xValue.IsEmpty()); 4099 CHECK(xValue.IsEmpty());
4098 script->Run(); 4100 script->Run();
4099 CHECK_EQ(v8_num(4), xValue); 4101 CHECK_EQ(v8_num(4), xValue);
4100 xValue.Dispose(); 4102 xValue.Dispose(context->GetIsolate());
4101 xValue = v8::Persistent<Value>(); 4103 xValue = v8::Persistent<Value>();
4102 } 4104 }
4103 } 4105 }
4104 4106
4105 4107
4106 THREADED_TEST(SetterOnly) { 4108 THREADED_TEST(SetterOnly) {
4107 v8::HandleScope scope; 4109 v8::HandleScope scope;
4108 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4110 Local<ObjectTemplate> templ = ObjectTemplate::New();
4109 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); 4111 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut"));
4110 LocalContext context; 4112 LocalContext context;
4111 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 4113 context->Global()->Set(v8_str("obj"), templ->NewInstance());
4112 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); 4114 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
4113 for (int i = 0; i < 10; i++) { 4115 for (int i = 0; i < 10; i++) {
4114 CHECK(xValue.IsEmpty()); 4116 CHECK(xValue.IsEmpty());
4115 script->Run(); 4117 script->Run();
4116 CHECK_EQ(v8_num(4), xValue); 4118 CHECK_EQ(v8_num(4), xValue);
4117 xValue.Dispose(); 4119 xValue.Dispose(context->GetIsolate());
4118 xValue = v8::Persistent<Value>(); 4120 xValue = v8::Persistent<Value>();
4119 } 4121 }
4120 } 4122 }
4121 4123
4122 4124
4123 THREADED_TEST(NoAccessors) { 4125 THREADED_TEST(NoAccessors) {
4124 v8::HandleScope scope; 4126 v8::HandleScope scope;
4125 Local<ObjectTemplate> templ = ObjectTemplate::New(); 4127 Local<ObjectTemplate> templ = ObjectTemplate::New();
4126 templ->SetAccessor(v8_str("x"), NULL, NULL, v8_str("donut")); 4128 templ->SetAccessor(v8_str("x"), NULL, NULL, v8_str("donut"));
4127 LocalContext context; 4129 LocalContext context;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
4217 // Check that the interceptor was actually invoked. 4219 // Check that the interceptor was actually invoked.
4218 CHECK_EQ(result, v8_str("x")); 4220 CHECK_EQ(result, v8_str("x"));
4219 } 4221 }
4220 4222
4221 // Return to the original context and force some object to the slow case 4223 // Return to the original context and force some object to the slow case
4222 // to cause the NormalizedMapCache to verify. 4224 // to cause the NormalizedMapCache to verify.
4223 context1->Enter(); 4225 context1->Enter();
4224 CompileRun("var obj = { x : 0 }; delete obj.x;"); 4226 CompileRun("var obj = { x : 0 }; delete obj.x;");
4225 context1->Exit(); 4227 context1->Exit();
4226 4228
4227 context1.Dispose(); 4229 context1.Dispose(context1->GetIsolate());
4228 } 4230 }
4229 4231
4230 4232
4231 static v8::Handle<Value> SetXOnPrototypeGetter(Local<String> property, 4233 static v8::Handle<Value> SetXOnPrototypeGetter(Local<String> property,
4232 const AccessorInfo& info) { 4234 const AccessorInfo& info) {
4233 // Set x on the prototype object and do not handle the get request. 4235 // Set x on the prototype object and do not handle the get request.
4234 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); 4236 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype();
4235 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23)); 4237 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23));
4236 return v8::Handle<Value>(); 4238 return v8::Handle<Value>();
4237 } 4239 }
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
4999 5001
5000 5002
5001 THREADED_TEST(GlobalObjectTemplate) { 5003 THREADED_TEST(GlobalObjectTemplate) {
5002 v8::HandleScope handle_scope; 5004 v8::HandleScope handle_scope;
5003 Local<ObjectTemplate> global_template = ObjectTemplate::New(); 5005 Local<ObjectTemplate> global_template = ObjectTemplate::New();
5004 global_template->Set(v8_str("JSNI_Log"), 5006 global_template->Set(v8_str("JSNI_Log"),
5005 v8::FunctionTemplate::New(HandleLogDelegator)); 5007 v8::FunctionTemplate::New(HandleLogDelegator));
5006 v8::Persistent<Context> context = Context::New(0, global_template); 5008 v8::Persistent<Context> context = Context::New(0, global_template);
5007 Context::Scope context_scope(context); 5009 Context::Scope context_scope(context);
5008 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); 5010 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run();
5009 context.Dispose(); 5011 context.Dispose(context->GetIsolate());
5010 } 5012 }
5011 5013
5012 5014
5013 static const char* kSimpleExtensionSource = 5015 static const char* kSimpleExtensionSource =
5014 "function Foo() {" 5016 "function Foo() {"
5015 " return 4;" 5017 " return 4;"
5016 "}"; 5018 "}";
5017 5019
5018 5020
5019 THREADED_TEST(SimpleExtensions) { 5021 THREADED_TEST(SimpleExtensions) {
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
5472 Snorkel() { index_ = global_index++; } 5474 Snorkel() { index_ = global_index++; }
5473 int index_; 5475 int index_;
5474 }; 5476 };
5475 5477
5476 class Whammy { 5478 class Whammy {
5477 public: 5479 public:
5478 Whammy() { 5480 Whammy() {
5479 cursor_ = 0; 5481 cursor_ = 0;
5480 } 5482 }
5481 ~Whammy() { 5483 ~Whammy() {
5482 script_.Dispose(); 5484 script_.Dispose(v8::Isolate::GetCurrent());
5483 } 5485 }
5484 v8::Handle<Script> getScript() { 5486 v8::Handle<Script> getScript() {
5485 if (script_.IsEmpty()) 5487 if (script_.IsEmpty())
5486 script_ = v8::Persistent<Script>::New(v8_compile("({}).blammo")); 5488 script_ = v8::Persistent<Script>::New(v8_compile("({}).blammo"));
5487 return Local<Script>(*script_); 5489 return Local<Script>(*script_);
5488 } 5490 }
5489 5491
5490 public: 5492 public:
5491 static const int kObjectCount = 256; 5493 static const int kObjectCount = 256;
5492 int cursor_; 5494 int cursor_;
5493 v8::Persistent<v8::Object> objects_[kObjectCount]; 5495 v8::Persistent<v8::Object> objects_[kObjectCount];
5494 v8::Persistent<Script> script_; 5496 v8::Persistent<Script> script_;
5495 }; 5497 };
5496 5498
5497 static void HandleWeakReference(v8::Persistent<v8::Value> obj, void* data) { 5499 static void HandleWeakReference(v8::Isolate* isolate,
5500 v8::Persistent<v8::Value> obj,
5501 void* data) {
5498 Snorkel* snorkel = reinterpret_cast<Snorkel*>(data); 5502 Snorkel* snorkel = reinterpret_cast<Snorkel*>(data);
5499 delete snorkel; 5503 delete snorkel;
5500 obj.ClearWeak(); 5504 obj.ClearWeak(isolate);
5501 } 5505 }
5502 5506
5503 v8::Handle<Value> WhammyPropertyGetter(Local<String> name, 5507 v8::Handle<Value> WhammyPropertyGetter(Local<String> name,
5504 const AccessorInfo& info) { 5508 const AccessorInfo& info) {
5505 Whammy* whammy = 5509 Whammy* whammy =
5506 static_cast<Whammy*>(v8::Handle<v8::External>::Cast(info.Data())->Value()); 5510 static_cast<Whammy*>(v8::Handle<v8::External>::Cast(info.Data())->Value());
5507 5511
5508 v8::Persistent<v8::Object> prev = whammy->objects_[whammy->cursor_]; 5512 v8::Persistent<v8::Object> prev = whammy->objects_[whammy->cursor_];
5509 5513
5510 v8::Handle<v8::Object> obj = v8::Object::New(); 5514 v8::Handle<v8::Object> obj = v8::Object::New();
5511 v8::Persistent<v8::Object> global = v8::Persistent<v8::Object>::New(obj); 5515 v8::Persistent<v8::Object> global = v8::Persistent<v8::Object>::New(obj);
5512 if (!prev.IsEmpty()) { 5516 if (!prev.IsEmpty()) {
5513 prev->Set(v8_str("next"), obj); 5517 prev->Set(v8_str("next"), obj);
5514 prev.MakeWeak(new Snorkel(), &HandleWeakReference); 5518 v8::Isolate* isolate = v8::Isolate::GetCurrent();
5519 prev.MakeWeak(isolate, new Snorkel(), &HandleWeakReference);
Michael Starzinger 2013/01/24 13:09:05 Can we use info.GetIsolate() here?
Sven Panne 2013/01/25 08:28:40 Done.
5515 whammy->objects_[whammy->cursor_].Clear(); 5520 whammy->objects_[whammy->cursor_].Clear();
5516 } 5521 }
5517 whammy->objects_[whammy->cursor_] = global; 5522 whammy->objects_[whammy->cursor_] = global;
5518 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount; 5523 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount;
5519 return whammy->getScript()->Run(); 5524 return whammy->getScript()->Run();
5520 } 5525 }
5521 5526
5522 THREADED_TEST(WeakReference) { 5527 THREADED_TEST(WeakReference) {
5523 v8::HandleScope handle_scope; 5528 v8::HandleScope handle_scope;
5524 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(); 5529 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New();
(...skipping 13 matching lines...) Expand all
5538 "for (var i = 0; i < 10000; i++) {" 5543 "for (var i = 0; i < 10000; i++) {"
5539 " var obj = whammy.length;" 5544 " var obj = whammy.length;"
5540 " if (last) last.next = obj;" 5545 " if (last) last.next = obj;"
5541 " last = obj;" 5546 " last = obj;"
5542 "}" 5547 "}"
5543 "gc();" 5548 "gc();"
5544 "4"; 5549 "4";
5545 v8::Handle<Value> result = CompileRun(code); 5550 v8::Handle<Value> result = CompileRun(code);
5546 CHECK_EQ(4.0, result->NumberValue()); 5551 CHECK_EQ(4.0, result->NumberValue());
5547 delete whammy; 5552 delete whammy;
5548 context.Dispose(); 5553 context.Dispose(context->GetIsolate());
5549 } 5554 }
5550 5555
5551 5556
5552 static void DisposeAndSetFlag(v8::Persistent<v8::Value> obj, void* data) { 5557 static void DisposeAndSetFlag(v8::Isolate* isolate,
5553 obj.Dispose(); 5558 v8::Persistent<v8::Value> obj,
5559 void* data) {
5560 obj.Dispose(isolate);
5554 obj.Clear(); 5561 obj.Clear();
5555 *(reinterpret_cast<bool*>(data)) = true; 5562 *(reinterpret_cast<bool*>(data)) = true;
5556 } 5563 }
5557 5564
5558 5565
5559 THREADED_TEST(IndependentWeakHandle) { 5566 THREADED_TEST(IndependentWeakHandle) {
5560 v8::Persistent<Context> context = Context::New(); 5567 v8::Persistent<Context> context = Context::New();
5568 v8::Isolate* iso = context->GetIsolate();
5561 Context::Scope context_scope(context); 5569 Context::Scope context_scope(context);
5562 5570
5563 v8::Persistent<v8::Object> object_a, object_b; 5571 v8::Persistent<v8::Object> object_a, object_b;
5564 5572
5565 { 5573 {
5566 v8::HandleScope handle_scope; 5574 v8::HandleScope handle_scope;
5567 object_a = v8::Persistent<v8::Object>::New(v8::Object::New()); 5575 object_a = v8::Persistent<v8::Object>::New(v8::Object::New());
5568 object_b = v8::Persistent<v8::Object>::New(v8::Object::New()); 5576 object_b = v8::Persistent<v8::Object>::New(v8::Object::New());
5569 } 5577 }
5570 5578
5571 v8::Isolate* isolate = v8::Isolate::GetCurrent();
5572 bool object_a_disposed = false; 5579 bool object_a_disposed = false;
5573 bool object_b_disposed = false; 5580 bool object_b_disposed = false;
5574 object_a.MakeWeak(&object_a_disposed, &DisposeAndSetFlag); 5581 object_a.MakeWeak(iso, &object_a_disposed, &DisposeAndSetFlag);
5575 object_b.MakeWeak(&object_b_disposed, &DisposeAndSetFlag); 5582 object_b.MakeWeak(iso, &object_b_disposed, &DisposeAndSetFlag);
5576 CHECK(!object_a.IsIndependent()); 5583 CHECK(!object_b.IsIndependent(iso));
5577 CHECK(!object_b.IsIndependent(isolate)); 5584 object_a.MarkIndependent(iso);
5578 object_a.MarkIndependent(); 5585 object_b.MarkIndependent(iso);
5579 object_b.MarkIndependent(isolate); 5586 CHECK(object_b.IsIndependent(iso));
5580 CHECK(object_a.IsIndependent());
5581 CHECK(object_b.IsIndependent(isolate));
5582 HEAP->PerformScavenge(); 5587 HEAP->PerformScavenge();
5583 CHECK(object_a_disposed); 5588 CHECK(object_a_disposed);
5584 CHECK(object_b_disposed); 5589 CHECK(object_b_disposed);
5585 } 5590 }
5586 5591
5587 5592
5588 static void InvokeScavenge() { 5593 static void InvokeScavenge() {
5589 HEAP->PerformScavenge(); 5594 HEAP->PerformScavenge();
5590 } 5595 }
5591 5596
5592 5597
5593 static void InvokeMarkSweep() { 5598 static void InvokeMarkSweep() {
5594 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 5599 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
5595 } 5600 }
5596 5601
5597 5602
5598 static void ForceScavenge(v8::Persistent<v8::Value> obj, void* data) { 5603 static void ForceScavenge(v8::Isolate* isolate,
5599 obj.Dispose(); 5604 v8::Persistent<v8::Value> obj,
5605 void* data) {
5606 obj.Dispose(isolate);
5600 obj.Clear(); 5607 obj.Clear();
5601 *(reinterpret_cast<bool*>(data)) = true; 5608 *(reinterpret_cast<bool*>(data)) = true;
5602 InvokeScavenge(); 5609 InvokeScavenge();
5603 } 5610 }
5604 5611
5605 5612
5606 static void ForceMarkSweep(v8::Persistent<v8::Value> obj, void* data) { 5613 static void ForceMarkSweep(v8::Isolate* isolate,
5607 obj.Dispose(); 5614 v8::Persistent<v8::Value> obj,
5615 void* data) {
5616 obj.Dispose(isolate);
5608 obj.Clear(); 5617 obj.Clear();
5609 *(reinterpret_cast<bool*>(data)) = true; 5618 *(reinterpret_cast<bool*>(data)) = true;
5610 InvokeMarkSweep(); 5619 InvokeMarkSweep();
5611 } 5620 }
5612 5621
5613 5622
5614 THREADED_TEST(GCFromWeakCallbacks) { 5623 THREADED_TEST(GCFromWeakCallbacks) {
5615 v8::Persistent<Context> context = Context::New(); 5624 v8::Persistent<Context> context = Context::New();
5616 Context::Scope context_scope(context); 5625 Context::Scope context_scope(context);
5617 5626
5618 static const int kNumberOfGCTypes = 2; 5627 static const int kNumberOfGCTypes = 2;
5619 v8::WeakReferenceCallback gc_forcing_callback[kNumberOfGCTypes] = 5628 v8::NearDeathCallback gc_forcing_callback[kNumberOfGCTypes] =
5620 {&ForceScavenge, &ForceMarkSweep}; 5629 {&ForceScavenge, &ForceMarkSweep};
5621 5630
5622 typedef void (*GCInvoker)(); 5631 typedef void (*GCInvoker)();
5623 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep}; 5632 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep};
5624 5633
5625 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) { 5634 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) {
5626 for (int inner_gc = 0; inner_gc < kNumberOfGCTypes; inner_gc++) { 5635 for (int inner_gc = 0; inner_gc < kNumberOfGCTypes; inner_gc++) {
5627 v8::Persistent<v8::Object> object; 5636 v8::Persistent<v8::Object> object;
5628 { 5637 {
5629 v8::HandleScope handle_scope; 5638 v8::HandleScope handle_scope;
5630 object = v8::Persistent<v8::Object>::New(v8::Object::New()); 5639 object = v8::Persistent<v8::Object>::New(v8::Object::New());
5631 } 5640 }
5632 bool disposed = false; 5641 bool disposed = false;
5633 object.MakeWeak(&disposed, gc_forcing_callback[inner_gc]); 5642 v8::Isolate* isolate = context->GetIsolate();
5634 object.MarkIndependent(); 5643 object.MakeWeak(isolate, &disposed, gc_forcing_callback[inner_gc]);
5644 object.MarkIndependent(isolate);
5635 invoke_gc[outer_gc](); 5645 invoke_gc[outer_gc]();
5636 CHECK(disposed); 5646 CHECK(disposed);
5637 } 5647 }
5638 } 5648 }
5639 } 5649 }
5640 5650
5641 5651
5642 static void RevivingCallback(v8::Persistent<v8::Value> obj, void* data) { 5652 static void RevivingCallback(v8::Isolate* isolate,
5643 obj.ClearWeak(); 5653 v8::Persistent<v8::Value> obj,
5654 void* data) {
5655 obj.ClearWeak(isolate);
5644 *(reinterpret_cast<bool*>(data)) = true; 5656 *(reinterpret_cast<bool*>(data)) = true;
5645 } 5657 }
5646 5658
5647 5659
5648 THREADED_TEST(IndependentHandleRevival) { 5660 THREADED_TEST(IndependentHandleRevival) {
5649 v8::Persistent<Context> context = Context::New(); 5661 v8::Persistent<Context> context = Context::New();
5650 Context::Scope context_scope(context); 5662 Context::Scope context_scope(context);
5663 v8::Isolate* isolate = context->GetIsolate();
5651 5664
5652 v8::Persistent<v8::Object> object; 5665 v8::Persistent<v8::Object> object;
5653 { 5666 {
5654 v8::HandleScope handle_scope; 5667 v8::HandleScope handle_scope;
5655 object = v8::Persistent<v8::Object>::New(v8::Object::New()); 5668 object = v8::Persistent<v8::Object>::New(v8::Object::New());
5656 object->Set(v8_str("x"), v8::Integer::New(1)); 5669 object->Set(v8_str("x"), v8::Integer::New(1));
5657 v8::Local<String> y_str = v8_str("y"); 5670 v8::Local<String> y_str = v8_str("y");
5658 object->Set(y_str, y_str); 5671 object->Set(y_str, y_str);
5659 } 5672 }
5660 bool revived = false; 5673 bool revived = false;
5661 object.MakeWeak(&revived, &RevivingCallback); 5674 object.MakeWeak(isolate, &revived, &RevivingCallback);
5662 object.MarkIndependent(); 5675 object.MarkIndependent(isolate);
5663 HEAP->PerformScavenge(); 5676 HEAP->PerformScavenge();
5664 CHECK(revived); 5677 CHECK(revived);
5665 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); 5678 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
5666 { 5679 {
5667 v8::HandleScope handle_scope; 5680 v8::HandleScope handle_scope;
5668 v8::Local<String> y_str = v8_str("y"); 5681 v8::Local<String> y_str = v8_str("y");
5669 CHECK_EQ(v8::Integer::New(1), object->Get(v8_str("x"))); 5682 CHECK_EQ(v8::Integer::New(1), object->Get(v8_str("x")));
5670 CHECK(object->Get(y_str)->Equals(y_str)); 5683 CHECK(object->Get(y_str)->Equals(y_str));
5671 } 5684 }
5672 } 5685 }
(...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after
6748 v8::Handle<Script> script2 = 6761 v8::Handle<Script> script2 =
6749 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); 6762 v8_compile("othercontext.foo = 333; othercontext[0] = 888;");
6750 script2->Run(); 6763 script2->Run();
6751 v8::Handle<Value> foo2 = global0->Get(v8_str("foo")); 6764 v8::Handle<Value> foo2 = global0->Get(v8_str("foo"));
6752 CHECK_EQ(333, foo2->Int32Value()); 6765 CHECK_EQ(333, foo2->Int32Value());
6753 v8::Handle<Value> z2 = global0->Get(v8_str("0")); 6766 v8::Handle<Value> z2 = global0->Get(v8_str("0"));
6754 CHECK_EQ(888, z2->Int32Value()); 6767 CHECK_EQ(888, z2->Int32Value());
6755 } 6768 }
6756 6769
6757 context1->Exit(); 6770 context1->Exit();
6758 context1.Dispose(); 6771 context1.Dispose(context1->GetIsolate());
6759 6772
6760 context0->Exit(); 6773 context0->Exit();
6761 context0.Dispose(); 6774 context0.Dispose(context0->GetIsolate());
6762 } 6775 }
6763 6776
6764 6777
6765 THREADED_TEST(SecurityChecks) { 6778 THREADED_TEST(SecurityChecks) {
6766 v8::HandleScope handle_scope; 6779 v8::HandleScope handle_scope;
6767 LocalContext env1; 6780 LocalContext env1;
6768 v8::Persistent<Context> env2 = Context::New(); 6781 v8::Persistent<Context> env2 = Context::New();
6769 6782
6770 Local<Value> foo = v8_str("foo"); 6783 Local<Value> foo = v8_str("foo");
6771 Local<Value> bar = v8_str("bar"); 6784 Local<Value> bar = v8_str("bar");
(...skipping 23 matching lines...) Expand all
6795 { 6808 {
6796 env2->SetSecurityToken(bar); 6809 env2->SetSecurityToken(bar);
6797 Context::Scope scope_env2(env2); 6810 Context::Scope scope_env2(env2);
6798 6811
6799 // Call cross_domain_call, it should throw an exception 6812 // Call cross_domain_call, it should throw an exception
6800 v8::TryCatch try_catch; 6813 v8::TryCatch try_catch;
6801 Function::Cast(*spy2)->Call(env2->Global(), 0, NULL); 6814 Function::Cast(*spy2)->Call(env2->Global(), 0, NULL);
6802 CHECK(try_catch.HasCaught()); 6815 CHECK(try_catch.HasCaught());
6803 } 6816 }
6804 6817
6805 env2.Dispose(); 6818 env2.Dispose(env2->GetIsolate());
6806 } 6819 }
6807 6820
6808 6821
6809 // Regression test case for issue 1183439. 6822 // Regression test case for issue 1183439.
6810 THREADED_TEST(SecurityChecksForPrototypeChain) { 6823 THREADED_TEST(SecurityChecksForPrototypeChain) {
6811 v8::HandleScope scope; 6824 v8::HandleScope scope;
6812 LocalContext current; 6825 LocalContext current;
6813 v8::Persistent<Context> other = Context::New(); 6826 v8::Persistent<Context> other = Context::New();
6814 6827
6815 // Change context to be able to get to the Object function in the 6828 // Change context to be able to get to the Object function in the
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
6864 // Try to read the properties from f and make sure that the access 6877 // Try to read the properties from f and make sure that the access
6865 // gets stopped by the security checks on the other global object. 6878 // gets stopped by the security checks on the other global object.
6866 Local<Script> access_f2 = v8_compile("f.foo"); 6879 Local<Script> access_f2 = v8_compile("f.foo");
6867 Local<Script> access_f3 = v8_compile("f[99]"); 6880 Local<Script> access_f3 = v8_compile("f[99]");
6868 for (int k = 0; k < 5; k++) { 6881 for (int k = 0; k < 5; k++) {
6869 CHECK(!access_f2->Run()->Equals(v8_num(100))); 6882 CHECK(!access_f2->Run()->Equals(v8_num(100)));
6870 CHECK(access_f2->Run()->IsUndefined()); 6883 CHECK(access_f2->Run()->IsUndefined());
6871 CHECK(!access_f3->Run()->Equals(v8_num(101))); 6884 CHECK(!access_f3->Run()->Equals(v8_num(101)));
6872 CHECK(access_f3->Run()->IsUndefined()); 6885 CHECK(access_f3->Run()->IsUndefined());
6873 } 6886 }
6874 other.Dispose(); 6887 other.Dispose(other->GetIsolate());
6875 } 6888 }
6876 6889
6877 6890
6878 THREADED_TEST(CrossDomainDelete) { 6891 THREADED_TEST(CrossDomainDelete) {
6879 v8::HandleScope handle_scope; 6892 v8::HandleScope handle_scope;
6880 LocalContext env1; 6893 LocalContext env1;
6881 v8::Persistent<Context> env2 = Context::New(); 6894 v8::Persistent<Context> env2 = Context::New();
6882 6895
6883 Local<Value> foo = v8_str("foo"); 6896 Local<Value> foo = v8_str("foo");
6884 Local<Value> bar = v8_str("bar"); 6897 Local<Value> bar = v8_str("bar");
(...skipping 12 matching lines...) Expand all
6897 Local<Value> result = 6910 Local<Value> result =
6898 Script::Compile(v8_str("delete env1.prop"))->Run(); 6911 Script::Compile(v8_str("delete env1.prop"))->Run();
6899 CHECK(result->IsFalse()); 6912 CHECK(result->IsFalse());
6900 } 6913 }
6901 6914
6902 // Check that env1.prop still exists. 6915 // Check that env1.prop still exists.
6903 Local<Value> v = env1->Global()->Get(v8_str("prop")); 6916 Local<Value> v = env1->Global()->Get(v8_str("prop"));
6904 CHECK(v->IsNumber()); 6917 CHECK(v->IsNumber());
6905 CHECK_EQ(3, v->Int32Value()); 6918 CHECK_EQ(3, v->Int32Value());
6906 6919
6907 env2.Dispose(); 6920 env2.Dispose(env2->GetIsolate());
6908 } 6921 }
6909 6922
6910 6923
6911 THREADED_TEST(CrossDomainIsPropertyEnumerable) { 6924 THREADED_TEST(CrossDomainIsPropertyEnumerable) {
6912 v8::HandleScope handle_scope; 6925 v8::HandleScope handle_scope;
6913 LocalContext env1; 6926 LocalContext env1;
6914 v8::Persistent<Context> env2 = Context::New(); 6927 v8::Persistent<Context> env2 = Context::New();
6915 6928
6916 Local<Value> foo = v8_str("foo"); 6929 Local<Value> foo = v8_str("foo");
6917 Local<Value> bar = v8_str("bar"); 6930 Local<Value> bar = v8_str("bar");
(...skipping 14 matching lines...) Expand all
6932 } 6945 }
6933 6946
6934 // Change env2 to a different domain and test again. 6947 // Change env2 to a different domain and test again.
6935 env2->SetSecurityToken(bar); 6948 env2->SetSecurityToken(bar);
6936 { 6949 {
6937 Context::Scope scope_env2(env2); 6950 Context::Scope scope_env2(env2);
6938 Local<Value> result = Script::Compile(test)->Run(); 6951 Local<Value> result = Script::Compile(test)->Run();
6939 CHECK(result->IsFalse()); 6952 CHECK(result->IsFalse());
6940 } 6953 }
6941 6954
6942 env2.Dispose(); 6955 env2.Dispose(env2->GetIsolate());
6943 } 6956 }
6944 6957
6945 6958
6946 THREADED_TEST(CrossDomainForIn) { 6959 THREADED_TEST(CrossDomainForIn) {
6947 v8::HandleScope handle_scope; 6960 v8::HandleScope handle_scope;
6948 LocalContext env1; 6961 LocalContext env1;
6949 v8::Persistent<Context> env2 = Context::New(); 6962 v8::Persistent<Context> env2 = Context::New();
6950 6963
6951 Local<Value> foo = v8_str("foo"); 6964 Local<Value> foo = v8_str("foo");
6952 Local<Value> bar = v8_str("bar"); 6965 Local<Value> bar = v8_str("bar");
(...skipping 12 matching lines...) Expand all
6965 env2->SetSecurityToken(bar); 6978 env2->SetSecurityToken(bar);
6966 { 6979 {
6967 Context::Scope scope_env2(env2); 6980 Context::Scope scope_env2(env2);
6968 Local<Value> result = 6981 Local<Value> result =
6969 CompileRun("(function(){var obj = {'__proto__':env1};" 6982 CompileRun("(function(){var obj = {'__proto__':env1};"
6970 "for (var p in obj)" 6983 "for (var p in obj)"
6971 " if (p == 'prop') return false;" 6984 " if (p == 'prop') return false;"
6972 "return true;})()"); 6985 "return true;})()");
6973 CHECK(result->IsTrue()); 6986 CHECK(result->IsTrue());
6974 } 6987 }
6975 env2.Dispose(); 6988 env2.Dispose(env2->GetIsolate());
6976 } 6989 }
6977 6990
6978 6991
6979 TEST(ContextDetachGlobal) { 6992 TEST(ContextDetachGlobal) {
6980 v8::HandleScope handle_scope; 6993 v8::HandleScope handle_scope;
6981 LocalContext env1; 6994 LocalContext env1;
6982 v8::Persistent<Context> env2 = Context::New(); 6995 v8::Persistent<Context> env2 = Context::New();
6983 6996
6984 Local<v8::Object> global1 = env1->Global(); 6997 Local<v8::Object> global1 = env1->Global();
6985 6998
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
7028 CHECK(!try_catch.HasCaught()); 7041 CHECK(!try_catch.HasCaught());
7029 CHECK_EQ(1, r->Int32Value()); 7042 CHECK_EQ(1, r->Int32Value());
7030 } 7043 }
7031 7044
7032 // Check that env3 is not accessible from env1 7045 // Check that env3 is not accessible from env1
7033 { 7046 {
7034 Local<Value> r = global3->Get(v8_str("prop2")); 7047 Local<Value> r = global3->Get(v8_str("prop2"));
7035 CHECK(r->IsUndefined()); 7048 CHECK(r->IsUndefined());
7036 } 7049 }
7037 7050
7038 env2.Dispose(); 7051 env2.Dispose(env2->GetIsolate());
7039 env3.Dispose(); 7052 env3.Dispose(env3->GetIsolate());
7040 } 7053 }
7041 7054
7042 7055
7043 TEST(DetachAndReattachGlobal) { 7056 TEST(DetachAndReattachGlobal) {
7044 v8::HandleScope scope; 7057 v8::HandleScope scope;
7045 LocalContext env1; 7058 LocalContext env1;
7046 7059
7047 // Create second environment. 7060 // Create second environment.
7048 v8::Persistent<Context> env2 = Context::New(); 7061 v8::Persistent<Context> env2 = Context::New();
7049 7062
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
7107 // Detach the global for env3 and reattach it to env2. 7120 // Detach the global for env3 and reattach it to env2.
7108 env3->DetachGlobal(); 7121 env3->DetachGlobal();
7109 env2->ReattachGlobal(global2); 7122 env2->ReattachGlobal(global2);
7110 7123
7111 // Check that we have access to other.p again in env1. |other| is now 7124 // Check that we have access to other.p again in env1. |other| is now
7112 // the global object for env2 which has the same security token as env1. 7125 // the global object for env2 which has the same security token as env1.
7113 result = CompileRun("other.p"); 7126 result = CompileRun("other.p");
7114 CHECK(result->IsInt32()); 7127 CHECK(result->IsInt32());
7115 CHECK_EQ(42, result->Int32Value()); 7128 CHECK_EQ(42, result->Int32Value());
7116 7129
7117 env2.Dispose(); 7130 env2.Dispose(env2->GetIsolate());
7118 env3.Dispose(); 7131 env3.Dispose(env3->GetIsolate());
7119 } 7132 }
7120 7133
7121 7134
7122 static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false }; 7135 static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false };
7123 static bool NamedAccessBlocker(Local<v8::Object> global, 7136 static bool NamedAccessBlocker(Local<v8::Object> global,
7124 Local<Value> name, 7137 Local<Value> name,
7125 v8::AccessType type, 7138 v8::AccessType type,
7126 Local<Value> data) { 7139 Local<Value> data) {
7127 return Context::GetCurrent()->Global()->Equals(global) || 7140 return Context::GetCurrent()->Global()->Equals(global) ||
7128 allowed_access_type[type]; 7141 allowed_access_type[type];
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
7398 CompileRun("(function(){var obj = {'__proto__':other};" 7411 CompileRun("(function(){var obj = {'__proto__':other};"
7399 "for (var p in obj)" 7412 "for (var p in obj)"
7400 " if (p == 'accessible_prop' || p == 'blocked_prop') {" 7413 " if (p == 'accessible_prop' || p == 'blocked_prop') {"
7401 " return false;" 7414 " return false;"
7402 " }" 7415 " }"
7403 "return true;})()"); 7416 "return true;})()");
7404 CHECK(value->IsTrue()); 7417 CHECK(value->IsTrue());
7405 7418
7406 context1->Exit(); 7419 context1->Exit();
7407 context0->Exit(); 7420 context0->Exit();
7408 context1.Dispose(); 7421 context1.Dispose(context1->GetIsolate());
7409 context0.Dispose(); 7422 context0.Dispose(context0->GetIsolate());
7410 } 7423 }
7411 7424
7412 7425
7413 TEST(AccessControlES5) { 7426 TEST(AccessControlES5) {
7414 v8::HandleScope handle_scope; 7427 v8::HandleScope handle_scope;
7415 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 7428 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
7416 7429
7417 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, 7430 global_template->SetAccessCheckCallbacks(NamedAccessBlocker,
7418 IndexedAccessBlocker); 7431 IndexedAccessBlocker);
7419 7432
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
7527 // proxy object. Accessing the object that requires access checks 7540 // proxy object. Accessing the object that requires access checks
7528 // is blocked by the access checks on the object itself. 7541 // is blocked by the access checks on the object itself.
7529 value = CompileRun("Object.getOwnPropertyNames(other).length == 0"); 7542 value = CompileRun("Object.getOwnPropertyNames(other).length == 0");
7530 CHECK(value->IsTrue()); 7543 CHECK(value->IsTrue());
7531 7544
7532 value = CompileRun("Object.getOwnPropertyNames(object).length == 0"); 7545 value = CompileRun("Object.getOwnPropertyNames(object).length == 0");
7533 CHECK(value->IsTrue()); 7546 CHECK(value->IsTrue());
7534 7547
7535 context1->Exit(); 7548 context1->Exit();
7536 context0->Exit(); 7549 context0->Exit();
7537 context1.Dispose(); 7550 context1.Dispose(context1->GetIsolate());
7538 context0.Dispose(); 7551 context0.Dispose(context0->GetIsolate());
7539 } 7552 }
7540 7553
7541 7554
7542 static v8::Handle<v8::Array> NamedPropertyEnumerator(const AccessorInfo& info) { 7555 static v8::Handle<v8::Array> NamedPropertyEnumerator(const AccessorInfo& info) {
7543 v8::Handle<v8::Array> result = v8::Array::New(1); 7556 v8::Handle<v8::Array> result = v8::Array::New(1);
7544 result->Set(0, v8_str("x")); 7557 result->Set(0, v8_str("x"));
7545 return result; 7558 return result;
7546 } 7559 }
7547 7560
7548 7561
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
7611 // Should return 10, instead of 11 7624 // Should return 10, instead of 11
7612 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); 7625 v8::Handle<Value> value = v8_compile("other.accessible")->Run();
7613 CHECK(value->IsNumber()); 7626 CHECK(value->IsNumber());
7614 CHECK_EQ(10, value->Int32Value()); 7627 CHECK_EQ(10, value->Int32Value());
7615 7628
7616 value = v8_compile("other.unreachable")->Run(); 7629 value = v8_compile("other.unreachable")->Run();
7617 CHECK(value->IsUndefined()); 7630 CHECK(value->IsUndefined());
7618 7631
7619 context1->Exit(); 7632 context1->Exit();
7620 context0->Exit(); 7633 context0->Exit();
7621 context1.Dispose(); 7634 context1.Dispose(context1->GetIsolate());
7622 context0.Dispose(); 7635 context0.Dispose(context0->GetIsolate());
7623 } 7636 }
7624 7637
7625 7638
7626 static int named_access_count = 0; 7639 static int named_access_count = 0;
7627 static int indexed_access_count = 0; 7640 static int indexed_access_count = 0;
7628 7641
7629 static bool NamedAccessCounter(Local<v8::Object> global, 7642 static bool NamedAccessCounter(Local<v8::Object> global,
7630 Local<Value> name, 7643 Local<Value> name,
7631 v8::AccessType type, 7644 v8::AccessType type,
7632 Local<Value> data) { 7645 Local<Value> data) {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
7746 7759
7747 // Force the call inline cache into dictionary probing mode. 7760 // Force the call inline cache into dictionary probing mode.
7748 CompileRun("o.f = function() {}; testCallNormal(o)"); 7761 CompileRun("o.f = function() {}; testCallNormal(o)");
7749 // Test that the named access check is still called for each 7762 // Test that the named access check is still called for each
7750 // invocation of the function. 7763 // invocation of the function.
7751 value = CompileRun("testCallNormal(obj)"); 7764 value = CompileRun("testCallNormal(obj)");
7752 CHECK_EQ(106, named_access_count); 7765 CHECK_EQ(106, named_access_count);
7753 7766
7754 context1->Exit(); 7767 context1->Exit();
7755 context0->Exit(); 7768 context0->Exit();
7756 context1.Dispose(); 7769 context1.Dispose(context1->GetIsolate());
7757 context0.Dispose(); 7770 context0.Dispose(context0->GetIsolate());
7758 } 7771 }
7759 7772
7760 7773
7761 static bool NamedAccessFlatten(Local<v8::Object> global, 7774 static bool NamedAccessFlatten(Local<v8::Object> global,
7762 Local<Value> name, 7775 Local<Value> name,
7763 v8::AccessType type, 7776 v8::AccessType type,
7764 Local<Value> data) { 7777 Local<Value> data) {
7765 char buf[100]; 7778 char buf[100];
7766 int len; 7779 int len;
7767 7780
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
7821 v8::Handle<v8::Object> global1 = context1->Global(); 7834 v8::Handle<v8::Object> global1 = context1->Global();
7822 global1->Set(v8_str("obj"), object); 7835 global1->Set(v8_str("obj"), object);
7823 7836
7824 v8::Handle<Value> value; 7837 v8::Handle<Value> value;
7825 7838
7826 value = v8_compile("var p = 'as' + 'df';")->Run(); 7839 value = v8_compile("var p = 'as' + 'df';")->Run();
7827 value = v8_compile("obj[p];")->Run(); 7840 value = v8_compile("obj[p];")->Run();
7828 7841
7829 context1->Exit(); 7842 context1->Exit();
7830 context0->Exit(); 7843 context0->Exit();
7831 context1.Dispose(); 7844 context1.Dispose(context1->GetIsolate());
7832 context0.Dispose(); 7845 context0.Dispose(context0->GetIsolate());
7833 } 7846 }
7834 7847
7835 7848
7836 static v8::Handle<Value> AccessControlNamedGetter( 7849 static v8::Handle<Value> AccessControlNamedGetter(
7837 Local<String>, const AccessorInfo&) { 7850 Local<String>, const AccessorInfo&) {
7838 return v8::Integer::New(42); 7851 return v8::Integer::New(42);
7839 } 7852 }
7840 7853
7841 7854
7842 static v8::Handle<Value> AccessControlNamedSetter( 7855 static v8::Handle<Value> AccessControlNamedSetter(
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
7913 // time eventhough there is an interceptor on the object. 7926 // time eventhough there is an interceptor on the object.
7914 value = v8_compile("for (var i = 0; i < 10; i++) obj[0] = 1;")->Run(); 7927 value = v8_compile("for (var i = 0; i < 10; i++) obj[0] = 1;")->Run();
7915 value = v8_compile("for (var i = 0; i < 10; i++) obj[0];" 7928 value = v8_compile("for (var i = 0; i < 10; i++) obj[0];"
7916 "obj[0]")->Run(); 7929 "obj[0]")->Run();
7917 CHECK(value->IsNumber()); 7930 CHECK(value->IsNumber());
7918 CHECK_EQ(42, value->Int32Value()); 7931 CHECK_EQ(42, value->Int32Value());
7919 CHECK_EQ(21, indexed_access_count); 7932 CHECK_EQ(21, indexed_access_count);
7920 7933
7921 context1->Exit(); 7934 context1->Exit();
7922 context0->Exit(); 7935 context0->Exit();
7923 context1.Dispose(); 7936 context1.Dispose(context1->GetIsolate());
7924 context0.Dispose(); 7937 context0.Dispose(context0->GetIsolate());
7925 } 7938 }
7926 7939
7927 7940
7928 THREADED_TEST(Version) { 7941 THREADED_TEST(Version) {
7929 v8::V8::GetVersion(); 7942 v8::V8::GetVersion();
7930 } 7943 }
7931 7944
7932 7945
7933 static v8::Handle<Value> InstanceFunctionCallback(const v8::Arguments& args) { 7946 static v8::Handle<Value> InstanceFunctionCallback(const v8::Arguments& args) {
7934 ApiTestFuzzer::Fuzz(); 7947 ApiTestFuzzer::Fuzz();
(...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after
8804 context1->Global()->Set(v8_str("fun"), fun); 8817 context1->Global()->Set(v8_str("fun"), fun);
8805 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); 8818 v8::Handle<v8::Value> x_value = CompileRun("fun('x')");
8806 CHECK_EQ(42, x_value->Int32Value()); 8819 CHECK_EQ(42, x_value->Int32Value());
8807 context0->DetachGlobal(); 8820 context0->DetachGlobal();
8808 v8::TryCatch catcher; 8821 v8::TryCatch catcher;
8809 x_value = CompileRun("fun('x')"); 8822 x_value = CompileRun("fun('x')");
8810 CHECK(x_value.IsEmpty()); 8823 CHECK(x_value.IsEmpty());
8811 CHECK(catcher.HasCaught()); 8824 CHECK(catcher.HasCaught());
8812 context1->Exit(); 8825 context1->Exit();
8813 8826
8814 context1.Dispose(); 8827 context1.Dispose(context1->GetIsolate());
8815 context0.Dispose(); 8828 context0.Dispose(context0->GetIsolate());
8816 } 8829 }
8817 8830
8818 8831
8819 THREADED_TEST(CrossLazyLoad) { 8832 THREADED_TEST(CrossLazyLoad) {
8820 v8::HandleScope scope; 8833 v8::HandleScope scope;
8821 LocalContext other; 8834 LocalContext other;
8822 LocalContext current; 8835 LocalContext current;
8823 8836
8824 Local<String> token = v8_str("<security token>"); 8837 Local<String> token = v8_str("<security token>");
8825 other->SetSecurityToken(token); 8838 other->SetSecurityToken(token);
(...skipping 2496 matching lines...) Expand 10 before | Expand all | Expand 10 after
11322 } 11335 }
11323 v8::V8::ContextDisposedNotification(); 11336 v8::V8::ContextDisposedNotification();
11324 CheckSurvivingGlobalObjectsCount(0); 11337 CheckSurvivingGlobalObjectsCount(0);
11325 } 11338 }
11326 } 11339 }
11327 11340
11328 11341
11329 v8::Persistent<v8::Object> some_object; 11342 v8::Persistent<v8::Object> some_object;
11330 v8::Persistent<v8::Object> bad_handle; 11343 v8::Persistent<v8::Object> bad_handle;
11331 11344
11332 void NewPersistentHandleCallback(v8::Persistent<v8::Value> handle, void*) { 11345 void NewPersistentHandleCallback(v8::Isolate* isolate,
11346 v8::Persistent<v8::Value> handle,
11347 void*) {
11333 v8::HandleScope scope; 11348 v8::HandleScope scope;
11334 bad_handle = v8::Persistent<v8::Object>::New(some_object); 11349 bad_handle = v8::Persistent<v8::Object>::New(some_object);
11335 handle.Dispose(); 11350 handle.Dispose(isolate);
11336 } 11351 }
11337 11352
11338 11353
11339 THREADED_TEST(NewPersistentHandleFromWeakCallback) { 11354 THREADED_TEST(NewPersistentHandleFromWeakCallback) {
11340 LocalContext context; 11355 LocalContext context;
11341 11356
11342 v8::Persistent<v8::Object> handle1, handle2; 11357 v8::Persistent<v8::Object> handle1, handle2;
11343 { 11358 {
11344 v8::HandleScope scope; 11359 v8::HandleScope scope;
11345 some_object = v8::Persistent<v8::Object>::New(v8::Object::New()); 11360 some_object = v8::Persistent<v8::Object>::New(v8::Object::New());
11346 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); 11361 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New());
11347 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); 11362 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New());
11348 } 11363 }
11349 // Note: order is implementation dependent alas: currently 11364 // Note: order is implementation dependent alas: currently
11350 // global handle nodes are processed by PostGarbageCollectionProcessing 11365 // global handle nodes are processed by PostGarbageCollectionProcessing
11351 // in reverse allocation order, so if second allocated handle is deleted, 11366 // in reverse allocation order, so if second allocated handle is deleted,
11352 // weak callback of the first handle would be able to 'reallocate' it. 11367 // weak callback of the first handle would be able to 'reallocate' it.
11353 handle1.MakeWeak(NULL, NewPersistentHandleCallback); 11368 v8::Isolate* isolate = context->GetIsolate();
11354 handle2.Dispose(); 11369 handle1.MakeWeak(isolate, NULL, NewPersistentHandleCallback);
11370 handle2.Dispose(isolate);
11355 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 11371 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
11356 } 11372 }
11357 11373
11358 11374
11359 v8::Persistent<v8::Object> to_be_disposed; 11375 v8::Persistent<v8::Object> to_be_disposed;
11360 11376
11361 void DisposeAndForceGcCallback(v8::Persistent<v8::Value> handle, void*) { 11377 void DisposeAndForceGcCallback(v8::Isolate* isolate,
11362 to_be_disposed.Dispose(); 11378 v8::Persistent<v8::Value> handle,
11379 void*) {
11380 to_be_disposed.Dispose(isolate);
11363 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 11381 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
11364 handle.Dispose(); 11382 handle.Dispose(isolate);
11365 } 11383 }
11366 11384
11367 11385
11368 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { 11386 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) {
11369 LocalContext context; 11387 LocalContext context;
11370 11388
11371 v8::Persistent<v8::Object> handle1, handle2; 11389 v8::Persistent<v8::Object> handle1, handle2;
11372 { 11390 {
11373 v8::HandleScope scope; 11391 v8::HandleScope scope;
11374 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); 11392 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New());
11375 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); 11393 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New());
11376 } 11394 }
11377 handle1.MakeWeak(NULL, DisposeAndForceGcCallback); 11395 handle1.MakeWeak(context->GetIsolate(), NULL, DisposeAndForceGcCallback);
11378 to_be_disposed = handle2; 11396 to_be_disposed = handle2;
11379 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 11397 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
11380 } 11398 }
11381 11399
11382 void DisposingCallback(v8::Persistent<v8::Value> handle, void*) { 11400 void DisposingCallback(v8::Isolate* isolate,
11383 handle.Dispose(); 11401 v8::Persistent<v8::Value> handle,
11402 void*) {
11403 handle.Dispose(isolate);
11384 } 11404 }
11385 11405
11386 void HandleCreatingCallback(v8::Persistent<v8::Value> handle, void*) { 11406 void HandleCreatingCallback(v8::Isolate* isolate,
11407 v8::Persistent<v8::Value> handle,
11408 void*) {
11387 v8::HandleScope scope; 11409 v8::HandleScope scope;
11388 v8::Persistent<v8::Object>::New(v8::Object::New()); 11410 v8::Persistent<v8::Object>::New(v8::Object::New());
11389 handle.Dispose(); 11411 handle.Dispose(isolate);
11390 } 11412 }
11391 11413
11392 11414
11393 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { 11415 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) {
11394 LocalContext context; 11416 LocalContext context;
11417 v8::Isolate* isolate = context->GetIsolate();
11395 11418
11396 v8::Persistent<v8::Object> handle1, handle2, handle3; 11419 v8::Persistent<v8::Object> handle1, handle2, handle3;
11397 { 11420 {
11398 v8::HandleScope scope; 11421 v8::HandleScope scope;
11399 handle3 = v8::Persistent<v8::Object>::New(v8::Object::New()); 11422 handle3 = v8::Persistent<v8::Object>::New(v8::Object::New());
11400 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); 11423 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New());
11401 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); 11424 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New());
11402 } 11425 }
11403 handle2.MakeWeak(NULL, DisposingCallback); 11426 handle2.MakeWeak(isolate, NULL, DisposingCallback);
11404 handle3.MakeWeak(NULL, HandleCreatingCallback); 11427 handle3.MakeWeak(isolate, NULL, HandleCreatingCallback);
11405 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 11428 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
11406 } 11429 }
11407 11430
11408 11431
11409 THREADED_TEST(CheckForCrossContextObjectLiterals) { 11432 THREADED_TEST(CheckForCrossContextObjectLiterals) {
11410 v8::V8::Initialize(); 11433 v8::V8::Initialize();
11411 11434
11412 const int nof = 2; 11435 const int nof = 2;
11413 const char* sources[nof] = { 11436 const char* sources[nof] = {
11414 "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }", 11437 "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }",
(...skipping 25 matching lines...) Expand all
11440 11463
11441 11464
11442 THREADED_TEST(NestedHandleScopeAndContexts) { 11465 THREADED_TEST(NestedHandleScopeAndContexts) {
11443 v8::HandleScope outer; 11466 v8::HandleScope outer;
11444 v8::Persistent<Context> env = Context::New(); 11467 v8::Persistent<Context> env = Context::New();
11445 env->Enter(); 11468 env->Enter();
11446 v8::Handle<Value> value = NestedScope(env); 11469 v8::Handle<Value> value = NestedScope(env);
11447 v8::Handle<String> str(value->ToString()); 11470 v8::Handle<String> str(value->ToString());
11448 CHECK(!str.IsEmpty()); 11471 CHECK(!str.IsEmpty());
11449 env->Exit(); 11472 env->Exit();
11450 env.Dispose(); 11473 env.Dispose(env->GetIsolate());
11451 } 11474 }
11452 11475
11453 11476
11454 static i::Handle<i::JSFunction>* foo_ptr = NULL; 11477 static i::Handle<i::JSFunction>* foo_ptr = NULL;
11455 static int foo_count = 0; 11478 static int foo_count = 0;
11456 static i::Handle<i::JSFunction>* bar_ptr = NULL; 11479 static i::Handle<i::JSFunction>* bar_ptr = NULL;
11457 static int bar_count = 0; 11480 static int bar_count = 0;
11458 11481
11459 11482
11460 static void entry_hook(uintptr_t function, 11483 static void entry_hook(uintptr_t function,
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
11762 CHECK_EQ(cast(v8::V8::AdjustAmountOfExternalAllocatedMemory(-kSize)), 11785 CHECK_EQ(cast(v8::V8::AdjustAmountOfExternalAllocatedMemory(-kSize)),
11763 cast(0)); 11786 cast(0));
11764 } 11787 }
11765 11788
11766 11789
11767 THREADED_TEST(DisposeEnteredContext) { 11790 THREADED_TEST(DisposeEnteredContext) {
11768 v8::HandleScope scope; 11791 v8::HandleScope scope;
11769 LocalContext outer; 11792 LocalContext outer;
11770 { v8::Persistent<v8::Context> inner = v8::Context::New(); 11793 { v8::Persistent<v8::Context> inner = v8::Context::New();
11771 inner->Enter(); 11794 inner->Enter();
11772 inner.Dispose(); 11795 inner.Dispose(inner->GetIsolate());
11773 inner.Clear(); 11796 inner.Clear();
11774 inner->Exit(); 11797 inner->Exit();
11775 } 11798 }
11776 } 11799 }
11777 11800
11778 11801
11779 // Regression test for issue 54, object templates with internal fields 11802 // Regression test for issue 54, object templates with internal fields
11780 // but no accessors or interceptors did not get their internal field 11803 // but no accessors or interceptors did not get their internal field
11781 // count set on instances. 11804 // count set on instances.
11782 THREADED_TEST(Regress54) { 11805 THREADED_TEST(Regress54) {
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
12469 // Call the constructor function from context0 and check that the 12492 // Call the constructor function from context0 and check that the
12470 // result has the 'x' property. 12493 // result has the 'x' property.
12471 context1->Enter(); 12494 context1->Enter();
12472 context1->Global()->Set(v8_str("other"), context0->Global()); 12495 context1->Global()->Set(v8_str("other"), context0->Global());
12473 Local<Value> value = CompileRun("var instance = new other.C(); instance.x"); 12496 Local<Value> value = CompileRun("var instance = new other.C(); instance.x");
12474 CHECK(value->IsInt32()); 12497 CHECK(value->IsInt32());
12475 CHECK_EQ(42, value->Int32Value()); 12498 CHECK_EQ(42, value->Int32Value());
12476 context1->Exit(); 12499 context1->Exit();
12477 12500
12478 // Dispose the contexts to allow them to be garbage collected. 12501 // Dispose the contexts to allow them to be garbage collected.
12479 context0.Dispose(); 12502 context0.Dispose(context0->GetIsolate());
12480 context1.Dispose(); 12503 context1.Dispose(context1->GetIsolate());
12481 } 12504 }
12482 12505
12483 12506
12484 class RegExpInterruptTest { 12507 class RegExpInterruptTest {
12485 public: 12508 public:
12486 RegExpInterruptTest() : block_(NULL) {} 12509 RegExpInterruptTest() : block_(NULL) {}
12487 ~RegExpInterruptTest() { delete block_; } 12510 ~RegExpInterruptTest() { delete block_; }
12488 void RunTest() { 12511 void RunTest() {
12489 block_ = i::OS::CreateSemaphore(0); 12512 block_ = i::OS::CreateSemaphore(0);
12490 gc_count_ = 0; 12513 gc_count_ = 0;
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
13285 "(function() {" 13308 "(function() {"
13286 " try {" 13309 " try {"
13287 " return f();" 13310 " return f();"
13288 " } catch(e) {" 13311 " } catch(e) {"
13289 " return e.toString();" 13312 " return e.toString();"
13290 " }" 13313 " }"
13291 " })()", 13314 " })()",
13292 "ReferenceError: G is not defined"); 13315 "ReferenceError: G is not defined");
13293 ctx2->Exit(); 13316 ctx2->Exit();
13294 ctx1->Exit(); 13317 ctx1->Exit();
13295 ctx1.Dispose(); 13318 ctx1.Dispose(ctx1->GetIsolate());
13296 } 13319 }
13297 ctx2.Dispose(); 13320 ctx2.Dispose(ctx2->GetIsolate());
13298 } 13321 }
13299 13322
13300 13323
13301 v8::Persistent<Context> calling_context0; 13324 v8::Persistent<Context> calling_context0;
13302 v8::Persistent<Context> calling_context1; 13325 v8::Persistent<Context> calling_context1;
13303 v8::Persistent<Context> calling_context2; 13326 v8::Persistent<Context> calling_context2;
13304 13327
13305 13328
13306 // Check that the call to the callback is initiated in 13329 // Check that the call to the callback is initiated in
13307 // calling_context2, the directly calling context is calling_context1 13330 // calling_context2, the directly calling context is calling_context1
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
13346 13369
13347 // Expose context1 in context2 and call the callback function in 13370 // Expose context1 in context2 and call the callback function in
13348 // context0 indirectly through f in context1. 13371 // context0 indirectly through f in context1.
13349 calling_context2->Enter(); 13372 calling_context2->Enter();
13350 calling_context2->Global()->Set(v8_str("context1"), 13373 calling_context2->Global()->Set(v8_str("context1"),
13351 calling_context1->Global()); 13374 calling_context1->Global());
13352 CompileRun("context1.f()"); 13375 CompileRun("context1.f()");
13353 calling_context2->Exit(); 13376 calling_context2->Exit();
13354 13377
13355 // Dispose the contexts to allow them to be garbage collected. 13378 // Dispose the contexts to allow them to be garbage collected.
13356 calling_context0.Dispose(); 13379 calling_context0.Dispose(calling_context0->GetIsolate());
13357 calling_context1.Dispose(); 13380 calling_context1.Dispose(calling_context1->GetIsolate());
13358 calling_context2.Dispose(); 13381 calling_context2.Dispose(calling_context2->GetIsolate());
13359 calling_context0.Clear(); 13382 calling_context0.Clear();
13360 calling_context1.Clear(); 13383 calling_context1.Clear();
13361 calling_context2.Clear(); 13384 calling_context2.Clear();
13362 } 13385 }
13363 13386
13364 13387
13365 // Check that a variable declaration with no explicit initialization 13388 // Check that a variable declaration with no explicit initialization
13366 // value does shadow an existing property in the prototype chain. 13389 // value does shadow an existing property in the prototype chain.
13367 THREADED_TEST(InitGlobalVarInProtoChain) { 13390 THREADED_TEST(InitGlobalVarInProtoChain) {
13368 i::FLAG_es52_globals = true; 13391 i::FLAG_es52_globals = true;
(...skipping 1701 matching lines...) Expand 10 before | Expand all | Expand 10 after
15070 LocalContext env; 15093 LocalContext env;
15071 intptr_t initial_size = HEAP->SizeOfObjects(); 15094 intptr_t initial_size = HEAP->SizeOfObjects();
15072 // Send idle notification to start a round of incremental GCs. 15095 // Send idle notification to start a round of incremental GCs.
15073 v8::V8::IdleNotification(kShortIdlePauseInMs); 15096 v8::V8::IdleNotification(kShortIdlePauseInMs);
15074 // Emulate 7 page reloads. 15097 // Emulate 7 page reloads.
15075 for (int i = 0; i < 7; i++) { 15098 for (int i = 0; i < 7; i++) {
15076 v8::Persistent<v8::Context> ctx = v8::Context::New(); 15099 v8::Persistent<v8::Context> ctx = v8::Context::New();
15077 ctx->Enter(); 15100 ctx->Enter();
15078 CreateGarbageInOldSpace(); 15101 CreateGarbageInOldSpace();
15079 ctx->Exit(); 15102 ctx->Exit();
15080 ctx.Dispose(); 15103 ctx.Dispose(ctx->GetIsolate());
15081 v8::V8::ContextDisposedNotification(); 15104 v8::V8::ContextDisposedNotification();
15082 v8::V8::IdleNotification(kLongIdlePauseInMs); 15105 v8::V8::IdleNotification(kLongIdlePauseInMs);
15083 } 15106 }
15084 // Create garbage and check that idle notification still collects it. 15107 // Create garbage and check that idle notification still collects it.
15085 CreateGarbageInOldSpace(); 15108 CreateGarbageInOldSpace();
15086 intptr_t size_with_garbage = HEAP->SizeOfObjects(); 15109 intptr_t size_with_garbage = HEAP->SizeOfObjects();
15087 CHECK_GT(size_with_garbage, initial_size + MB); 15110 CHECK_GT(size_with_garbage, initial_size + MB);
15088 bool finished = false; 15111 bool finished = false;
15089 for (int i = 0; i < 200 && !finished; i++) { 15112 for (int i = 0; i < 200 && !finished; i++) {
15090 finished = v8::V8::IdleNotification(kShortIdlePauseInMs); 15113 finished = v8::V8::IdleNotification(kShortIdlePauseInMs);
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
15422 context = Context::New(); 15445 context = Context::New();
15423 { 15446 {
15424 v8::HandleScope scope; 15447 v8::HandleScope scope;
15425 15448
15426 context->Enter(); 15449 context->Enter();
15427 Local<v8::String> obj = v8::String::New(""); 15450 Local<v8::String> obj = v8::String::New("");
15428 context->SetEmbedderData(0, obj); 15451 context->SetEmbedderData(0, obj);
15429 CompileRun(source_simple); 15452 CompileRun(source_simple);
15430 context->Exit(); 15453 context->Exit();
15431 } 15454 }
15432 context.Dispose(); 15455 context.Dispose(context->GetIsolate());
15433 v8::V8::ContextDisposedNotification(); 15456 v8::V8::ContextDisposedNotification();
15434 for (gc_count = 1; gc_count < 10; gc_count++) { 15457 for (gc_count = 1; gc_count < 10; gc_count++) {
15435 other_context->Enter(); 15458 other_context->Enter();
15436 CompileRun(source_simple); 15459 CompileRun(source_simple);
15437 other_context->Exit(); 15460 other_context->Exit();
15438 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 15461 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
15439 if (GetGlobalObjectsCount() == 1) break; 15462 if (GetGlobalObjectsCount() == 1) break;
15440 } 15463 }
15441 CHECK_GE(2, gc_count); 15464 CHECK_GE(2, gc_count);
15442 CHECK_EQ(1, GetGlobalObjectsCount()); 15465 CHECK_EQ(1, GetGlobalObjectsCount());
15443 15466
15444 // Eval in a function creates reference from the compilation cache to the 15467 // Eval in a function creates reference from the compilation cache to the
15445 // global object. 15468 // global object.
15446 const char* source_eval = "function f(){eval('1')}; f()"; 15469 const char* source_eval = "function f(){eval('1')}; f()";
15447 context = Context::New(); 15470 context = Context::New();
15448 { 15471 {
15449 v8::HandleScope scope; 15472 v8::HandleScope scope;
15450 15473
15451 context->Enter(); 15474 context->Enter();
15452 CompileRun(source_eval); 15475 CompileRun(source_eval);
15453 context->Exit(); 15476 context->Exit();
15454 } 15477 }
15455 context.Dispose(); 15478 context.Dispose(context->GetIsolate());
15456 v8::V8::ContextDisposedNotification(); 15479 v8::V8::ContextDisposedNotification();
15457 for (gc_count = 1; gc_count < 10; gc_count++) { 15480 for (gc_count = 1; gc_count < 10; gc_count++) {
15458 other_context->Enter(); 15481 other_context->Enter();
15459 CompileRun(source_eval); 15482 CompileRun(source_eval);
15460 other_context->Exit(); 15483 other_context->Exit();
15461 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 15484 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
15462 if (GetGlobalObjectsCount() == 1) break; 15485 if (GetGlobalObjectsCount() == 1) break;
15463 } 15486 }
15464 CHECK_GE(2, gc_count); 15487 CHECK_GE(2, gc_count);
15465 CHECK_EQ(1, GetGlobalObjectsCount()); 15488 CHECK_EQ(1, GetGlobalObjectsCount());
15466 15489
15467 // Looking up the line number for an exception creates reference from the 15490 // Looking up the line number for an exception creates reference from the
15468 // compilation cache to the global object. 15491 // compilation cache to the global object.
15469 const char* source_exception = "function f(){throw 1;} f()"; 15492 const char* source_exception = "function f(){throw 1;} f()";
15470 context = Context::New(); 15493 context = Context::New();
15471 { 15494 {
15472 v8::HandleScope scope; 15495 v8::HandleScope scope;
15473 15496
15474 context->Enter(); 15497 context->Enter();
15475 v8::TryCatch try_catch; 15498 v8::TryCatch try_catch;
15476 CompileRun(source_exception); 15499 CompileRun(source_exception);
15477 CHECK(try_catch.HasCaught()); 15500 CHECK(try_catch.HasCaught());
15478 v8::Handle<v8::Message> message = try_catch.Message(); 15501 v8::Handle<v8::Message> message = try_catch.Message();
15479 CHECK(!message.IsEmpty()); 15502 CHECK(!message.IsEmpty());
15480 CHECK_EQ(1, message->GetLineNumber()); 15503 CHECK_EQ(1, message->GetLineNumber());
15481 context->Exit(); 15504 context->Exit();
15482 } 15505 }
15483 context.Dispose(); 15506 context.Dispose(context->GetIsolate());
15484 v8::V8::ContextDisposedNotification(); 15507 v8::V8::ContextDisposedNotification();
15485 for (gc_count = 1; gc_count < 10; gc_count++) { 15508 for (gc_count = 1; gc_count < 10; gc_count++) {
15486 other_context->Enter(); 15509 other_context->Enter();
15487 CompileRun(source_exception); 15510 CompileRun(source_exception);
15488 other_context->Exit(); 15511 other_context->Exit();
15489 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); 15512 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags);
15490 if (GetGlobalObjectsCount() == 1) break; 15513 if (GetGlobalObjectsCount() == 1) break;
15491 } 15514 }
15492 CHECK_GE(2, gc_count); 15515 CHECK_GE(2, gc_count);
15493 CHECK_EQ(1, GetGlobalObjectsCount()); 15516 CHECK_EQ(1, GetGlobalObjectsCount());
15494 15517
15495 other_context.Dispose(); 15518 other_context.Dispose(other_context->GetIsolate());
15496 v8::V8::ContextDisposedNotification(); 15519 v8::V8::ContextDisposedNotification();
15497 } 15520 }
15498 15521
15499 15522
15500 THREADED_TEST(ScriptOrigin) { 15523 THREADED_TEST(ScriptOrigin) {
15501 v8::HandleScope scope; 15524 v8::HandleScope scope;
15502 LocalContext env; 15525 LocalContext env;
15503 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); 15526 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test"));
15504 v8::Handle<v8::String> script = v8::String::New( 15527 v8::Handle<v8::String> script = v8::String::New(
15505 "function f() {}\n\nfunction g() {}"); 15528 "function f() {}\n\nfunction g() {}");
(...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after
16275 } 16298 }
16276 16299
16277 { 16300 {
16278 v8::Context::Scope cscope(context1); 16301 v8::Context::Scope cscope(context1);
16279 v8::HandleScope scope; 16302 v8::HandleScope scope;
16280 ExpectString("function f() { return foo; }; f()", "isolate 1"); 16303 ExpectString("function f() { return foo; }; f()", "isolate 1");
16281 } 16304 }
16282 16305
16283 { 16306 {
16284 v8::Isolate::Scope iscope(isolate2); 16307 v8::Isolate::Scope iscope(isolate2);
16285 context2.Dispose(); 16308 context2.Dispose(context2->GetIsolate());
16286 } 16309 }
16287 16310
16288 context1.Dispose(); 16311 context1.Dispose(context1->GetIsolate());
16289 isolate1->Exit(); 16312 isolate1->Exit();
16290 16313
16291 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 16314 v8::V8::SetFatalErrorHandler(StoringErrorCallback);
16292 last_location = last_message = NULL; 16315 last_location = last_message = NULL;
16293 16316
16294 isolate1->Dispose(); 16317 isolate1->Dispose();
16295 CHECK_EQ(last_location, NULL); 16318 CHECK_EQ(last_location, NULL);
16296 CHECK_EQ(last_message, NULL); 16319 CHECK_EQ(last_message, NULL);
16297 16320
16298 isolate2->Dispose(); 16321 isolate2->Dispose();
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
16652 public: 16675 public:
16653 explicit Visitor42(v8::Persistent<v8::Object> object) 16676 explicit Visitor42(v8::Persistent<v8::Object> object)
16654 : counter_(0), object_(object) { } 16677 : counter_(0), object_(object) { }
16655 16678
16656 virtual void VisitPersistentHandle(Persistent<Value> value, 16679 virtual void VisitPersistentHandle(Persistent<Value> value,
16657 uint16_t class_id) { 16680 uint16_t class_id) {
16658 if (class_id == 42) { 16681 if (class_id == 42) {
16659 CHECK(value->IsObject()); 16682 CHECK(value->IsObject());
16660 v8::Persistent<v8::Object> visited = 16683 v8::Persistent<v8::Object> visited =
16661 v8::Persistent<v8::Object>::Cast(value); 16684 v8::Persistent<v8::Object>::Cast(value);
16662 CHECK_EQ(42, visited.WrapperClassId()); 16685 CHECK_EQ(42, visited.WrapperClassId(v8::Isolate::GetCurrent()));
16663 CHECK_EQ(object_, visited); 16686 CHECK_EQ(object_, visited);
16664 ++counter_; 16687 ++counter_;
16665 } 16688 }
16666 } 16689 }
16667 16690
16668 int counter_; 16691 int counter_;
16669 v8::Persistent<v8::Object> object_; 16692 v8::Persistent<v8::Object> object_;
16670 }; 16693 };
16671 16694
16672 16695
16673 TEST(PersistentHandleVisitor) { 16696 TEST(PersistentHandleVisitor) {
16674 v8::HandleScope scope; 16697 v8::HandleScope scope;
16675 LocalContext context; 16698 LocalContext context;
16699 v8::Isolate* isolate = context->GetIsolate();
16676 v8::Persistent<v8::Object> object = 16700 v8::Persistent<v8::Object> object =
16677 v8::Persistent<v8::Object>::New(v8::Object::New()); 16701 v8::Persistent<v8::Object>::New(v8::Object::New());
16678 CHECK_EQ(0, object.WrapperClassId()); 16702 CHECK_EQ(0, object.WrapperClassId(isolate));
16679 object.SetWrapperClassId(42); 16703 object.SetWrapperClassId(42);
16680 CHECK_EQ(42, object.WrapperClassId()); 16704 CHECK_EQ(42, object.WrapperClassId(isolate));
16681 16705
16682 Visitor42 visitor(object); 16706 Visitor42 visitor(object);
16683 v8::V8::VisitHandlesWithClassIds(&visitor); 16707 v8::V8::VisitHandlesWithClassIds(&visitor);
16684 CHECK_EQ(1, visitor.counter_); 16708 CHECK_EQ(1, visitor.counter_);
16685 16709
16686 object.Dispose(); 16710 object.Dispose(isolate);
16687 } 16711 }
16688 16712
16689 16713
16690 TEST(WrapperClassId) { 16714 TEST(WrapperClassId) {
16691 v8::HandleScope scope; 16715 v8::HandleScope scope;
16692 LocalContext context; 16716 LocalContext context;
16717 v8::Isolate* isolate = context->GetIsolate();
16693 v8::Persistent<v8::Object> object = 16718 v8::Persistent<v8::Object> object =
16694 v8::Persistent<v8::Object>::New(v8::Object::New()); 16719 v8::Persistent<v8::Object>::New(v8::Object::New());
16695 CHECK_EQ(0, object.WrapperClassId()); 16720 CHECK_EQ(0, object.WrapperClassId(isolate));
16696 object.SetWrapperClassId(65535); 16721 object.SetWrapperClassId(65535);
16697 CHECK_EQ(65535, object.WrapperClassId()); 16722 CHECK_EQ(65535, object.WrapperClassId(isolate));
16698 object.Dispose(); 16723 object.Dispose(isolate);
16699 } 16724 }
16700 16725
16701 16726
16702 TEST(RegExp) { 16727 TEST(RegExp) {
16703 v8::HandleScope scope; 16728 v8::HandleScope scope;
16704 LocalContext context; 16729 LocalContext context;
16705 16730
16706 v8::Handle<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone); 16731 v8::Handle<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone);
16707 CHECK(re->IsRegExp()); 16732 CHECK(re->IsRegExp());
16708 CHECK(re->GetSource()->Equals(v8_str("foo"))); 16733 CHECK(re->GetSource()->Equals(v8_str("foo")));
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
16918 CHECK(instance1->CreationContext() == context1); 16943 CHECK(instance1->CreationContext() == context1);
16919 CheckContextId(instance1, 1); 16944 CheckContextId(instance1, 1);
16920 CHECK(object2->CreationContext() == context2); 16945 CHECK(object2->CreationContext() == context2);
16921 CheckContextId(object2, 2); 16946 CheckContextId(object2, 2);
16922 CHECK(func2->CreationContext() == context2); 16947 CHECK(func2->CreationContext() == context2);
16923 CheckContextId(func2, 2); 16948 CheckContextId(func2, 2);
16924 CHECK(instance2->CreationContext() == context2); 16949 CHECK(instance2->CreationContext() == context2);
16925 CheckContextId(instance2, 2); 16950 CheckContextId(instance2, 2);
16926 } 16951 }
16927 16952
16928 context1.Dispose(); 16953 context1.Dispose(context1->GetIsolate());
16929 context2.Dispose(); 16954 context2.Dispose(context2->GetIsolate());
16930 context3.Dispose(); 16955 context3.Dispose(context3->GetIsolate());
16931 } 16956 }
16932 16957
16933 16958
16934 THREADED_TEST(CreationContextOfJsFunction) { 16959 THREADED_TEST(CreationContextOfJsFunction) {
16935 HandleScope handle_scope; 16960 HandleScope handle_scope;
16936 Persistent<Context> context = Context::New(); 16961 Persistent<Context> context = Context::New();
16937 InstallContextId(context, 1); 16962 InstallContextId(context, 1);
16938 16963
16939 Local<Object> function; 16964 Local<Object> function;
16940 { 16965 {
16941 Context::Scope scope(context); 16966 Context::Scope scope(context);
16942 function = CompileRun("function foo() {}; foo").As<Object>(); 16967 function = CompileRun("function foo() {}; foo").As<Object>();
16943 } 16968 }
16944 16969
16945 CHECK(function->CreationContext() == context); 16970 CHECK(function->CreationContext() == context);
16946 CheckContextId(function, 1); 16971 CheckContextId(function, 1);
16947 16972
16948 context.Dispose(); 16973 context.Dispose(context->GetIsolate());
16949 } 16974 }
16950 16975
16951 16976
16952 Handle<Value> HasOwnPropertyIndexedPropertyGetter(uint32_t index, 16977 Handle<Value> HasOwnPropertyIndexedPropertyGetter(uint32_t index,
16953 const AccessorInfo& info) { 16978 const AccessorInfo& info) {
16954 if (index == 42) return v8_str("yes"); 16979 if (index == 42) return v8_str("yes");
16955 return Handle<v8::Integer>(); 16980 return Handle<v8::Integer>();
16956 } 16981 }
16957 16982
16958 16983
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
17314 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)"); 17339 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)");
17315 CHECK(result4->Equals(Undefined())); 17340 CHECK(result4->Equals(Undefined()));
17316 17341
17317 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)"); 17342 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)");
17318 CHECK(result5->Equals( 17343 CHECK(result5->Equals(
17319 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); 17344 object_with_hidden->GetPrototype()->ToObject()->GetPrototype()));
17320 17345
17321 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); 17346 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)");
17322 CHECK(result6->Equals(Undefined())); 17347 CHECK(result6->Equals(Undefined()));
17323 17348
17324 context.Dispose(); 17349 context.Dispose(context->GetIsolate());
17325 } 17350 }
17326 17351
17327 17352
17328 THREADED_TEST(Regress125988) { 17353 THREADED_TEST(Regress125988) {
17329 v8::HandleScope scope; 17354 v8::HandleScope scope;
17330 Handle<FunctionTemplate> intercept = FunctionTemplate::New(); 17355 Handle<FunctionTemplate> intercept = FunctionTemplate::New();
17331 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); 17356 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter);
17332 LocalContext env; 17357 LocalContext env;
17333 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); 17358 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction());
17334 CompileRun("var a = new Object();" 17359 CompileRun("var a = new Object();"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
17442 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/,func)[1]"))); 17467 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/,func)[1]")));
17443 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[1]"))); 17468 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[1]")));
17444 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[3]"))); 17469 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[3]")));
17445 17470
17446 // TODO(1547): Make the following also return "i". 17471 // TODO(1547): Make the following also return "i".
17447 // Calling with environment record as base. 17472 // Calling with environment record as base.
17448 TestReceiver(o, context->Global(), "func()"); 17473 TestReceiver(o, context->Global(), "func()");
17449 // Calling with no base. 17474 // Calling with no base.
17450 TestReceiver(o, context->Global(), "(1,func)()"); 17475 TestReceiver(o, context->Global(), "(1,func)()");
17451 17476
17452 foreign_context.Dispose(); 17477 foreign_context.Dispose(foreign_context->GetIsolate());
17453 } 17478 }
17454 17479
17455 17480
17456 uint8_t callback_fired = 0; 17481 uint8_t callback_fired = 0;
17457 17482
17458 17483
17459 void CallCompletedCallback1() { 17484 void CallCompletedCallback1() {
17460 i::OS::Print("Firing callback 1.\n"); 17485 i::OS::Print("Firing callback 1.\n");
17461 callback_fired ^= 1; // Toggle first bit. 17486 callback_fired ^= 1; // Toggle first bit.
17462 } 17487 }
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
18155 i::Semaphore* sem_; 18180 i::Semaphore* sem_;
18156 volatile int sem_value_; 18181 volatile int sem_value_;
18157 }; 18182 };
18158 18183
18159 18184
18160 THREADED_TEST(SemaphoreInterruption) { 18185 THREADED_TEST(SemaphoreInterruption) {
18161 ThreadInterruptTest().RunTest(); 18186 ThreadInterruptTest().RunTest();
18162 } 18187 }
18163 18188
18164 #endif // WIN32 18189 #endif // WIN32
OLDNEW
« src/global-handles.cc ('K') | « test/cctest/cctest.h ('k') | test/cctest/test-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698