| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 static uint16_t* AsciiToTwoByteString(const char* source) { | 324 static uint16_t* AsciiToTwoByteString(const char* source) { |
| 325 int array_length = i::StrLength(source) + 1; | 325 int array_length = i::StrLength(source) + 1; |
| 326 uint16_t* converted = i::NewArray<uint16_t>(array_length); | 326 uint16_t* converted = i::NewArray<uint16_t>(array_length); |
| 327 for (int i = 0; i < array_length; i++) converted[i] = source[i]; | 327 for (int i = 0; i < array_length; i++) converted[i] = source[i]; |
| 328 return converted; | 328 return converted; |
| 329 } | 329 } |
| 330 | 330 |
| 331 | 331 |
| 332 class TestResource: public String::ExternalStringResource { | 332 class TestResource: public String::ExternalStringResource { |
| 333 public: | 333 public: |
| 334 static int dispose_count; | 334 explicit TestResource(uint16_t* data, int* counter = NULL) |
| 335 | 335 : data_(data), length_(0), counter_(counter) { |
| 336 explicit TestResource(uint16_t* data) | |
| 337 : data_(data), length_(0) { | |
| 338 while (data[length_]) ++length_; | 336 while (data[length_]) ++length_; |
| 339 } | 337 } |
| 340 | 338 |
| 341 ~TestResource() { | 339 ~TestResource() { |
| 342 i::DeleteArray(data_); | 340 i::DeleteArray(data_); |
| 343 ++dispose_count; | 341 if (counter_ != NULL) ++*counter_; |
| 344 } | 342 } |
| 345 | 343 |
| 346 const uint16_t* data() const { | 344 const uint16_t* data() const { |
| 347 return data_; | 345 return data_; |
| 348 } | 346 } |
| 349 | 347 |
| 350 size_t length() const { | 348 size_t length() const { |
| 351 return length_; | 349 return length_; |
| 352 } | 350 } |
| 353 private: | 351 private: |
| 354 uint16_t* data_; | 352 uint16_t* data_; |
| 355 size_t length_; | 353 size_t length_; |
| 354 int* counter_; |
| 356 }; | 355 }; |
| 357 | 356 |
| 358 | 357 |
| 359 int TestResource::dispose_count = 0; | |
| 360 | |
| 361 | |
| 362 class TestAsciiResource: public String::ExternalAsciiStringResource { | 358 class TestAsciiResource: public String::ExternalAsciiStringResource { |
| 363 public: | 359 public: |
| 364 static int dispose_count; | 360 explicit TestAsciiResource(const char* data, int* counter = NULL) |
| 365 | 361 : data_(data), length_(strlen(data)), counter_(counter) { } |
| 366 explicit TestAsciiResource(const char* data) | |
| 367 : data_(data), | |
| 368 length_(strlen(data)) { } | |
| 369 | 362 |
| 370 ~TestAsciiResource() { | 363 ~TestAsciiResource() { |
| 371 i::DeleteArray(data_); | 364 i::DeleteArray(data_); |
| 372 ++dispose_count; | 365 if (counter_ != NULL) ++*counter_; |
| 373 } | 366 } |
| 374 | 367 |
| 375 const char* data() const { | 368 const char* data() const { |
| 376 return data_; | 369 return data_; |
| 377 } | 370 } |
| 378 | 371 |
| 379 size_t length() const { | 372 size_t length() const { |
| 380 return length_; | 373 return length_; |
| 381 } | 374 } |
| 382 private: | 375 private: |
| 383 const char* data_; | 376 const char* data_; |
| 384 size_t length_; | 377 size_t length_; |
| 378 int* counter_; |
| 385 }; | 379 }; |
| 386 | 380 |
| 387 | 381 |
| 388 int TestAsciiResource::dispose_count = 0; | |
| 389 | |
| 390 | |
| 391 THREADED_TEST(ScriptUsingStringResource) { | 382 THREADED_TEST(ScriptUsingStringResource) { |
| 392 TestResource::dispose_count = 0; | 383 int dispose_count = 0; |
| 393 const char* c_source = "1 + 2 * 3"; | 384 const char* c_source = "1 + 2 * 3"; |
| 394 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); | 385 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); |
| 395 { | 386 { |
| 396 v8::HandleScope scope; | 387 v8::HandleScope scope; |
| 397 LocalContext env; | 388 LocalContext env; |
| 398 TestResource* resource = new TestResource(two_byte_source); | 389 TestResource* resource = new TestResource(two_byte_source, &dispose_count); |
| 399 Local<String> source = String::NewExternal(resource); | 390 Local<String> source = String::NewExternal(resource); |
| 400 Local<Script> script = Script::Compile(source); | 391 Local<Script> script = Script::Compile(source); |
| 401 Local<Value> value = script->Run(); | 392 Local<Value> value = script->Run(); |
| 402 CHECK(value->IsNumber()); | 393 CHECK(value->IsNumber()); |
| 403 CHECK_EQ(7, value->Int32Value()); | 394 CHECK_EQ(7, value->Int32Value()); |
| 404 CHECK(source->IsExternal()); | 395 CHECK(source->IsExternal()); |
| 405 CHECK_EQ(resource, | 396 CHECK_EQ(resource, |
| 406 static_cast<TestResource*>(source->GetExternalStringResource())); | 397 static_cast<TestResource*>(source->GetExternalStringResource())); |
| 407 HEAP->CollectAllGarbage(false); | 398 HEAP->CollectAllGarbage(false); |
| 408 CHECK_EQ(0, TestResource::dispose_count); | 399 CHECK_EQ(0, dispose_count); |
| 409 } | 400 } |
| 410 v8::internal::Isolate::Current()->compilation_cache()->Clear(); | 401 v8::internal::Isolate::Current()->compilation_cache()->Clear(); |
| 411 HEAP->CollectAllGarbage(false); | 402 HEAP->CollectAllGarbage(false); |
| 412 CHECK_EQ(1, TestResource::dispose_count); | 403 CHECK_EQ(1, dispose_count); |
| 413 } | 404 } |
| 414 | 405 |
| 415 | 406 |
| 416 THREADED_TEST(ScriptUsingAsciiStringResource) { | 407 THREADED_TEST(ScriptUsingAsciiStringResource) { |
| 417 TestAsciiResource::dispose_count = 0; | 408 int dispose_count = 0; |
| 418 const char* c_source = "1 + 2 * 3"; | 409 const char* c_source = "1 + 2 * 3"; |
| 419 { | 410 { |
| 420 v8::HandleScope scope; | 411 v8::HandleScope scope; |
| 421 LocalContext env; | 412 LocalContext env; |
| 422 Local<String> source = | 413 Local<String> source = |
| 423 String::NewExternal(new TestAsciiResource(i::StrDup(c_source))); | 414 String::NewExternal(new TestAsciiResource(i::StrDup(c_source), |
| 415 &dispose_count)); |
| 424 Local<Script> script = Script::Compile(source); | 416 Local<Script> script = Script::Compile(source); |
| 425 Local<Value> value = script->Run(); | 417 Local<Value> value = script->Run(); |
| 426 CHECK(value->IsNumber()); | 418 CHECK(value->IsNumber()); |
| 427 CHECK_EQ(7, value->Int32Value()); | 419 CHECK_EQ(7, value->Int32Value()); |
| 428 HEAP->CollectAllGarbage(false); | 420 HEAP->CollectAllGarbage(false); |
| 429 CHECK_EQ(0, TestAsciiResource::dispose_count); | 421 CHECK_EQ(0, dispose_count); |
| 430 } | 422 } |
| 431 i::Isolate::Current()->compilation_cache()->Clear(); | 423 i::Isolate::Current()->compilation_cache()->Clear(); |
| 432 HEAP->CollectAllGarbage(false); | 424 HEAP->CollectAllGarbage(false); |
| 433 CHECK_EQ(1, TestAsciiResource::dispose_count); | 425 CHECK_EQ(1, dispose_count); |
| 434 } | 426 } |
| 435 | 427 |
| 436 | 428 |
| 437 THREADED_TEST(ScriptMakingExternalString) { | 429 THREADED_TEST(ScriptMakingExternalString) { |
| 438 TestResource::dispose_count = 0; | 430 int dispose_count = 0; |
| 439 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); | 431 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); |
| 440 { | 432 { |
| 441 v8::HandleScope scope; | 433 v8::HandleScope scope; |
| 442 LocalContext env; | 434 LocalContext env; |
| 443 Local<String> source = String::New(two_byte_source); | 435 Local<String> source = String::New(two_byte_source); |
| 444 // Trigger GCs so that the newly allocated string moves to old gen. | 436 // Trigger GCs so that the newly allocated string moves to old gen. |
| 445 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now | 437 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 446 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now | 438 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now |
| 447 bool success = source->MakeExternal(new TestResource(two_byte_source)); | 439 bool success = source->MakeExternal(new TestResource(two_byte_source, |
| 440 &dispose_count)); |
| 448 CHECK(success); | 441 CHECK(success); |
| 449 Local<Script> script = Script::Compile(source); | 442 Local<Script> script = Script::Compile(source); |
| 450 Local<Value> value = script->Run(); | 443 Local<Value> value = script->Run(); |
| 451 CHECK(value->IsNumber()); | 444 CHECK(value->IsNumber()); |
| 452 CHECK_EQ(7, value->Int32Value()); | 445 CHECK_EQ(7, value->Int32Value()); |
| 453 HEAP->CollectAllGarbage(false); | 446 HEAP->CollectAllGarbage(false); |
| 454 CHECK_EQ(0, TestResource::dispose_count); | 447 CHECK_EQ(0, dispose_count); |
| 455 } | 448 } |
| 456 i::Isolate::Current()->compilation_cache()->Clear(); | 449 i::Isolate::Current()->compilation_cache()->Clear(); |
| 457 HEAP->CollectAllGarbage(false); | 450 HEAP->CollectAllGarbage(false); |
| 458 CHECK_EQ(1, TestResource::dispose_count); | 451 CHECK_EQ(1, dispose_count); |
| 459 } | 452 } |
| 460 | 453 |
| 461 | 454 |
| 462 THREADED_TEST(ScriptMakingExternalAsciiString) { | 455 THREADED_TEST(ScriptMakingExternalAsciiString) { |
| 463 TestAsciiResource::dispose_count = 0; | 456 int dispose_count = 0; |
| 464 const char* c_source = "1 + 2 * 3"; | 457 const char* c_source = "1 + 2 * 3"; |
| 465 { | 458 { |
| 466 v8::HandleScope scope; | 459 v8::HandleScope scope; |
| 467 LocalContext env; | 460 LocalContext env; |
| 468 Local<String> source = v8_str(c_source); | 461 Local<String> source = v8_str(c_source); |
| 469 // Trigger GCs so that the newly allocated string moves to old gen. | 462 // Trigger GCs so that the newly allocated string moves to old gen. |
| 470 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now | 463 HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 471 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now | 464 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now |
| 472 bool success = source->MakeExternal( | 465 bool success = source->MakeExternal( |
| 473 new TestAsciiResource(i::StrDup(c_source))); | 466 new TestAsciiResource(i::StrDup(c_source), &dispose_count)); |
| 474 CHECK(success); | 467 CHECK(success); |
| 475 Local<Script> script = Script::Compile(source); | 468 Local<Script> script = Script::Compile(source); |
| 476 Local<Value> value = script->Run(); | 469 Local<Value> value = script->Run(); |
| 477 CHECK(value->IsNumber()); | 470 CHECK(value->IsNumber()); |
| 478 CHECK_EQ(7, value->Int32Value()); | 471 CHECK_EQ(7, value->Int32Value()); |
| 479 HEAP->CollectAllGarbage(false); | 472 HEAP->CollectAllGarbage(false); |
| 480 CHECK_EQ(0, TestAsciiResource::dispose_count); | 473 CHECK_EQ(0, dispose_count); |
| 481 } | 474 } |
| 482 i::Isolate::Current()->compilation_cache()->Clear(); | 475 i::Isolate::Current()->compilation_cache()->Clear(); |
| 483 HEAP->CollectAllGarbage(false); | 476 HEAP->CollectAllGarbage(false); |
| 484 CHECK_EQ(1, TestAsciiResource::dispose_count); | 477 CHECK_EQ(1, dispose_count); |
| 485 } | 478 } |
| 486 | 479 |
| 487 | 480 |
| 488 TEST(MakingExternalStringConditions) { | 481 TEST(MakingExternalStringConditions) { |
| 489 v8::HandleScope scope; | 482 v8::HandleScope scope; |
| 490 LocalContext env; | 483 LocalContext env; |
| 491 | 484 |
| 492 // Free some space in the new space so that we can check freshness. | 485 // Free some space in the new space so that we can check freshness. |
| 493 HEAP->CollectGarbage(i::NEW_SPACE); | 486 HEAP->CollectGarbage(i::NEW_SPACE); |
| 494 HEAP->CollectGarbage(i::NEW_SPACE); | 487 HEAP->CollectGarbage(i::NEW_SPACE); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now | 591 HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now |
| 599 i::Handle<i::String> isymbol = FACTORY->SymbolFromString(istring); | 592 i::Handle<i::String> isymbol = FACTORY->SymbolFromString(istring); |
| 600 CHECK(isymbol->IsSymbol()); | 593 CHECK(isymbol->IsSymbol()); |
| 601 } | 594 } |
| 602 HEAP->CollectAllGarbage(false); | 595 HEAP->CollectAllGarbage(false); |
| 603 HEAP->CollectAllGarbage(false); | 596 HEAP->CollectAllGarbage(false); |
| 604 } | 597 } |
| 605 | 598 |
| 606 | 599 |
| 607 THREADED_TEST(ScavengeExternalString) { | 600 THREADED_TEST(ScavengeExternalString) { |
| 608 TestResource::dispose_count = 0; | 601 int dispose_count = 0; |
| 609 bool in_new_space = false; | 602 bool in_new_space = false; |
| 610 { | 603 { |
| 611 v8::HandleScope scope; | 604 v8::HandleScope scope; |
| 612 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 605 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
| 613 Local<String> string = | 606 Local<String> string = |
| 614 String::NewExternal(new TestResource(two_byte_string)); | 607 String::NewExternal(new TestResource(two_byte_string, |
| 608 &dispose_count)); |
| 615 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 609 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 616 HEAP->CollectGarbage(i::NEW_SPACE); | 610 HEAP->CollectGarbage(i::NEW_SPACE); |
| 617 in_new_space = HEAP->InNewSpace(*istring); | 611 in_new_space = HEAP->InNewSpace(*istring); |
| 618 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); | 612 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); |
| 619 CHECK_EQ(0, TestResource::dispose_count); | 613 CHECK_EQ(0, dispose_count); |
| 620 } | 614 } |
| 621 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); | 615 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); |
| 622 CHECK_EQ(1, TestResource::dispose_count); | 616 CHECK_EQ(1, dispose_count); |
| 623 } | 617 } |
| 624 | 618 |
| 625 | 619 |
| 626 THREADED_TEST(ScavengeExternalAsciiString) { | 620 THREADED_TEST(ScavengeExternalAsciiString) { |
| 627 TestAsciiResource::dispose_count = 0; | 621 int dispose_count = 0; |
| 628 bool in_new_space = false; | 622 bool in_new_space = false; |
| 629 { | 623 { |
| 630 v8::HandleScope scope; | 624 v8::HandleScope scope; |
| 631 const char* one_byte_string = "test string"; | 625 const char* one_byte_string = "test string"; |
| 632 Local<String> string = String::NewExternal( | 626 Local<String> string = String::NewExternal( |
| 633 new TestAsciiResource(i::StrDup(one_byte_string))); | 627 new TestAsciiResource(i::StrDup(one_byte_string), &dispose_count)); |
| 634 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 628 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 635 HEAP->CollectGarbage(i::NEW_SPACE); | 629 HEAP->CollectGarbage(i::NEW_SPACE); |
| 636 in_new_space = HEAP->InNewSpace(*istring); | 630 in_new_space = HEAP->InNewSpace(*istring); |
| 637 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); | 631 CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); |
| 638 CHECK_EQ(0, TestAsciiResource::dispose_count); | 632 CHECK_EQ(0, dispose_count); |
| 639 } | 633 } |
| 640 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); | 634 HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); |
| 641 CHECK_EQ(1, TestAsciiResource::dispose_count); | 635 CHECK_EQ(1, dispose_count); |
| 642 } | 636 } |
| 643 | 637 |
| 644 | 638 |
| 645 class TestAsciiResourceWithDisposeControl: public TestAsciiResource { | 639 class TestAsciiResourceWithDisposeControl: public TestAsciiResource { |
| 646 public: | 640 public: |
| 641 // Only used by non-threaded tests, so it can use static fields. |
| 647 static int dispose_calls; | 642 static int dispose_calls; |
| 643 static int dispose_count; |
| 648 | 644 |
| 649 TestAsciiResourceWithDisposeControl(const char* data, bool dispose) | 645 TestAsciiResourceWithDisposeControl(const char* data, bool dispose) |
| 650 : TestAsciiResource(data), | 646 : TestAsciiResource(data, &dispose_count), |
| 651 dispose_(dispose) { } | 647 dispose_(dispose) { } |
| 652 | 648 |
| 653 void Dispose() { | 649 void Dispose() { |
| 654 ++dispose_calls; | 650 ++dispose_calls; |
| 655 if (dispose_) delete this; | 651 if (dispose_) delete this; |
| 656 } | 652 } |
| 657 private: | 653 private: |
| 658 bool dispose_; | 654 bool dispose_; |
| 659 }; | 655 }; |
| 660 | 656 |
| 661 | 657 |
| 658 int TestAsciiResourceWithDisposeControl::dispose_count = 0; |
| 662 int TestAsciiResourceWithDisposeControl::dispose_calls = 0; | 659 int TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
| 663 | 660 |
| 664 | 661 |
| 665 TEST(ExternalStringWithDisposeHandling) { | 662 TEST(ExternalStringWithDisposeHandling) { |
| 666 const char* c_source = "1 + 2 * 3"; | 663 const char* c_source = "1 + 2 * 3"; |
| 667 | 664 |
| 668 // Use a stack allocated external string resource allocated object. | 665 // Use a stack allocated external string resource allocated object. |
| 669 TestAsciiResource::dispose_count = 0; | 666 TestAsciiResourceWithDisposeControl::dispose_count = 0; |
| 670 TestAsciiResourceWithDisposeControl::dispose_calls = 0; | 667 TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
| 671 TestAsciiResourceWithDisposeControl res_stack(i::StrDup(c_source), false); | 668 TestAsciiResourceWithDisposeControl res_stack(i::StrDup(c_source), false); |
| 672 { | 669 { |
| 673 v8::HandleScope scope; | 670 v8::HandleScope scope; |
| 674 LocalContext env; | 671 LocalContext env; |
| 675 Local<String> source = String::NewExternal(&res_stack); | 672 Local<String> source = String::NewExternal(&res_stack); |
| 676 Local<Script> script = Script::Compile(source); | 673 Local<Script> script = Script::Compile(source); |
| 677 Local<Value> value = script->Run(); | 674 Local<Value> value = script->Run(); |
| 678 CHECK(value->IsNumber()); | 675 CHECK(value->IsNumber()); |
| 679 CHECK_EQ(7, value->Int32Value()); | 676 CHECK_EQ(7, value->Int32Value()); |
| 680 HEAP->CollectAllGarbage(false); | 677 HEAP->CollectAllGarbage(false); |
| 681 CHECK_EQ(0, TestAsciiResource::dispose_count); | 678 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
| 682 } | 679 } |
| 683 i::Isolate::Current()->compilation_cache()->Clear(); | 680 i::Isolate::Current()->compilation_cache()->Clear(); |
| 684 HEAP->CollectAllGarbage(false); | 681 HEAP->CollectAllGarbage(false); |
| 685 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); | 682 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
| 686 CHECK_EQ(0, TestAsciiResource::dispose_count); | 683 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
| 687 | 684 |
| 688 // Use a heap allocated external string resource allocated object. | 685 // Use a heap allocated external string resource allocated object. |
| 689 TestAsciiResource::dispose_count = 0; | 686 TestAsciiResourceWithDisposeControl::dispose_count = 0; |
| 690 TestAsciiResourceWithDisposeControl::dispose_calls = 0; | 687 TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
| 691 TestAsciiResource* res_heap = | 688 TestAsciiResource* res_heap = |
| 692 new TestAsciiResourceWithDisposeControl(i::StrDup(c_source), true); | 689 new TestAsciiResourceWithDisposeControl(i::StrDup(c_source), true); |
| 693 { | 690 { |
| 694 v8::HandleScope scope; | 691 v8::HandleScope scope; |
| 695 LocalContext env; | 692 LocalContext env; |
| 696 Local<String> source = String::NewExternal(res_heap); | 693 Local<String> source = String::NewExternal(res_heap); |
| 697 Local<Script> script = Script::Compile(source); | 694 Local<Script> script = Script::Compile(source); |
| 698 Local<Value> value = script->Run(); | 695 Local<Value> value = script->Run(); |
| 699 CHECK(value->IsNumber()); | 696 CHECK(value->IsNumber()); |
| 700 CHECK_EQ(7, value->Int32Value()); | 697 CHECK_EQ(7, value->Int32Value()); |
| 701 HEAP->CollectAllGarbage(false); | 698 HEAP->CollectAllGarbage(false); |
| 702 CHECK_EQ(0, TestAsciiResource::dispose_count); | 699 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
| 703 } | 700 } |
| 704 i::Isolate::Current()->compilation_cache()->Clear(); | 701 i::Isolate::Current()->compilation_cache()->Clear(); |
| 705 HEAP->CollectAllGarbage(false); | 702 HEAP->CollectAllGarbage(false); |
| 706 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); | 703 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
| 707 CHECK_EQ(1, TestAsciiResource::dispose_count); | 704 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_count); |
| 708 } | 705 } |
| 709 | 706 |
| 710 | 707 |
| 711 THREADED_TEST(StringConcat) { | 708 THREADED_TEST(StringConcat) { |
| 712 { | 709 { |
| 713 v8::HandleScope scope; | 710 v8::HandleScope scope; |
| 714 LocalContext env; | 711 LocalContext env; |
| 715 const char* one_byte_string_1 = "function a_times_t"; | 712 const char* one_byte_string_1 = "function a_times_t"; |
| 716 const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; | 713 const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; |
| 717 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + "; | 714 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + "; |
| (...skipping 14112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14830 } | 14827 } |
| 14831 | 14828 |
| 14832 i::Isolate::Current()->heap()->CollectAllGarbage(true); | 14829 i::Isolate::Current()->heap()->CollectAllGarbage(true); |
| 14833 { i::Object* raw_map_cache = i::Isolate::Current()->context()->map_cache(); | 14830 { i::Object* raw_map_cache = i::Isolate::Current()->context()->map_cache(); |
| 14834 if (raw_map_cache != i::Isolate::Current()->heap()->undefined_value()) { | 14831 if (raw_map_cache != i::Isolate::Current()->heap()->undefined_value()) { |
| 14835 i::MapCache* map_cache = i::MapCache::cast(raw_map_cache); | 14832 i::MapCache* map_cache = i::MapCache::cast(raw_map_cache); |
| 14836 CHECK_GT(elements, map_cache->NumberOfElements()); | 14833 CHECK_GT(elements, map_cache->NumberOfElements()); |
| 14837 } | 14834 } |
| 14838 } | 14835 } |
| 14839 } | 14836 } |
| OLD | NEW |