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