OLD | NEW |
1 // Copyright 2007-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2009 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 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 LocalContext env; | 387 LocalContext env; |
388 TestResource* resource = new TestResource(two_byte_source); | 388 TestResource* resource = new TestResource(two_byte_source); |
389 Local<String> source = String::NewExternal(resource); | 389 Local<String> source = String::NewExternal(resource); |
390 Local<Script> script = Script::Compile(source); | 390 Local<Script> script = Script::Compile(source); |
391 Local<Value> value = script->Run(); | 391 Local<Value> value = script->Run(); |
392 CHECK(value->IsNumber()); | 392 CHECK(value->IsNumber()); |
393 CHECK_EQ(7, value->Int32Value()); | 393 CHECK_EQ(7, value->Int32Value()); |
394 CHECK(source->IsExternal()); | 394 CHECK(source->IsExternal()); |
395 CHECK_EQ(resource, | 395 CHECK_EQ(resource, |
396 static_cast<TestResource*>(source->GetExternalStringResource())); | 396 static_cast<TestResource*>(source->GetExternalStringResource())); |
397 i::Heap::CollectAllGarbage(false); | 397 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
398 CHECK_EQ(0, TestResource::dispose_count); | 398 CHECK_EQ(0, TestResource::dispose_count); |
399 } | 399 } |
400 i::CompilationCache::Clear(); | 400 i::CompilationCache::Clear(); |
401 i::Heap::CollectAllGarbage(false); | 401 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
402 CHECK_EQ(1, TestResource::dispose_count); | 402 CHECK_EQ(1, TestResource::dispose_count); |
403 } | 403 } |
404 | 404 |
405 | 405 |
406 THREADED_TEST(ScriptUsingAsciiStringResource) { | 406 THREADED_TEST(ScriptUsingAsciiStringResource) { |
407 TestAsciiResource::dispose_count = 0; | 407 TestAsciiResource::dispose_count = 0; |
408 const char* c_source = "1 + 2 * 3"; | 408 const char* c_source = "1 + 2 * 3"; |
409 { | 409 { |
410 v8::HandleScope scope; | 410 v8::HandleScope scope; |
411 LocalContext env; | 411 LocalContext env; |
412 Local<String> source = | 412 Local<String> source = |
413 String::NewExternal(new TestAsciiResource(i::StrDup(c_source))); | 413 String::NewExternal(new TestAsciiResource(i::StrDup(c_source))); |
414 Local<Script> script = Script::Compile(source); | 414 Local<Script> script = Script::Compile(source); |
415 Local<Value> value = script->Run(); | 415 Local<Value> value = script->Run(); |
416 CHECK(value->IsNumber()); | 416 CHECK(value->IsNumber()); |
417 CHECK_EQ(7, value->Int32Value()); | 417 CHECK_EQ(7, value->Int32Value()); |
418 i::Heap::CollectAllGarbage(false); | 418 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
419 CHECK_EQ(0, TestAsciiResource::dispose_count); | 419 CHECK_EQ(0, TestAsciiResource::dispose_count); |
420 } | 420 } |
421 i::CompilationCache::Clear(); | 421 i::CompilationCache::Clear(); |
422 i::Heap::CollectAllGarbage(false); | 422 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
423 CHECK_EQ(1, TestAsciiResource::dispose_count); | 423 CHECK_EQ(1, TestAsciiResource::dispose_count); |
424 } | 424 } |
425 | 425 |
426 | 426 |
427 THREADED_TEST(ScriptMakingExternalString) { | 427 THREADED_TEST(ScriptMakingExternalString) { |
428 TestResource::dispose_count = 0; | 428 TestResource::dispose_count = 0; |
429 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); | 429 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); |
430 { | 430 { |
431 v8::HandleScope scope; | 431 v8::HandleScope scope; |
432 LocalContext env; | 432 LocalContext env; |
433 Local<String> source = String::New(two_byte_source); | 433 Local<String> source = String::New(two_byte_source); |
434 // Trigger GCs so that the newly allocated string moves to old gen. | 434 // Trigger GCs so that the newly allocated string moves to old gen. |
435 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now | 435 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
436 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now | 436 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
437 bool success = source->MakeExternal(new TestResource(two_byte_source)); | 437 bool success = source->MakeExternal(new TestResource(two_byte_source)); |
438 CHECK(success); | 438 CHECK(success); |
439 Local<Script> script = Script::Compile(source); | 439 Local<Script> script = Script::Compile(source); |
440 Local<Value> value = script->Run(); | 440 Local<Value> value = script->Run(); |
441 CHECK(value->IsNumber()); | 441 CHECK(value->IsNumber()); |
442 CHECK_EQ(7, value->Int32Value()); | 442 CHECK_EQ(7, value->Int32Value()); |
443 i::Heap::CollectAllGarbage(false); | 443 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
444 CHECK_EQ(0, TestResource::dispose_count); | 444 CHECK_EQ(0, TestResource::dispose_count); |
445 } | 445 } |
446 i::CompilationCache::Clear(); | 446 i::CompilationCache::Clear(); |
447 i::Heap::CollectAllGarbage(false); | 447 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
448 CHECK_EQ(1, TestResource::dispose_count); | 448 CHECK_EQ(1, TestResource::dispose_count); |
449 } | 449 } |
450 | 450 |
451 | 451 |
452 THREADED_TEST(ScriptMakingExternalAsciiString) { | 452 THREADED_TEST(ScriptMakingExternalAsciiString) { |
453 TestAsciiResource::dispose_count = 0; | 453 TestAsciiResource::dispose_count = 0; |
454 const char* c_source = "1 + 2 * 3"; | 454 const char* c_source = "1 + 2 * 3"; |
455 { | 455 { |
456 v8::HandleScope scope; | 456 v8::HandleScope scope; |
457 LocalContext env; | 457 LocalContext env; |
458 Local<String> source = v8_str(c_source); | 458 Local<String> source = v8_str(c_source); |
459 // Trigger GCs so that the newly allocated string moves to old gen. | 459 // Trigger GCs so that the newly allocated string moves to old gen. |
460 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now | 460 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
461 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now | 461 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
462 bool success = source->MakeExternal( | 462 bool success = source->MakeExternal( |
463 new TestAsciiResource(i::StrDup(c_source))); | 463 new TestAsciiResource(i::StrDup(c_source))); |
464 CHECK(success); | 464 CHECK(success); |
465 Local<Script> script = Script::Compile(source); | 465 Local<Script> script = Script::Compile(source); |
466 Local<Value> value = script->Run(); | 466 Local<Value> value = script->Run(); |
467 CHECK(value->IsNumber()); | 467 CHECK(value->IsNumber()); |
468 CHECK_EQ(7, value->Int32Value()); | 468 CHECK_EQ(7, value->Int32Value()); |
469 i::Heap::CollectAllGarbage(false); | 469 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
470 CHECK_EQ(0, TestAsciiResource::dispose_count); | 470 CHECK_EQ(0, TestAsciiResource::dispose_count); |
471 } | 471 } |
472 i::CompilationCache::Clear(); | 472 i::CompilationCache::Clear(); |
473 i::Heap::CollectAllGarbage(false); | 473 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
474 CHECK_EQ(1, TestAsciiResource::dispose_count); | 474 CHECK_EQ(1, TestAsciiResource::dispose_count); |
475 } | 475 } |
476 | 476 |
477 | 477 |
478 TEST(MakingExternalStringConditions) { | 478 TEST(MakingExternalStringConditions) { |
479 v8::HandleScope scope; | 479 v8::HandleScope scope; |
480 LocalContext env; | 480 LocalContext env; |
481 | 481 |
482 // Free some space in the new space so that we can check freshness. | 482 // Free some space in the new space so that we can check freshness. |
483 i::Heap::CollectGarbage(i::NEW_SPACE); | 483 i::Heap::CollectGarbage(i::NEW_SPACE); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 564 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
565 Local<String> string = | 565 Local<String> string = |
566 String::NewExternal(new TestResource(two_byte_string)); | 566 String::NewExternal(new TestResource(two_byte_string)); |
567 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 567 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
568 // Trigger GCs so that the newly allocated string moves to old gen. | 568 // Trigger GCs so that the newly allocated string moves to old gen. |
569 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now | 569 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
570 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now | 570 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
571 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); | 571 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); |
572 CHECK(isymbol->IsSymbol()); | 572 CHECK(isymbol->IsSymbol()); |
573 } | 573 } |
574 i::Heap::CollectAllGarbage(false); | 574 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
575 i::Heap::CollectAllGarbage(false); | 575 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
576 } | 576 } |
577 | 577 |
578 | 578 |
579 THREADED_TEST(UsingExternalAsciiString) { | 579 THREADED_TEST(UsingExternalAsciiString) { |
580 { | 580 { |
581 v8::HandleScope scope; | 581 v8::HandleScope scope; |
582 const char* one_byte_string = "test string"; | 582 const char* one_byte_string = "test string"; |
583 Local<String> string = String::NewExternal( | 583 Local<String> string = String::NewExternal( |
584 new TestAsciiResource(i::StrDup(one_byte_string))); | 584 new TestAsciiResource(i::StrDup(one_byte_string))); |
585 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 585 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
586 // Trigger GCs so that the newly allocated string moves to old gen. | 586 // Trigger GCs so that the newly allocated string moves to old gen. |
587 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now | 587 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
588 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now | 588 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
589 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); | 589 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); |
590 CHECK(isymbol->IsSymbol()); | 590 CHECK(isymbol->IsSymbol()); |
591 } | 591 } |
592 i::Heap::CollectAllGarbage(false); | 592 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
593 i::Heap::CollectAllGarbage(false); | 593 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
594 } | 594 } |
595 | 595 |
596 | 596 |
597 THREADED_TEST(ScavengeExternalString) { | 597 THREADED_TEST(ScavengeExternalString) { |
598 TestResource::dispose_count = 0; | 598 TestResource::dispose_count = 0; |
599 bool in_new_space = false; | 599 bool in_new_space = false; |
600 { | 600 { |
601 v8::HandleScope scope; | 601 v8::HandleScope scope; |
602 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 602 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
603 Local<String> string = | 603 Local<String> string = |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 TestAsciiResourceWithDisposeControl::dispose_calls = 0; | 660 TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
661 TestAsciiResourceWithDisposeControl res_stack(i::StrDup(c_source), false); | 661 TestAsciiResourceWithDisposeControl res_stack(i::StrDup(c_source), false); |
662 { | 662 { |
663 v8::HandleScope scope; | 663 v8::HandleScope scope; |
664 LocalContext env; | 664 LocalContext env; |
665 Local<String> source = String::NewExternal(&res_stack); | 665 Local<String> source = String::NewExternal(&res_stack); |
666 Local<Script> script = Script::Compile(source); | 666 Local<Script> script = Script::Compile(source); |
667 Local<Value> value = script->Run(); | 667 Local<Value> value = script->Run(); |
668 CHECK(value->IsNumber()); | 668 CHECK(value->IsNumber()); |
669 CHECK_EQ(7, value->Int32Value()); | 669 CHECK_EQ(7, value->Int32Value()); |
670 i::Heap::CollectAllGarbage(false); | 670 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
671 CHECK_EQ(0, TestAsciiResource::dispose_count); | 671 CHECK_EQ(0, TestAsciiResource::dispose_count); |
672 } | 672 } |
673 i::CompilationCache::Clear(); | 673 i::CompilationCache::Clear(); |
674 i::Heap::CollectAllGarbage(false); | 674 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
675 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); | 675 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
676 CHECK_EQ(0, TestAsciiResource::dispose_count); | 676 CHECK_EQ(0, TestAsciiResource::dispose_count); |
677 | 677 |
678 // Use a heap allocated external string resource allocated object. | 678 // Use a heap allocated external string resource allocated object. |
679 TestAsciiResource::dispose_count = 0; | 679 TestAsciiResource::dispose_count = 0; |
680 TestAsciiResourceWithDisposeControl::dispose_calls = 0; | 680 TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
681 TestAsciiResource* res_heap = | 681 TestAsciiResource* res_heap = |
682 new TestAsciiResourceWithDisposeControl(i::StrDup(c_source), true); | 682 new TestAsciiResourceWithDisposeControl(i::StrDup(c_source), true); |
683 { | 683 { |
684 v8::HandleScope scope; | 684 v8::HandleScope scope; |
685 LocalContext env; | 685 LocalContext env; |
686 Local<String> source = String::NewExternal(res_heap); | 686 Local<String> source = String::NewExternal(res_heap); |
687 Local<Script> script = Script::Compile(source); | 687 Local<Script> script = Script::Compile(source); |
688 Local<Value> value = script->Run(); | 688 Local<Value> value = script->Run(); |
689 CHECK(value->IsNumber()); | 689 CHECK(value->IsNumber()); |
690 CHECK_EQ(7, value->Int32Value()); | 690 CHECK_EQ(7, value->Int32Value()); |
691 i::Heap::CollectAllGarbage(false); | 691 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
692 CHECK_EQ(0, TestAsciiResource::dispose_count); | 692 CHECK_EQ(0, TestAsciiResource::dispose_count); |
693 } | 693 } |
694 i::CompilationCache::Clear(); | 694 i::CompilationCache::Clear(); |
695 i::Heap::CollectAllGarbage(false); | 695 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
696 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); | 696 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
697 CHECK_EQ(1, TestAsciiResource::dispose_count); | 697 CHECK_EQ(1, TestAsciiResource::dispose_count); |
698 } | 698 } |
699 | 699 |
700 | 700 |
701 THREADED_TEST(StringConcat) { | 701 THREADED_TEST(StringConcat) { |
702 { | 702 { |
703 v8::HandleScope scope; | 703 v8::HandleScope scope; |
704 LocalContext env; | 704 LocalContext env; |
705 const char* one_byte_string_1 = "function a_times_t"; | 705 const char* one_byte_string_1 = "function a_times_t"; |
(...skipping 26 matching lines...) Expand all Loading... |
732 source = String::Concat(source, right); | 732 source = String::Concat(source, right); |
733 right = String::NewExternal( | 733 right = String::NewExternal( |
734 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); | 734 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); |
735 source = String::Concat(source, right); | 735 source = String::Concat(source, right); |
736 Local<Script> script = Script::Compile(source); | 736 Local<Script> script = Script::Compile(source); |
737 Local<Value> value = script->Run(); | 737 Local<Value> value = script->Run(); |
738 CHECK(value->IsNumber()); | 738 CHECK(value->IsNumber()); |
739 CHECK_EQ(68, value->Int32Value()); | 739 CHECK_EQ(68, value->Int32Value()); |
740 } | 740 } |
741 i::CompilationCache::Clear(); | 741 i::CompilationCache::Clear(); |
742 i::Heap::CollectAllGarbage(false); | 742 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
743 i::Heap::CollectAllGarbage(false); | 743 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
744 } | 744 } |
745 | 745 |
746 | 746 |
747 THREADED_TEST(GlobalProperties) { | 747 THREADED_TEST(GlobalProperties) { |
748 v8::HandleScope scope; | 748 v8::HandleScope scope; |
749 LocalContext env; | 749 LocalContext env; |
750 v8::Handle<v8::Object> global = env->Global(); | 750 v8::Handle<v8::Object> global = env->Global(); |
751 global->Set(v8_str("pi"), v8_num(3.1415926)); | 751 global->Set(v8_str("pi"), v8_num(3.1415926)); |
752 Local<Value> pi = global->Get(v8_str("pi")); | 752 Local<Value> pi = global->Get(v8_str("pi")); |
753 CHECK_EQ(3.1415926, pi->NumberValue()); | 753 CHECK_EQ(3.1415926, pi->NumberValue()); |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1568 | 1568 |
1569 char* data = new char[100]; | 1569 char* data = new char[100]; |
1570 | 1570 |
1571 void* aligned = data; | 1571 void* aligned = data; |
1572 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(aligned) & 0x1)); | 1572 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(aligned) & 0x1)); |
1573 void* unaligned = data + 1; | 1573 void* unaligned = data + 1; |
1574 CHECK_EQ(1, static_cast<int>(reinterpret_cast<uintptr_t>(unaligned) & 0x1)); | 1574 CHECK_EQ(1, static_cast<int>(reinterpret_cast<uintptr_t>(unaligned) & 0x1)); |
1575 | 1575 |
1576 // Check reading and writing aligned pointers. | 1576 // Check reading and writing aligned pointers. |
1577 obj->SetPointerInInternalField(0, aligned); | 1577 obj->SetPointerInInternalField(0, aligned); |
1578 i::Heap::CollectAllGarbage(false); | 1578 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1579 CHECK_EQ(aligned, obj->GetPointerFromInternalField(0)); | 1579 CHECK_EQ(aligned, obj->GetPointerFromInternalField(0)); |
1580 | 1580 |
1581 // Check reading and writing unaligned pointers. | 1581 // Check reading and writing unaligned pointers. |
1582 obj->SetPointerInInternalField(0, unaligned); | 1582 obj->SetPointerInInternalField(0, unaligned); |
1583 i::Heap::CollectAllGarbage(false); | 1583 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1584 CHECK_EQ(unaligned, obj->GetPointerFromInternalField(0)); | 1584 CHECK_EQ(unaligned, obj->GetPointerFromInternalField(0)); |
1585 | 1585 |
1586 delete[] data; | 1586 delete[] data; |
1587 } | 1587 } |
1588 | 1588 |
1589 | 1589 |
1590 THREADED_TEST(InternalFieldsNativePointersAndExternal) { | 1590 THREADED_TEST(InternalFieldsNativePointersAndExternal) { |
1591 v8::HandleScope scope; | 1591 v8::HandleScope scope; |
1592 LocalContext env; | 1592 LocalContext env; |
1593 | 1593 |
1594 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 1594 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); |
1595 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 1595 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
1596 instance_templ->SetInternalFieldCount(1); | 1596 instance_templ->SetInternalFieldCount(1); |
1597 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); | 1597 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); |
1598 CHECK_EQ(1, obj->InternalFieldCount()); | 1598 CHECK_EQ(1, obj->InternalFieldCount()); |
1599 CHECK(obj->GetPointerFromInternalField(0) == NULL); | 1599 CHECK(obj->GetPointerFromInternalField(0) == NULL); |
1600 | 1600 |
1601 char* data = new char[100]; | 1601 char* data = new char[100]; |
1602 | 1602 |
1603 void* aligned = data; | 1603 void* aligned = data; |
1604 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(aligned) & 0x1)); | 1604 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(aligned) & 0x1)); |
1605 void* unaligned = data + 1; | 1605 void* unaligned = data + 1; |
1606 CHECK_EQ(1, static_cast<int>(reinterpret_cast<uintptr_t>(unaligned) & 0x1)); | 1606 CHECK_EQ(1, static_cast<int>(reinterpret_cast<uintptr_t>(unaligned) & 0x1)); |
1607 | 1607 |
1608 obj->SetPointerInInternalField(0, aligned); | 1608 obj->SetPointerInInternalField(0, aligned); |
1609 i::Heap::CollectAllGarbage(false); | 1609 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1610 CHECK_EQ(aligned, v8::External::Unwrap(obj->GetInternalField(0))); | 1610 CHECK_EQ(aligned, v8::External::Unwrap(obj->GetInternalField(0))); |
1611 | 1611 |
1612 obj->SetPointerInInternalField(0, unaligned); | 1612 obj->SetPointerInInternalField(0, unaligned); |
1613 i::Heap::CollectAllGarbage(false); | 1613 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1614 CHECK_EQ(unaligned, v8::External::Unwrap(obj->GetInternalField(0))); | 1614 CHECK_EQ(unaligned, v8::External::Unwrap(obj->GetInternalField(0))); |
1615 | 1615 |
1616 obj->SetInternalField(0, v8::External::Wrap(aligned)); | 1616 obj->SetInternalField(0, v8::External::Wrap(aligned)); |
1617 i::Heap::CollectAllGarbage(false); | 1617 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1618 CHECK_EQ(aligned, obj->GetPointerFromInternalField(0)); | 1618 CHECK_EQ(aligned, obj->GetPointerFromInternalField(0)); |
1619 | 1619 |
1620 obj->SetInternalField(0, v8::External::Wrap(unaligned)); | 1620 obj->SetInternalField(0, v8::External::Wrap(unaligned)); |
1621 i::Heap::CollectAllGarbage(false); | 1621 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1622 CHECK_EQ(unaligned, obj->GetPointerFromInternalField(0)); | 1622 CHECK_EQ(unaligned, obj->GetPointerFromInternalField(0)); |
1623 | 1623 |
1624 delete[] data; | 1624 delete[] data; |
1625 } | 1625 } |
1626 | 1626 |
1627 | 1627 |
1628 THREADED_TEST(IdentityHash) { | 1628 THREADED_TEST(IdentityHash) { |
1629 v8::HandleScope scope; | 1629 v8::HandleScope scope; |
1630 LocalContext env; | 1630 LocalContext env; |
1631 | 1631 |
1632 // Ensure that the test starts with an fresh heap to test whether the hash | 1632 // Ensure that the test starts with an fresh heap to test whether the hash |
1633 // code is based on the address. | 1633 // code is based on the address. |
1634 i::Heap::CollectAllGarbage(false); | 1634 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1635 Local<v8::Object> obj = v8::Object::New(); | 1635 Local<v8::Object> obj = v8::Object::New(); |
1636 int hash = obj->GetIdentityHash(); | 1636 int hash = obj->GetIdentityHash(); |
1637 int hash1 = obj->GetIdentityHash(); | 1637 int hash1 = obj->GetIdentityHash(); |
1638 CHECK_EQ(hash, hash1); | 1638 CHECK_EQ(hash, hash1); |
1639 int hash2 = v8::Object::New()->GetIdentityHash(); | 1639 int hash2 = v8::Object::New()->GetIdentityHash(); |
1640 // Since the identity hash is essentially a random number two consecutive | 1640 // Since the identity hash is essentially a random number two consecutive |
1641 // objects should not be assigned the same hash code. If the test below fails | 1641 // objects should not be assigned the same hash code. If the test below fails |
1642 // the random number generator should be evaluated. | 1642 // the random number generator should be evaluated. |
1643 CHECK_NE(hash, hash2); | 1643 CHECK_NE(hash, hash2); |
1644 i::Heap::CollectAllGarbage(false); | 1644 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1645 int hash3 = v8::Object::New()->GetIdentityHash(); | 1645 int hash3 = v8::Object::New()->GetIdentityHash(); |
1646 // Make sure that the identity hash is not based on the initial address of | 1646 // Make sure that the identity hash is not based on the initial address of |
1647 // the object alone. If the test below fails the random number generator | 1647 // the object alone. If the test below fails the random number generator |
1648 // should be evaluated. | 1648 // should be evaluated. |
1649 CHECK_NE(hash, hash3); | 1649 CHECK_NE(hash, hash3); |
1650 int hash4 = obj->GetIdentityHash(); | 1650 int hash4 = obj->GetIdentityHash(); |
1651 CHECK_EQ(hash, hash4); | 1651 CHECK_EQ(hash, hash4); |
1652 | 1652 |
1653 // Check identity hashes behaviour in the presence of JS accessors. | 1653 // Check identity hashes behaviour in the presence of JS accessors. |
1654 // Put a getter for 'v8::IdentityHash' on the Object's prototype: | 1654 // Put a getter for 'v8::IdentityHash' on the Object's prototype: |
(...skipping 16 matching lines...) Expand all Loading... |
1671 | 1671 |
1672 THREADED_TEST(HiddenProperties) { | 1672 THREADED_TEST(HiddenProperties) { |
1673 v8::HandleScope scope; | 1673 v8::HandleScope scope; |
1674 LocalContext env; | 1674 LocalContext env; |
1675 | 1675 |
1676 v8::Local<v8::Object> obj = v8::Object::New(); | 1676 v8::Local<v8::Object> obj = v8::Object::New(); |
1677 v8::Local<v8::String> key = v8_str("api-test::hidden-key"); | 1677 v8::Local<v8::String> key = v8_str("api-test::hidden-key"); |
1678 v8::Local<v8::String> empty = v8_str(""); | 1678 v8::Local<v8::String> empty = v8_str(""); |
1679 v8::Local<v8::String> prop_name = v8_str("prop_name"); | 1679 v8::Local<v8::String> prop_name = v8_str("prop_name"); |
1680 | 1680 |
1681 i::Heap::CollectAllGarbage(false); | 1681 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1682 | 1682 |
1683 // Make sure delete of a non-existent hidden value works | 1683 // Make sure delete of a non-existent hidden value works |
1684 CHECK(obj->DeleteHiddenValue(key)); | 1684 CHECK(obj->DeleteHiddenValue(key)); |
1685 | 1685 |
1686 CHECK(obj->SetHiddenValue(key, v8::Integer::New(1503))); | 1686 CHECK(obj->SetHiddenValue(key, v8::Integer::New(1503))); |
1687 CHECK_EQ(1503, obj->GetHiddenValue(key)->Int32Value()); | 1687 CHECK_EQ(1503, obj->GetHiddenValue(key)->Int32Value()); |
1688 CHECK(obj->SetHiddenValue(key, v8::Integer::New(2002))); | 1688 CHECK(obj->SetHiddenValue(key, v8::Integer::New(2002))); |
1689 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 1689 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); |
1690 | 1690 |
1691 i::Heap::CollectAllGarbage(false); | 1691 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1692 | 1692 |
1693 // Make sure we do not find the hidden property. | 1693 // Make sure we do not find the hidden property. |
1694 CHECK(!obj->Has(empty)); | 1694 CHECK(!obj->Has(empty)); |
1695 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 1695 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); |
1696 CHECK(obj->Get(empty)->IsUndefined()); | 1696 CHECK(obj->Get(empty)->IsUndefined()); |
1697 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 1697 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); |
1698 CHECK(obj->Set(empty, v8::Integer::New(2003))); | 1698 CHECK(obj->Set(empty, v8::Integer::New(2003))); |
1699 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 1699 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); |
1700 CHECK_EQ(2003, obj->Get(empty)->Int32Value()); | 1700 CHECK_EQ(2003, obj->Get(empty)->Int32Value()); |
1701 | 1701 |
1702 i::Heap::CollectAllGarbage(false); | 1702 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1703 | 1703 |
1704 // Add another property and delete it afterwards to force the object in | 1704 // Add another property and delete it afterwards to force the object in |
1705 // slow case. | 1705 // slow case. |
1706 CHECK(obj->Set(prop_name, v8::Integer::New(2008))); | 1706 CHECK(obj->Set(prop_name, v8::Integer::New(2008))); |
1707 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 1707 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); |
1708 CHECK_EQ(2008, obj->Get(prop_name)->Int32Value()); | 1708 CHECK_EQ(2008, obj->Get(prop_name)->Int32Value()); |
1709 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 1709 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); |
1710 CHECK(obj->Delete(prop_name)); | 1710 CHECK(obj->Delete(prop_name)); |
1711 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); | 1711 CHECK_EQ(2002, obj->GetHiddenValue(key)->Int32Value()); |
1712 | 1712 |
1713 i::Heap::CollectAllGarbage(false); | 1713 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
1714 | 1714 |
1715 CHECK(obj->DeleteHiddenValue(key)); | 1715 CHECK(obj->DeleteHiddenValue(key)); |
1716 CHECK(obj->GetHiddenValue(key).IsEmpty()); | 1716 CHECK(obj->GetHiddenValue(key).IsEmpty()); |
1717 } | 1717 } |
1718 | 1718 |
1719 | 1719 |
1720 static bool interceptor_for_hidden_properties_called; | 1720 static bool interceptor_for_hidden_properties_called; |
1721 static v8::Handle<Value> InterceptorForHiddenProperties( | 1721 static v8::Handle<Value> InterceptorForHiddenProperties( |
1722 Local<String> name, const AccessorInfo& info) { | 1722 Local<String> name, const AccessorInfo& info) { |
1723 interceptor_for_hidden_properties_called = true; | 1723 interceptor_for_hidden_properties_called = true; |
(...skipping 2511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4235 object_b = v8::Persistent<v8::Object>::New(v8::Object::New()); | 4235 object_b = v8::Persistent<v8::Object>::New(v8::Object::New()); |
4236 object_a = v8::Persistent<v8::Object>::New(v8::Object::New()); | 4236 object_a = v8::Persistent<v8::Object>::New(v8::Object::New()); |
4237 } | 4237 } |
4238 | 4238 |
4239 bool object_a_disposed = false; | 4239 bool object_a_disposed = false; |
4240 object_a.MakeWeak(&object_a_disposed, &ForceScavenge); | 4240 object_a.MakeWeak(&object_a_disposed, &ForceScavenge); |
4241 bool released_in_scavenge = false; | 4241 bool released_in_scavenge = false; |
4242 object_b.MakeWeak(&released_in_scavenge, &CheckIsNotInvokedInScavenge); | 4242 object_b.MakeWeak(&released_in_scavenge, &CheckIsNotInvokedInScavenge); |
4243 | 4243 |
4244 while (!object_a_disposed) { | 4244 while (!object_a_disposed) { |
4245 i::Heap::CollectAllGarbage(false); | 4245 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
4246 } | 4246 } |
4247 CHECK(!released_in_scavenge); | 4247 CHECK(!released_in_scavenge); |
4248 } | 4248 } |
4249 | 4249 |
4250 | 4250 |
4251 v8::Handle<Function> args_fun; | 4251 v8::Handle<Function> args_fun; |
4252 | 4252 |
4253 | 4253 |
4254 static v8::Handle<Value> ArgumentsTestCallback(const v8::Arguments& args) { | 4254 static v8::Handle<Value> ArgumentsTestCallback(const v8::Arguments& args) { |
4255 ApiTestFuzzer::Fuzz(); | 4255 ApiTestFuzzer::Fuzz(); |
4256 CHECK_EQ(args_fun, args.Callee()); | 4256 CHECK_EQ(args_fun, args.Callee()); |
4257 CHECK_EQ(3, args.Length()); | 4257 CHECK_EQ(3, args.Length()); |
4258 CHECK_EQ(v8::Integer::New(1), args[0]); | 4258 CHECK_EQ(v8::Integer::New(1), args[0]); |
4259 CHECK_EQ(v8::Integer::New(2), args[1]); | 4259 CHECK_EQ(v8::Integer::New(2), args[1]); |
4260 CHECK_EQ(v8::Integer::New(3), args[2]); | 4260 CHECK_EQ(v8::Integer::New(3), args[2]); |
4261 CHECK_EQ(v8::Undefined(), args[3]); | 4261 CHECK_EQ(v8::Undefined(), args[3]); |
4262 v8::HandleScope scope; | 4262 v8::HandleScope scope; |
4263 i::Heap::CollectAllGarbage(false); | 4263 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
4264 return v8::Undefined(); | 4264 return v8::Undefined(); |
4265 } | 4265 } |
4266 | 4266 |
4267 | 4267 |
4268 THREADED_TEST(Arguments) { | 4268 THREADED_TEST(Arguments) { |
4269 v8::HandleScope scope; | 4269 v8::HandleScope scope; |
4270 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); | 4270 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); |
4271 global->Set(v8_str("f"), v8::FunctionTemplate::New(ArgumentsTestCallback)); | 4271 global->Set(v8_str("f"), v8::FunctionTemplate::New(ArgumentsTestCallback)); |
4272 LocalContext context(NULL, global); | 4272 LocalContext context(NULL, global); |
4273 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); | 4273 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); |
(...skipping 2602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6876 "var p = new constructor();" | 6876 "var p = new constructor();" |
6877 "p.hasOwnProperty('ostehaps');"); | 6877 "p.hasOwnProperty('ostehaps');"); |
6878 CHECK_EQ(false, value->BooleanValue()); | 6878 CHECK_EQ(false, value->BooleanValue()); |
6879 } | 6879 } |
6880 | 6880 |
6881 | 6881 |
6882 static v8::Handle<Value> InterceptorHasOwnPropertyGetterGC( | 6882 static v8::Handle<Value> InterceptorHasOwnPropertyGetterGC( |
6883 Local<String> name, | 6883 Local<String> name, |
6884 const AccessorInfo& info) { | 6884 const AccessorInfo& info) { |
6885 ApiTestFuzzer::Fuzz(); | 6885 ApiTestFuzzer::Fuzz(); |
6886 i::Heap::CollectAllGarbage(false); | 6886 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
6887 return v8::Handle<Value>(); | 6887 return v8::Handle<Value>(); |
6888 } | 6888 } |
6889 | 6889 |
6890 | 6890 |
6891 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { | 6891 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { |
6892 v8::HandleScope scope; | 6892 v8::HandleScope scope; |
6893 LocalContext context; | 6893 LocalContext context; |
6894 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 6894 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
6895 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); | 6895 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); |
6896 instance_templ->SetNamedPropertyHandler(InterceptorHasOwnPropertyGetterGC); | 6896 instance_templ->SetNamedPropertyHandler(InterceptorHasOwnPropertyGetterGC); |
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7606 "};"); | 7606 "};"); |
7607 CHECK_EQ(239 * 10, value->Int32Value()); | 7607 CHECK_EQ(239 * 10, value->Int32Value()); |
7608 } | 7608 } |
7609 | 7609 |
7610 static v8::Handle<Value> InterceptorCallICFastApi(Local<String> name, | 7610 static v8::Handle<Value> InterceptorCallICFastApi(Local<String> name, |
7611 const AccessorInfo& info) { | 7611 const AccessorInfo& info) { |
7612 ApiTestFuzzer::Fuzz(); | 7612 ApiTestFuzzer::Fuzz(); |
7613 int* call_count = reinterpret_cast<int*>(v8::External::Unwrap(info.Data())); | 7613 int* call_count = reinterpret_cast<int*>(v8::External::Unwrap(info.Data())); |
7614 ++(*call_count); | 7614 ++(*call_count); |
7615 if ((*call_count) % 20 == 0) { | 7615 if ((*call_count) % 20 == 0) { |
7616 i::Heap::CollectAllGarbage(true); | 7616 i::Heap::CollectAllGarbage(i::Heap::kForceCompactionMask); |
7617 } | 7617 } |
7618 return v8::Handle<Value>(); | 7618 return v8::Handle<Value>(); |
7619 } | 7619 } |
7620 | 7620 |
7621 static v8::Handle<Value> FastApiCallback_TrivialSignature( | 7621 static v8::Handle<Value> FastApiCallback_TrivialSignature( |
7622 const v8::Arguments& args) { | 7622 const v8::Arguments& args) { |
7623 ApiTestFuzzer::Fuzz(); | 7623 ApiTestFuzzer::Fuzz(); |
7624 CHECK_EQ(args.This(), args.Holder()); | 7624 CHECK_EQ(args.This(), args.Holder()); |
7625 CHECK(args.Data()->Equals(v8_str("method_data"))); | 7625 CHECK(args.Data()->Equals(v8_str("method_data"))); |
7626 return v8::Integer::New(args[0]->Int32Value() + 1); | 7626 return v8::Integer::New(args[0]->Int32Value() + 1); |
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8822 Local<Script> script = v8_compile("(function () {" | 8822 Local<Script> script = v8_compile("(function () {" |
8823 " unlock_for_a_moment();" | 8823 " unlock_for_a_moment();" |
8824 " return 42;" | 8824 " return 42;" |
8825 "})();"); | 8825 "})();"); |
8826 CHECK_EQ(42, script->Run()->Int32Value()); | 8826 CHECK_EQ(42, script->Run()->Int32Value()); |
8827 } | 8827 } |
8828 } | 8828 } |
8829 | 8829 |
8830 | 8830 |
8831 static int GetGlobalObjectsCount() { | 8831 static int GetGlobalObjectsCount() { |
| 8832 i::Heap::EnsureHeapIsIterable(); |
8832 int count = 0; | 8833 int count = 0; |
8833 i::HeapIterator it; | 8834 i::HeapIterator it; |
8834 for (i::HeapObject* object = it.next(); object != NULL; object = it.next()) | 8835 for (i::HeapObject* object = it.Next(); object != NULL; object = it.Next()) |
8835 if (object->IsJSGlobalObject()) count++; | 8836 if (object->IsJSGlobalObject()) count++; |
8836 return count; | 8837 return count; |
8837 } | 8838 } |
8838 | 8839 |
8839 | 8840 |
8840 static void CheckSurvivingGlobalObjectsCount(int expected) { | 8841 static void CheckSurvivingGlobalObjectsCount(int expected) { |
8841 // We need to collect all garbage twice to be sure that everything | 8842 // We need to collect all garbage twice to be sure that everything |
8842 // has been collected. This is because inline caches are cleared in | 8843 // has been collected. This is because inline caches are cleared in |
8843 // the first garbage collection but some of the maps have already | 8844 // the first garbage collection but some of the maps have already |
8844 // been marked at that point. Therefore some of the maps are not | 8845 // been marked at that point. Therefore some of the maps are not |
8845 // collected until the second garbage collection. | 8846 // collected until the second garbage collection. |
8846 i::Heap::CollectAllGarbage(false); | 8847 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
8847 i::Heap::CollectAllGarbage(false); | 8848 i::Heap::CollectAllGarbage(i::Heap::kMakeHeapIterableMask); |
8848 int count = GetGlobalObjectsCount(); | 8849 int count = GetGlobalObjectsCount(); |
8849 #ifdef DEBUG | 8850 #ifdef DEBUG |
8850 if (count != expected) i::Heap::TracePathToGlobal(); | 8851 if (count != expected) i::Heap::TracePathToGlobal(); |
8851 #endif | 8852 #endif |
8852 CHECK_EQ(expected, count); | 8853 CHECK_EQ(expected, count); |
8853 } | 8854 } |
8854 | 8855 |
8855 | 8856 |
8856 TEST(DontLeakGlobalObjects) { | 8857 TEST(DontLeakGlobalObjects) { |
8857 // Regression test for issues 1139850 and 1174891. | 8858 // Regression test for issues 1139850 and 1174891. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8906 some_object = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8907 some_object = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8907 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8908 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8908 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8909 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8909 } | 8910 } |
8910 // Note: order is implementation dependent alas: currently | 8911 // Note: order is implementation dependent alas: currently |
8911 // global handle nodes are processed by PostGarbageCollectionProcessing | 8912 // global handle nodes are processed by PostGarbageCollectionProcessing |
8912 // in reverse allocation order, so if second allocated handle is deleted, | 8913 // in reverse allocation order, so if second allocated handle is deleted, |
8913 // weak callback of the first handle would be able to 'reallocate' it. | 8914 // weak callback of the first handle would be able to 'reallocate' it. |
8914 handle1.MakeWeak(NULL, NewPersistentHandleCallback); | 8915 handle1.MakeWeak(NULL, NewPersistentHandleCallback); |
8915 handle2.Dispose(); | 8916 handle2.Dispose(); |
8916 i::Heap::CollectAllGarbage(false); | 8917 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
8917 } | 8918 } |
8918 | 8919 |
8919 | 8920 |
8920 v8::Persistent<v8::Object> to_be_disposed; | 8921 v8::Persistent<v8::Object> to_be_disposed; |
8921 | 8922 |
8922 void DisposeAndForceGcCallback(v8::Persistent<v8::Value> handle, void*) { | 8923 void DisposeAndForceGcCallback(v8::Persistent<v8::Value> handle, void*) { |
8923 to_be_disposed.Dispose(); | 8924 to_be_disposed.Dispose(); |
8924 i::Heap::CollectAllGarbage(false); | 8925 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
8925 handle.Dispose(); | 8926 handle.Dispose(); |
8926 } | 8927 } |
8927 | 8928 |
8928 | 8929 |
8929 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { | 8930 THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) { |
8930 LocalContext context; | 8931 LocalContext context; |
8931 | 8932 |
8932 v8::Persistent<v8::Object> handle1, handle2; | 8933 v8::Persistent<v8::Object> handle1, handle2; |
8933 { | 8934 { |
8934 v8::HandleScope scope; | 8935 v8::HandleScope scope; |
8935 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8936 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8936 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8937 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8937 } | 8938 } |
8938 handle1.MakeWeak(NULL, DisposeAndForceGcCallback); | 8939 handle1.MakeWeak(NULL, DisposeAndForceGcCallback); |
8939 to_be_disposed = handle2; | 8940 to_be_disposed = handle2; |
8940 i::Heap::CollectAllGarbage(false); | 8941 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
8941 } | 8942 } |
8942 | 8943 |
8943 void DisposingCallback(v8::Persistent<v8::Value> handle, void*) { | 8944 void DisposingCallback(v8::Persistent<v8::Value> handle, void*) { |
8944 handle.Dispose(); | 8945 handle.Dispose(); |
8945 } | 8946 } |
8946 | 8947 |
8947 void HandleCreatingCallback(v8::Persistent<v8::Value> handle, void*) { | 8948 void HandleCreatingCallback(v8::Persistent<v8::Value> handle, void*) { |
8948 v8::HandleScope scope; | 8949 v8::HandleScope scope; |
8949 v8::Persistent<v8::Object>::New(v8::Object::New()); | 8950 v8::Persistent<v8::Object>::New(v8::Object::New()); |
8950 handle.Dispose(); | 8951 handle.Dispose(); |
8951 } | 8952 } |
8952 | 8953 |
8953 | 8954 |
8954 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { | 8955 THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) { |
8955 LocalContext context; | 8956 LocalContext context; |
8956 | 8957 |
8957 v8::Persistent<v8::Object> handle1, handle2, handle3; | 8958 v8::Persistent<v8::Object> handle1, handle2, handle3; |
8958 { | 8959 { |
8959 v8::HandleScope scope; | 8960 v8::HandleScope scope; |
8960 handle3 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8961 handle3 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8961 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8962 handle2 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8962 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); | 8963 handle1 = v8::Persistent<v8::Object>::New(v8::Object::New()); |
8963 } | 8964 } |
8964 handle2.MakeWeak(NULL, DisposingCallback); | 8965 handle2.MakeWeak(NULL, DisposingCallback); |
8965 handle3.MakeWeak(NULL, HandleCreatingCallback); | 8966 handle3.MakeWeak(NULL, HandleCreatingCallback); |
8966 i::Heap::CollectAllGarbage(false); | 8967 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
8967 } | 8968 } |
8968 | 8969 |
8969 | 8970 |
8970 THREADED_TEST(CheckForCrossContextObjectLiterals) { | 8971 THREADED_TEST(CheckForCrossContextObjectLiterals) { |
8971 v8::V8::Initialize(); | 8972 v8::V8::Initialize(); |
8972 | 8973 |
8973 const int nof = 2; | 8974 const int nof = 2; |
8974 const char* sources[nof] = { | 8975 const char* sources[nof] = { |
8975 "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }", | 8976 "try { [ 2, 3, 4 ].forEach(5); } catch(e) { e.toString(); }", |
8976 "Object()" | 8977 "Object()" |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9728 private: | 9729 private: |
9729 RegExpInterruptTest* test_; | 9730 RegExpInterruptTest* test_; |
9730 }; | 9731 }; |
9731 | 9732 |
9732 void CollectGarbage() { | 9733 void CollectGarbage() { |
9733 block_->Wait(); | 9734 block_->Wait(); |
9734 while (gc_during_regexp_ < kRequiredGCs) { | 9735 while (gc_during_regexp_ < kRequiredGCs) { |
9735 { | 9736 { |
9736 v8::Locker lock; | 9737 v8::Locker lock; |
9737 // TODO(lrn): Perhaps create some garbage before collecting. | 9738 // TODO(lrn): Perhaps create some garbage before collecting. |
9738 i::Heap::CollectAllGarbage(false); | 9739 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
9739 gc_count_++; | 9740 gc_count_++; |
9740 } | 9741 } |
9741 i::OS::Sleep(1); | 9742 i::OS::Sleep(1); |
9742 } | 9743 } |
9743 gc_success_ = true; | 9744 gc_success_ = true; |
9744 } | 9745 } |
9745 | 9746 |
9746 void LongRunningRegExp() { | 9747 void LongRunningRegExp() { |
9747 block_->Signal(); // Enable garbage collection thread on next preemption. | 9748 block_->Signal(); // Enable garbage collection thread on next preemption. |
9748 int rounds = 0; | 9749 int rounds = 0; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9849 } | 9850 } |
9850 private: | 9851 private: |
9851 ApplyInterruptTest* test_; | 9852 ApplyInterruptTest* test_; |
9852 }; | 9853 }; |
9853 | 9854 |
9854 void CollectGarbage() { | 9855 void CollectGarbage() { |
9855 block_->Wait(); | 9856 block_->Wait(); |
9856 while (gc_during_apply_ < kRequiredGCs) { | 9857 while (gc_during_apply_ < kRequiredGCs) { |
9857 { | 9858 { |
9858 v8::Locker lock; | 9859 v8::Locker lock; |
9859 i::Heap::CollectAllGarbage(false); | 9860 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
9860 gc_count_++; | 9861 gc_count_++; |
9861 } | 9862 } |
9862 i::OS::Sleep(1); | 9863 i::OS::Sleep(1); |
9863 } | 9864 } |
9864 gc_success_ = true; | 9865 gc_success_ = true; |
9865 } | 9866 } |
9866 | 9867 |
9867 void LongRunningApply() { | 9868 void LongRunningApply() { |
9868 block_->Signal(); | 9869 block_->Signal(); |
9869 int rounds = 0; | 9870 int rounds = 0; |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10567 THREADED_TEST(PixelArray) { | 10568 THREADED_TEST(PixelArray) { |
10568 v8::HandleScope scope; | 10569 v8::HandleScope scope; |
10569 LocalContext context; | 10570 LocalContext context; |
10570 const int kElementCount = 260; | 10571 const int kElementCount = 260; |
10571 uint8_t* pixel_data = reinterpret_cast<uint8_t*>(malloc(kElementCount)); | 10572 uint8_t* pixel_data = reinterpret_cast<uint8_t*>(malloc(kElementCount)); |
10572 i::Handle<i::ExternalPixelArray> pixels = | 10573 i::Handle<i::ExternalPixelArray> pixels = |
10573 i::Handle<i::ExternalPixelArray>::cast( | 10574 i::Handle<i::ExternalPixelArray>::cast( |
10574 i::Factory::NewExternalArray(kElementCount, | 10575 i::Factory::NewExternalArray(kElementCount, |
10575 v8::kExternalPixelArray, | 10576 v8::kExternalPixelArray, |
10576 pixel_data)); | 10577 pixel_data)); |
10577 i::Heap::CollectAllGarbage(false); // Force GC to trigger verification. | 10578 // Force GC to trigger verification. |
| 10579 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
10578 for (int i = 0; i < kElementCount; i++) { | 10580 for (int i = 0; i < kElementCount; i++) { |
10579 pixels->set(i, i % 256); | 10581 pixels->set(i, i % 256); |
10580 } | 10582 } |
10581 i::Heap::CollectAllGarbage(false); // Force GC to trigger verification. | 10583 // Force GC to trigger verification. |
| 10584 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
10582 for (int i = 0; i < kElementCount; i++) { | 10585 for (int i = 0; i < kElementCount; i++) { |
10583 CHECK_EQ(i % 256, pixels->get(i)); | 10586 CHECK_EQ(i % 256, pixels->get(i)); |
10584 CHECK_EQ(i % 256, pixel_data[i]); | 10587 CHECK_EQ(i % 256, pixel_data[i]); |
10585 } | 10588 } |
10586 | 10589 |
10587 v8::Handle<v8::Object> obj = v8::Object::New(); | 10590 v8::Handle<v8::Object> obj = v8::Object::New(); |
10588 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); | 10591 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); |
10589 // Set the elements to be the pixels. | 10592 // Set the elements to be the pixels. |
10590 // jsobj->set_elements(*pixels); | 10593 // jsobj->set_elements(*pixels); |
10591 obj->SetIndexedPropertiesToPixelData(pixel_data, kElementCount); | 10594 obj->SetIndexedPropertiesToPixelData(pixel_data, kElementCount); |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11037 int64_t high) { | 11040 int64_t high) { |
11038 v8::HandleScope scope; | 11041 v8::HandleScope scope; |
11039 LocalContext context; | 11042 LocalContext context; |
11040 const int kElementCount = 40; | 11043 const int kElementCount = 40; |
11041 int element_size = ExternalArrayElementSize(array_type); | 11044 int element_size = ExternalArrayElementSize(array_type); |
11042 ElementType* array_data = | 11045 ElementType* array_data = |
11043 static_cast<ElementType*>(malloc(kElementCount * element_size)); | 11046 static_cast<ElementType*>(malloc(kElementCount * element_size)); |
11044 i::Handle<ExternalArrayClass> array = | 11047 i::Handle<ExternalArrayClass> array = |
11045 i::Handle<ExternalArrayClass>::cast( | 11048 i::Handle<ExternalArrayClass>::cast( |
11046 i::Factory::NewExternalArray(kElementCount, array_type, array_data)); | 11049 i::Factory::NewExternalArray(kElementCount, array_type, array_data)); |
11047 i::Heap::CollectAllGarbage(false); // Force GC to trigger verification. | 11050 // Force GC to trigger verification. |
| 11051 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
11048 for (int i = 0; i < kElementCount; i++) { | 11052 for (int i = 0; i < kElementCount; i++) { |
11049 array->set(i, static_cast<ElementType>(i)); | 11053 array->set(i, static_cast<ElementType>(i)); |
11050 } | 11054 } |
11051 i::Heap::CollectAllGarbage(false); // Force GC to trigger verification. | 11055 // Force GC to trigger verification. |
| 11056 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
11052 for (int i = 0; i < kElementCount; i++) { | 11057 for (int i = 0; i < kElementCount; i++) { |
11053 CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(array->get(i))); | 11058 CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(array->get(i))); |
11054 CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(array_data[i])); | 11059 CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(array_data[i])); |
11055 } | 11060 } |
11056 | 11061 |
11057 v8::Handle<v8::Object> obj = v8::Object::New(); | 11062 v8::Handle<v8::Object> obj = v8::Object::New(); |
11058 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); | 11063 i::Handle<i::JSObject> jsobj = v8::Utils::OpenHandle(*obj); |
11059 // Set the elements to be the external array. | 11064 // Set the elements to be the external array. |
11060 obj->SetIndexedPropertiesToExternalArrayData(array_data, | 11065 obj->SetIndexedPropertiesToExternalArrayData(array_data, |
11061 array_type, | 11066 array_type, |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11158 result = CompileRun("var tmp_array = ext_array;" | 11163 result = CompileRun("var tmp_array = ext_array;" |
11159 "var sum = 0;" | 11164 "var sum = 0;" |
11160 "for (var i = 0; i < 8; i++) {" | 11165 "for (var i = 0; i < 8; i++) {" |
11161 " tmp_array[i] = i;" | 11166 " tmp_array[i] = i;" |
11162 " sum += tmp_array[i];" | 11167 " sum += tmp_array[i];" |
11163 " if (i == 4) {" | 11168 " if (i == 4) {" |
11164 " tmp_array = {};" | 11169 " tmp_array = {};" |
11165 " }" | 11170 " }" |
11166 "}" | 11171 "}" |
11167 "sum;"); | 11172 "sum;"); |
11168 i::Heap::CollectAllGarbage(false); // Force GC to trigger verification. | 11173 // Force GC to trigger verification. |
| 11174 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
11169 CHECK_EQ(28, result->Int32Value()); | 11175 CHECK_EQ(28, result->Int32Value()); |
11170 | 11176 |
11171 // Make sure out-of-range loads do not throw. | 11177 // Make sure out-of-range loads do not throw. |
11172 i::OS::SNPrintF(test_buf, | 11178 i::OS::SNPrintF(test_buf, |
11173 "var caught_exception = false;" | 11179 "var caught_exception = false;" |
11174 "try {" | 11180 "try {" |
11175 " ext_array[%d];" | 11181 " ext_array[%d];" |
11176 "} catch (e) {" | 11182 "} catch (e) {" |
11177 " caught_exception = true;" | 11183 " caught_exception = true;" |
11178 "}" | 11184 "}" |
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12017 Local<v8::String> obj = v8::String::New(""); | 12023 Local<v8::String> obj = v8::String::New(""); |
12018 context->SetData(obj); | 12024 context->SetData(obj); |
12019 CompileRun(source_simple); | 12025 CompileRun(source_simple); |
12020 context->Exit(); | 12026 context->Exit(); |
12021 } | 12027 } |
12022 context.Dispose(); | 12028 context.Dispose(); |
12023 for (gc_count = 1; gc_count < 10; gc_count++) { | 12029 for (gc_count = 1; gc_count < 10; gc_count++) { |
12024 other_context->Enter(); | 12030 other_context->Enter(); |
12025 CompileRun(source_simple); | 12031 CompileRun(source_simple); |
12026 other_context->Exit(); | 12032 other_context->Exit(); |
12027 i::Heap::CollectAllGarbage(false); | 12033 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
12028 if (GetGlobalObjectsCount() == 1) break; | 12034 if (GetGlobalObjectsCount() == 1) break; |
12029 } | 12035 } |
12030 CHECK_GE(2, gc_count); | 12036 CHECK_GE(2, gc_count); |
12031 CHECK_EQ(1, GetGlobalObjectsCount()); | 12037 CHECK_EQ(1, GetGlobalObjectsCount()); |
12032 | 12038 |
12033 // Eval in a function creates reference from the compilation cache to the | 12039 // Eval in a function creates reference from the compilation cache to the |
12034 // global object. | 12040 // global object. |
12035 const char* source_eval = "function f(){eval('1')}; f()"; | 12041 const char* source_eval = "function f(){eval('1')}; f()"; |
12036 context = Context::New(); | 12042 context = Context::New(); |
12037 { | 12043 { |
12038 v8::HandleScope scope; | 12044 v8::HandleScope scope; |
12039 | 12045 |
12040 context->Enter(); | 12046 context->Enter(); |
12041 CompileRun(source_eval); | 12047 CompileRun(source_eval); |
12042 context->Exit(); | 12048 context->Exit(); |
12043 } | 12049 } |
12044 context.Dispose(); | 12050 context.Dispose(); |
12045 for (gc_count = 1; gc_count < 10; gc_count++) { | 12051 for (gc_count = 1; gc_count < 10; gc_count++) { |
12046 other_context->Enter(); | 12052 other_context->Enter(); |
12047 CompileRun(source_eval); | 12053 CompileRun(source_eval); |
12048 other_context->Exit(); | 12054 other_context->Exit(); |
12049 i::Heap::CollectAllGarbage(false); | 12055 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
12050 if (GetGlobalObjectsCount() == 1) break; | 12056 if (GetGlobalObjectsCount() == 1) break; |
12051 } | 12057 } |
12052 CHECK_GE(2, gc_count); | 12058 CHECK_GE(2, gc_count); |
12053 CHECK_EQ(1, GetGlobalObjectsCount()); | 12059 CHECK_EQ(1, GetGlobalObjectsCount()); |
12054 | 12060 |
12055 // Looking up the line number for an exception creates reference from the | 12061 // Looking up the line number for an exception creates reference from the |
12056 // compilation cache to the global object. | 12062 // compilation cache to the global object. |
12057 const char* source_exception = "function f(){throw 1;} f()"; | 12063 const char* source_exception = "function f(){throw 1;} f()"; |
12058 context = Context::New(); | 12064 context = Context::New(); |
12059 { | 12065 { |
12060 v8::HandleScope scope; | 12066 v8::HandleScope scope; |
12061 | 12067 |
12062 context->Enter(); | 12068 context->Enter(); |
12063 v8::TryCatch try_catch; | 12069 v8::TryCatch try_catch; |
12064 CompileRun(source_exception); | 12070 CompileRun(source_exception); |
12065 CHECK(try_catch.HasCaught()); | 12071 CHECK(try_catch.HasCaught()); |
12066 v8::Handle<v8::Message> message = try_catch.Message(); | 12072 v8::Handle<v8::Message> message = try_catch.Message(); |
12067 CHECK(!message.IsEmpty()); | 12073 CHECK(!message.IsEmpty()); |
12068 CHECK_EQ(1, message->GetLineNumber()); | 12074 CHECK_EQ(1, message->GetLineNumber()); |
12069 context->Exit(); | 12075 context->Exit(); |
12070 } | 12076 } |
12071 context.Dispose(); | 12077 context.Dispose(); |
12072 for (gc_count = 1; gc_count < 10; gc_count++) { | 12078 for (gc_count = 1; gc_count < 10; gc_count++) { |
12073 other_context->Enter(); | 12079 other_context->Enter(); |
12074 CompileRun(source_exception); | 12080 CompileRun(source_exception); |
12075 other_context->Exit(); | 12081 other_context->Exit(); |
12076 i::Heap::CollectAllGarbage(false); | 12082 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
12077 if (GetGlobalObjectsCount() == 1) break; | 12083 if (GetGlobalObjectsCount() == 1) break; |
12078 } | 12084 } |
12079 CHECK_GE(2, gc_count); | 12085 CHECK_GE(2, gc_count); |
12080 CHECK_EQ(1, GetGlobalObjectsCount()); | 12086 CHECK_EQ(1, GetGlobalObjectsCount()); |
12081 | 12087 |
12082 other_context.Dispose(); | 12088 other_context.Dispose(); |
12083 } | 12089 } |
12084 | 12090 |
12085 | 12091 |
12086 THREADED_TEST(ScriptOrigin) { | 12092 THREADED_TEST(ScriptOrigin) { |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12284 ++epilogue_call_count_second; | 12290 ++epilogue_call_count_second; |
12285 } | 12291 } |
12286 | 12292 |
12287 TEST(GCCallbacks) { | 12293 TEST(GCCallbacks) { |
12288 LocalContext context; | 12294 LocalContext context; |
12289 | 12295 |
12290 v8::V8::AddGCPrologueCallback(PrologueCallback); | 12296 v8::V8::AddGCPrologueCallback(PrologueCallback); |
12291 v8::V8::AddGCEpilogueCallback(EpilogueCallback); | 12297 v8::V8::AddGCEpilogueCallback(EpilogueCallback); |
12292 CHECK_EQ(0, prologue_call_count); | 12298 CHECK_EQ(0, prologue_call_count); |
12293 CHECK_EQ(0, epilogue_call_count); | 12299 CHECK_EQ(0, epilogue_call_count); |
12294 i::Heap::CollectAllGarbage(false); | 12300 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
12295 CHECK_EQ(1, prologue_call_count); | 12301 CHECK_EQ(1, prologue_call_count); |
12296 CHECK_EQ(1, epilogue_call_count); | 12302 CHECK_EQ(1, epilogue_call_count); |
12297 v8::V8::AddGCPrologueCallback(PrologueCallbackSecond); | 12303 v8::V8::AddGCPrologueCallback(PrologueCallbackSecond); |
12298 v8::V8::AddGCEpilogueCallback(EpilogueCallbackSecond); | 12304 v8::V8::AddGCEpilogueCallback(EpilogueCallbackSecond); |
12299 i::Heap::CollectAllGarbage(false); | 12305 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
12300 CHECK_EQ(2, prologue_call_count); | 12306 CHECK_EQ(2, prologue_call_count); |
12301 CHECK_EQ(2, epilogue_call_count); | 12307 CHECK_EQ(2, epilogue_call_count); |
12302 CHECK_EQ(1, prologue_call_count_second); | 12308 CHECK_EQ(1, prologue_call_count_second); |
12303 CHECK_EQ(1, epilogue_call_count_second); | 12309 CHECK_EQ(1, epilogue_call_count_second); |
12304 v8::V8::RemoveGCPrologueCallback(PrologueCallback); | 12310 v8::V8::RemoveGCPrologueCallback(PrologueCallback); |
12305 v8::V8::RemoveGCEpilogueCallback(EpilogueCallback); | 12311 v8::V8::RemoveGCEpilogueCallback(EpilogueCallback); |
12306 i::Heap::CollectAllGarbage(false); | 12312 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
12307 CHECK_EQ(2, prologue_call_count); | 12313 CHECK_EQ(2, prologue_call_count); |
12308 CHECK_EQ(2, epilogue_call_count); | 12314 CHECK_EQ(2, epilogue_call_count); |
12309 CHECK_EQ(2, prologue_call_count_second); | 12315 CHECK_EQ(2, prologue_call_count_second); |
12310 CHECK_EQ(2, epilogue_call_count_second); | 12316 CHECK_EQ(2, epilogue_call_count_second); |
12311 v8::V8::RemoveGCPrologueCallback(PrologueCallbackSecond); | 12317 v8::V8::RemoveGCPrologueCallback(PrologueCallbackSecond); |
12312 v8::V8::RemoveGCEpilogueCallback(EpilogueCallbackSecond); | 12318 v8::V8::RemoveGCEpilogueCallback(EpilogueCallbackSecond); |
12313 i::Heap::CollectAllGarbage(false); | 12319 i::Heap::CollectAllGarbage(i::Heap::kNoGCFlags); |
12314 CHECK_EQ(2, prologue_call_count); | 12320 CHECK_EQ(2, prologue_call_count); |
12315 CHECK_EQ(2, epilogue_call_count); | 12321 CHECK_EQ(2, epilogue_call_count); |
12316 CHECK_EQ(2, prologue_call_count_second); | 12322 CHECK_EQ(2, prologue_call_count_second); |
12317 CHECK_EQ(2, epilogue_call_count_second); | 12323 CHECK_EQ(2, epilogue_call_count_second); |
12318 } | 12324 } |
12319 | 12325 |
12320 | 12326 |
12321 THREADED_TEST(AddToJSFunctionResultCache) { | 12327 THREADED_TEST(AddToJSFunctionResultCache) { |
12322 i::FLAG_allow_natives_syntax = true; | 12328 i::FLAG_allow_natives_syntax = true; |
12323 v8::HandleScope scope; | 12329 v8::HandleScope scope; |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12513 | 12519 |
12514 reresult = CompileRun("str2.charCodeAt(2);"); | 12520 reresult = CompileRun("str2.charCodeAt(2);"); |
12515 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); | 12521 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); |
12516 } | 12522 } |
12517 | 12523 |
12518 | 12524 |
12519 // Failed access check callback that performs a GC on each invocation. | 12525 // Failed access check callback that performs a GC on each invocation. |
12520 void FailedAccessCheckCallbackGC(Local<v8::Object> target, | 12526 void FailedAccessCheckCallbackGC(Local<v8::Object> target, |
12521 v8::AccessType type, | 12527 v8::AccessType type, |
12522 Local<v8::Value> data) { | 12528 Local<v8::Value> data) { |
12523 i::Heap::CollectAllGarbage(true); | 12529 i::Heap::CollectAllGarbage(i::Heap::kForceCompactionMask); |
12524 } | 12530 } |
12525 | 12531 |
12526 | 12532 |
12527 TEST(GCInFailedAccessCheckCallback) { | 12533 TEST(GCInFailedAccessCheckCallback) { |
12528 // Install a failed access check callback that performs a GC on each | 12534 // Install a failed access check callback that performs a GC on each |
12529 // invocation. Then force the callback to be called from va | 12535 // invocation. Then force the callback to be called from va |
12530 | 12536 |
12531 v8::V8::Initialize(); | 12537 v8::V8::Initialize(); |
12532 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); | 12538 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); |
12533 | 12539 |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12697 ExpectBoolean("delete cell", true); | 12703 ExpectBoolean("delete cell", true); |
12698 ExpectString("(function() {" | 12704 ExpectString("(function() {" |
12699 " try {" | 12705 " try {" |
12700 " return readCell();" | 12706 " return readCell();" |
12701 " } catch(e) {" | 12707 " } catch(e) {" |
12702 " return e.toString();" | 12708 " return e.toString();" |
12703 " }" | 12709 " }" |
12704 "})()", | 12710 "})()", |
12705 "ReferenceError: cell is not defined"); | 12711 "ReferenceError: cell is not defined"); |
12706 CompileRun("cell = \"new_second\";"); | 12712 CompileRun("cell = \"new_second\";"); |
12707 i::Heap::CollectAllGarbage(true); | 12713 i::Heap::CollectAllGarbage(i::Heap::kForceCompactionMask); |
12708 ExpectString("readCell()", "new_second"); | 12714 ExpectString("readCell()", "new_second"); |
12709 ExpectString("readCell()", "new_second"); | 12715 ExpectString("readCell()", "new_second"); |
12710 } | 12716 } |
12711 } | 12717 } |
12712 | 12718 |
12713 | 12719 |
12714 TEST(DontDeleteCellLoadICForceDelete) { | 12720 TEST(DontDeleteCellLoadICForceDelete) { |
12715 const char* function_code = | 12721 const char* function_code = |
12716 "function readCell() { while (true) { return cell; } }"; | 12722 "function readCell() { while (true) { return cell; } }"; |
12717 | 12723 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12928 v8::Handle<v8::Function> define_property = | 12934 v8::Handle<v8::Function> define_property = |
12929 CompileRun("(function() {" | 12935 CompileRun("(function() {" |
12930 " Object.defineProperty(" | 12936 " Object.defineProperty(" |
12931 " this," | 12937 " this," |
12932 " 1," | 12938 " 1," |
12933 " { configurable: true, enumerable: true, value: 3 });" | 12939 " { configurable: true, enumerable: true, value: 3 });" |
12934 "})").As<Function>(); | 12940 "})").As<Function>(); |
12935 context->DetachGlobal(); | 12941 context->DetachGlobal(); |
12936 define_property->Call(proxy, 0, NULL); | 12942 define_property->Call(proxy, 0, NULL); |
12937 } | 12943 } |
OLD | NEW |