| 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 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 | 424 |
| 425 | 425 |
| 426 THREADED_TEST(ScriptMakingExternalString) { | 426 THREADED_TEST(ScriptMakingExternalString) { |
| 427 TestResource::dispose_count = 0; | 427 TestResource::dispose_count = 0; |
| 428 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); | 428 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); |
| 429 { | 429 { |
| 430 v8::HandleScope scope; | 430 v8::HandleScope scope; |
| 431 LocalContext env; | 431 LocalContext env; |
| 432 Local<String> source = String::New(two_byte_source); | 432 Local<String> source = String::New(two_byte_source); |
| 433 // Trigger GCs so that the newly allocated string moves to old gen. | 433 // Trigger GCs so that the newly allocated string moves to old gen. |
| 434 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now | 434 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 435 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now | 435 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
| 436 bool success = source->MakeExternal(new TestResource(two_byte_source)); | 436 bool success = source->MakeExternal(new TestResource(two_byte_source)); |
| 437 CHECK(success); | 437 CHECK(success); |
| 438 Local<Script> script = Script::Compile(source); | 438 Local<Script> script = Script::Compile(source); |
| 439 Local<Value> value = script->Run(); | 439 Local<Value> value = script->Run(); |
| 440 CHECK(value->IsNumber()); | 440 CHECK(value->IsNumber()); |
| 441 CHECK_EQ(7, value->Int32Value()); | 441 CHECK_EQ(7, value->Int32Value()); |
| 442 i::Heap::CollectAllGarbage(false); | 442 i::Heap::CollectAllGarbage(false); |
| 443 CHECK_EQ(0, TestResource::dispose_count); | 443 CHECK_EQ(0, TestResource::dispose_count); |
| 444 } | 444 } |
| 445 i::CompilationCache::Clear(); | 445 i::CompilationCache::Clear(); |
| 446 i::Heap::CollectAllGarbage(false); | 446 i::Heap::CollectAllGarbage(false); |
| 447 CHECK_EQ(1, TestResource::dispose_count); | 447 CHECK_EQ(1, TestResource::dispose_count); |
| 448 } | 448 } |
| 449 | 449 |
| 450 | 450 |
| 451 THREADED_TEST(ScriptMakingExternalAsciiString) { | 451 THREADED_TEST(ScriptMakingExternalAsciiString) { |
| 452 TestAsciiResource::dispose_count = 0; | 452 TestAsciiResource::dispose_count = 0; |
| 453 const char* c_source = "1 + 2 * 3"; | 453 const char* c_source = "1 + 2 * 3"; |
| 454 { | 454 { |
| 455 v8::HandleScope scope; | 455 v8::HandleScope scope; |
| 456 LocalContext env; | 456 LocalContext env; |
| 457 Local<String> source = v8_str(c_source); | 457 Local<String> source = v8_str(c_source); |
| 458 // Trigger GCs so that the newly allocated string moves to old gen. | 458 // Trigger GCs so that the newly allocated string moves to old gen. |
| 459 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now | 459 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 460 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now | 460 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
| 461 bool success = source->MakeExternal( | 461 bool success = source->MakeExternal( |
| 462 new TestAsciiResource(i::StrDup(c_source))); | 462 new TestAsciiResource(i::StrDup(c_source))); |
| 463 CHECK(success); | 463 CHECK(success); |
| 464 Local<Script> script = Script::Compile(source); | 464 Local<Script> script = Script::Compile(source); |
| 465 Local<Value> value = script->Run(); | 465 Local<Value> value = script->Run(); |
| 466 CHECK(value->IsNumber()); | 466 CHECK(value->IsNumber()); |
| 467 CHECK_EQ(7, value->Int32Value()); | 467 CHECK_EQ(7, value->Int32Value()); |
| 468 i::Heap::CollectAllGarbage(false); | 468 i::Heap::CollectAllGarbage(false); |
| 469 CHECK_EQ(0, TestAsciiResource::dispose_count); | 469 CHECK_EQ(0, TestAsciiResource::dispose_count); |
| 470 } | 470 } |
| 471 i::CompilationCache::Clear(); | 471 i::CompilationCache::Clear(); |
| 472 i::Heap::CollectAllGarbage(false); | 472 i::Heap::CollectAllGarbage(false); |
| 473 CHECK_EQ(1, TestAsciiResource::dispose_count); | 473 CHECK_EQ(1, TestAsciiResource::dispose_count); |
| 474 } | 474 } |
| 475 | 475 |
| 476 | 476 |
| 477 TEST(MakingExternalStringConditions) { | 477 TEST(MakingExternalStringConditions) { |
| 478 v8::HandleScope scope; | 478 v8::HandleScope scope; |
| 479 LocalContext env; | 479 LocalContext env; |
| 480 | 480 |
| 481 // Free some space in the new space so that we can check freshness. | 481 // Free some space in the new space so that we can check freshness. |
| 482 i::Heap::CollectGarbage(0, i::NEW_SPACE); | 482 i::Heap::CollectGarbage(i::NEW_SPACE); |
| 483 i::Heap::CollectGarbage(0, i::NEW_SPACE); | 483 i::Heap::CollectGarbage(i::NEW_SPACE); |
| 484 | 484 |
| 485 uint16_t* two_byte_string = AsciiToTwoByteString("small"); | 485 uint16_t* two_byte_string = AsciiToTwoByteString("small"); |
| 486 Local<String> small_string = String::New(two_byte_string); | 486 Local<String> small_string = String::New(two_byte_string); |
| 487 i::DeleteArray(two_byte_string); | 487 i::DeleteArray(two_byte_string); |
| 488 | 488 |
| 489 // We should refuse to externalize newly created small string. | 489 // We should refuse to externalize newly created small string. |
| 490 CHECK(!small_string->CanMakeExternal()); | 490 CHECK(!small_string->CanMakeExternal()); |
| 491 // Trigger GCs so that the newly allocated string moves to old gen. | 491 // Trigger GCs so that the newly allocated string moves to old gen. |
| 492 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now | 492 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 493 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now | 493 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
| 494 // Old space strings should be accepted. | 494 // Old space strings should be accepted. |
| 495 CHECK(small_string->CanMakeExternal()); | 495 CHECK(small_string->CanMakeExternal()); |
| 496 | 496 |
| 497 two_byte_string = AsciiToTwoByteString("small 2"); | 497 two_byte_string = AsciiToTwoByteString("small 2"); |
| 498 small_string = String::New(two_byte_string); | 498 small_string = String::New(two_byte_string); |
| 499 i::DeleteArray(two_byte_string); | 499 i::DeleteArray(two_byte_string); |
| 500 | 500 |
| 501 // We should refuse externalizing newly created small string. | 501 // We should refuse externalizing newly created small string. |
| 502 CHECK(!small_string->CanMakeExternal()); | 502 CHECK(!small_string->CanMakeExternal()); |
| 503 for (int i = 0; i < 100; i++) { | 503 for (int i = 0; i < 100; i++) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 518 // Large strings should be immediately accepted. | 518 // Large strings should be immediately accepted. |
| 519 CHECK(large_string->CanMakeExternal()); | 519 CHECK(large_string->CanMakeExternal()); |
| 520 } | 520 } |
| 521 | 521 |
| 522 | 522 |
| 523 TEST(MakingExternalAsciiStringConditions) { | 523 TEST(MakingExternalAsciiStringConditions) { |
| 524 v8::HandleScope scope; | 524 v8::HandleScope scope; |
| 525 LocalContext env; | 525 LocalContext env; |
| 526 | 526 |
| 527 // Free some space in the new space so that we can check freshness. | 527 // Free some space in the new space so that we can check freshness. |
| 528 i::Heap::CollectGarbage(0, i::NEW_SPACE); | 528 i::Heap::CollectGarbage(i::NEW_SPACE); |
| 529 i::Heap::CollectGarbage(0, i::NEW_SPACE); | 529 i::Heap::CollectGarbage(i::NEW_SPACE); |
| 530 | 530 |
| 531 Local<String> small_string = String::New("small"); | 531 Local<String> small_string = String::New("small"); |
| 532 // We should refuse to externalize newly created small string. | 532 // We should refuse to externalize newly created small string. |
| 533 CHECK(!small_string->CanMakeExternal()); | 533 CHECK(!small_string->CanMakeExternal()); |
| 534 // Trigger GCs so that the newly allocated string moves to old gen. | 534 // Trigger GCs so that the newly allocated string moves to old gen. |
| 535 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now | 535 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 536 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now | 536 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
| 537 // Old space strings should be accepted. | 537 // Old space strings should be accepted. |
| 538 CHECK(small_string->CanMakeExternal()); | 538 CHECK(small_string->CanMakeExternal()); |
| 539 | 539 |
| 540 small_string = String::New("small 2"); | 540 small_string = String::New("small 2"); |
| 541 // We should refuse externalizing newly created small string. | 541 // We should refuse externalizing newly created small string. |
| 542 CHECK(!small_string->CanMakeExternal()); | 542 CHECK(!small_string->CanMakeExternal()); |
| 543 for (int i = 0; i < 100; i++) { | 543 for (int i = 0; i < 100; i++) { |
| 544 String::Value value(small_string); | 544 String::Value value(small_string); |
| 545 } | 545 } |
| 546 // Frequently used strings should be accepted. | 546 // Frequently used strings should be accepted. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 558 | 558 |
| 559 | 559 |
| 560 THREADED_TEST(UsingExternalString) { | 560 THREADED_TEST(UsingExternalString) { |
| 561 { | 561 { |
| 562 v8::HandleScope scope; | 562 v8::HandleScope scope; |
| 563 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 563 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
| 564 Local<String> string = | 564 Local<String> string = |
| 565 String::NewExternal(new TestResource(two_byte_string)); | 565 String::NewExternal(new TestResource(two_byte_string)); |
| 566 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 566 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 567 // Trigger GCs so that the newly allocated string moves to old gen. | 567 // Trigger GCs so that the newly allocated string moves to old gen. |
| 568 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now | 568 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 569 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now | 569 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
| 570 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); | 570 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); |
| 571 CHECK(isymbol->IsSymbol()); | 571 CHECK(isymbol->IsSymbol()); |
| 572 } | 572 } |
| 573 i::Heap::CollectAllGarbage(false); | 573 i::Heap::CollectAllGarbage(false); |
| 574 i::Heap::CollectAllGarbage(false); | 574 i::Heap::CollectAllGarbage(false); |
| 575 } | 575 } |
| 576 | 576 |
| 577 | 577 |
| 578 THREADED_TEST(UsingExternalAsciiString) { | 578 THREADED_TEST(UsingExternalAsciiString) { |
| 579 { | 579 { |
| 580 v8::HandleScope scope; | 580 v8::HandleScope scope; |
| 581 const char* one_byte_string = "test string"; | 581 const char* one_byte_string = "test string"; |
| 582 Local<String> string = String::NewExternal( | 582 Local<String> string = String::NewExternal( |
| 583 new TestAsciiResource(i::StrDup(one_byte_string))); | 583 new TestAsciiResource(i::StrDup(one_byte_string))); |
| 584 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 584 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 585 // Trigger GCs so that the newly allocated string moves to old gen. | 585 // Trigger GCs so that the newly allocated string moves to old gen. |
| 586 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now | 586 i::Heap::CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 587 i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now | 587 i::Heap::CollectGarbage(i::NEW_SPACE); // in old gen now |
| 588 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); | 588 i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); |
| 589 CHECK(isymbol->IsSymbol()); | 589 CHECK(isymbol->IsSymbol()); |
| 590 } | 590 } |
| 591 i::Heap::CollectAllGarbage(false); | 591 i::Heap::CollectAllGarbage(false); |
| 592 i::Heap::CollectAllGarbage(false); | 592 i::Heap::CollectAllGarbage(false); |
| 593 } | 593 } |
| 594 | 594 |
| 595 | 595 |
| 596 THREADED_TEST(ScavengeExternalString) { | 596 THREADED_TEST(ScavengeExternalString) { |
| 597 TestResource::dispose_count = 0; | 597 TestResource::dispose_count = 0; |
| 598 bool in_new_space = false; | 598 bool in_new_space = false; |
| 599 { | 599 { |
| 600 v8::HandleScope scope; | 600 v8::HandleScope scope; |
| 601 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 601 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
| 602 Local<String> string = | 602 Local<String> string = |
| 603 String::NewExternal(new TestResource(two_byte_string)); | 603 String::NewExternal(new TestResource(two_byte_string)); |
| 604 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 604 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 605 i::Heap::CollectGarbage(0, i::NEW_SPACE); | 605 i::Heap::CollectGarbage(i::NEW_SPACE); |
| 606 in_new_space = i::Heap::InNewSpace(*istring); | 606 in_new_space = i::Heap::InNewSpace(*istring); |
| 607 CHECK(in_new_space || i::Heap::old_data_space()->Contains(*istring)); | 607 CHECK(in_new_space || i::Heap::old_data_space()->Contains(*istring)); |
| 608 CHECK_EQ(0, TestResource::dispose_count); | 608 CHECK_EQ(0, TestResource::dispose_count); |
| 609 } | 609 } |
| 610 i::Heap::CollectGarbage(0, in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); | 610 i::Heap::CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); |
| 611 CHECK_EQ(1, TestResource::dispose_count); | 611 CHECK_EQ(1, TestResource::dispose_count); |
| 612 } | 612 } |
| 613 | 613 |
| 614 | 614 |
| 615 THREADED_TEST(ScavengeExternalAsciiString) { | 615 THREADED_TEST(ScavengeExternalAsciiString) { |
| 616 TestAsciiResource::dispose_count = 0; | 616 TestAsciiResource::dispose_count = 0; |
| 617 bool in_new_space = false; | 617 bool in_new_space = false; |
| 618 { | 618 { |
| 619 v8::HandleScope scope; | 619 v8::HandleScope scope; |
| 620 const char* one_byte_string = "test string"; | 620 const char* one_byte_string = "test string"; |
| 621 Local<String> string = String::NewExternal( | 621 Local<String> string = String::NewExternal( |
| 622 new TestAsciiResource(i::StrDup(one_byte_string))); | 622 new TestAsciiResource(i::StrDup(one_byte_string))); |
| 623 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 623 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 624 i::Heap::CollectGarbage(0, i::NEW_SPACE); | 624 i::Heap::CollectGarbage(i::NEW_SPACE); |
| 625 in_new_space = i::Heap::InNewSpace(*istring); | 625 in_new_space = i::Heap::InNewSpace(*istring); |
| 626 CHECK(in_new_space || i::Heap::old_data_space()->Contains(*istring)); | 626 CHECK(in_new_space || i::Heap::old_data_space()->Contains(*istring)); |
| 627 CHECK_EQ(0, TestAsciiResource::dispose_count); | 627 CHECK_EQ(0, TestAsciiResource::dispose_count); |
| 628 } | 628 } |
| 629 i::Heap::CollectGarbage(0, in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); | 629 i::Heap::CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); |
| 630 CHECK_EQ(1, TestAsciiResource::dispose_count); | 630 CHECK_EQ(1, TestAsciiResource::dispose_count); |
| 631 } | 631 } |
| 632 | 632 |
| 633 | 633 |
| 634 class TestAsciiResourceWithDisposeControl: public TestAsciiResource { | 634 class TestAsciiResourceWithDisposeControl: public TestAsciiResource { |
| 635 public: | 635 public: |
| 636 static int dispose_calls; | 636 static int dispose_calls; |
| 637 | 637 |
| 638 TestAsciiResourceWithDisposeControl(const char* data, bool dispose) | 638 TestAsciiResourceWithDisposeControl(const char* data, bool dispose) |
| 639 : TestAsciiResource(data), | 639 : TestAsciiResource(data), |
| (...skipping 11108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11748 v8::Context::Scope context_scope(context.local()); | 11748 v8::Context::Scope context_scope(context.local()); |
| 11749 | 11749 |
| 11750 v8::Handle<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(); | 11750 v8::Handle<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(); |
| 11751 tmpl->SetNamedPropertyHandler(Getter, NULL, NULL, NULL, Enumerator); | 11751 tmpl->SetNamedPropertyHandler(Getter, NULL, NULL, NULL, Enumerator); |
| 11752 context->Global()->Set(v8_str("o"), tmpl->NewInstance()); | 11752 context->Global()->Set(v8_str("o"), tmpl->NewInstance()); |
| 11753 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( | 11753 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( |
| 11754 "var result = []; for (var k in o) result.push(k); result")); | 11754 "var result = []; for (var k in o) result.push(k); result")); |
| 11755 CHECK_EQ(1, result->Length()); | 11755 CHECK_EQ(1, result->Length()); |
| 11756 CHECK_EQ(v8_str("universalAnswer"), result->Get(0)); | 11756 CHECK_EQ(v8_str("universalAnswer"), result->Get(0)); |
| 11757 } | 11757 } |
| OLD | NEW |