| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 CompileRun("function cons(a, b) { return a + b; }" | 601 CompileRun("function cons(a, b) { return a + b; }" |
| 602 "function slice(a) { return a.substring(1); }"); | 602 "function slice(a) { return a.substring(1); }"); |
| 603 // Create a cons string that will land in old pointer space. | 603 // Create a cons string that will land in old pointer space. |
| 604 Local<String> cons = Local<String>::Cast(CompileRun( | 604 Local<String> cons = Local<String>::Cast(CompileRun( |
| 605 "cons('abcdefghijklm', 'nopqrstuvwxyz');")); | 605 "cons('abcdefghijklm', 'nopqrstuvwxyz');")); |
| 606 // Create a sliced string that will land in old pointer space. | 606 // Create a sliced string that will land in old pointer space. |
| 607 Local<String> slice = Local<String>::Cast(CompileRun( | 607 Local<String> slice = Local<String>::Cast(CompileRun( |
| 608 "slice('abcdefghijklmnopqrstuvwxyz');")); | 608 "slice('abcdefghijklmnopqrstuvwxyz');")); |
| 609 | 609 |
| 610 // Trigger GCs so that the newly allocated string moves to old gen. | 610 // Trigger GCs so that the newly allocated string moves to old gen. |
| 611 SimulateFullSpace(CcTest::heap()->old_space()); | 611 SimulateFullSpace(CcTest::heap()->old_pointer_space()); |
| 612 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 612 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 613 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 613 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
| 614 | 614 |
| 615 // Turn into external string with unaligned resource data. | 615 // Turn into external string with unaligned resource data. |
| 616 const char* c_cons = "_abcdefghijklmnopqrstuvwxyz"; | 616 const char* c_cons = "_abcdefghijklmnopqrstuvwxyz"; |
| 617 bool success = | 617 bool success = |
| 618 cons->MakeExternal(new TestOneByteResource(i::StrDup(c_cons), NULL, 1)); | 618 cons->MakeExternal(new TestOneByteResource(i::StrDup(c_cons), NULL, 1)); |
| 619 CHECK(success); | 619 CHECK(success); |
| 620 const char* c_slice = "_bcdefghijklmnopqrstuvwxyz"; | 620 const char* c_slice = "_bcdefghijklmnopqrstuvwxyz"; |
| 621 success = | 621 success = |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 int dispose_count = 0; | 721 int dispose_count = 0; |
| 722 bool in_new_space = false; | 722 bool in_new_space = false; |
| 723 { | 723 { |
| 724 v8::HandleScope scope(CcTest::isolate()); | 724 v8::HandleScope scope(CcTest::isolate()); |
| 725 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 725 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
| 726 Local<String> string = String::NewExternal( | 726 Local<String> string = String::NewExternal( |
| 727 CcTest::isolate(), new TestResource(two_byte_string, &dispose_count)); | 727 CcTest::isolate(), new TestResource(two_byte_string, &dispose_count)); |
| 728 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 728 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 729 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 729 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
| 730 in_new_space = CcTest::heap()->InNewSpace(*istring); | 730 in_new_space = CcTest::heap()->InNewSpace(*istring); |
| 731 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); | 731 CHECK(in_new_space || CcTest::heap()->old_data_space()->Contains(*istring)); |
| 732 CHECK_EQ(0, dispose_count); | 732 CHECK_EQ(0, dispose_count); |
| 733 } | 733 } |
| 734 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); | 734 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE |
| 735 : i::OLD_DATA_SPACE); |
| 735 CHECK_EQ(1, dispose_count); | 736 CHECK_EQ(1, dispose_count); |
| 736 } | 737 } |
| 737 | 738 |
| 738 | 739 |
| 739 THREADED_TEST(ScavengeExternalOneByteString) { | 740 THREADED_TEST(ScavengeExternalOneByteString) { |
| 740 i::FLAG_stress_compaction = false; | 741 i::FLAG_stress_compaction = false; |
| 741 i::FLAG_gc_global = false; | 742 i::FLAG_gc_global = false; |
| 742 int dispose_count = 0; | 743 int dispose_count = 0; |
| 743 bool in_new_space = false; | 744 bool in_new_space = false; |
| 744 { | 745 { |
| 745 v8::HandleScope scope(CcTest::isolate()); | 746 v8::HandleScope scope(CcTest::isolate()); |
| 746 const char* one_byte_string = "test string"; | 747 const char* one_byte_string = "test string"; |
| 747 Local<String> string = String::NewExternal( | 748 Local<String> string = String::NewExternal( |
| 748 CcTest::isolate(), | 749 CcTest::isolate(), |
| 749 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count)); | 750 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count)); |
| 750 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 751 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
| 751 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 752 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
| 752 in_new_space = CcTest::heap()->InNewSpace(*istring); | 753 in_new_space = CcTest::heap()->InNewSpace(*istring); |
| 753 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); | 754 CHECK(in_new_space || CcTest::heap()->old_data_space()->Contains(*istring)); |
| 754 CHECK_EQ(0, dispose_count); | 755 CHECK_EQ(0, dispose_count); |
| 755 } | 756 } |
| 756 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); | 757 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE |
| 758 : i::OLD_DATA_SPACE); |
| 757 CHECK_EQ(1, dispose_count); | 759 CHECK_EQ(1, dispose_count); |
| 758 } | 760 } |
| 759 | 761 |
| 760 | 762 |
| 761 class TestOneByteResourceWithDisposeControl : public TestOneByteResource { | 763 class TestOneByteResourceWithDisposeControl : public TestOneByteResource { |
| 762 public: | 764 public: |
| 763 // Only used by non-threaded tests, so it can use static fields. | 765 // Only used by non-threaded tests, so it can use static fields. |
| 764 static int dispose_calls; | 766 static int dispose_calls; |
| 765 static int dispose_count; | 767 static int dispose_count; |
| 766 | 768 |
| (...skipping 15142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15909 | 15911 |
| 15910 | 15912 |
| 15911 TEST(ExternalizeOldSpaceTwoByteCons) { | 15913 TEST(ExternalizeOldSpaceTwoByteCons) { |
| 15912 v8::Isolate* isolate = CcTest::isolate(); | 15914 v8::Isolate* isolate = CcTest::isolate(); |
| 15913 LocalContext env; | 15915 LocalContext env; |
| 15914 v8::HandleScope scope(isolate); | 15916 v8::HandleScope scope(isolate); |
| 15915 v8::Local<v8::String> cons = | 15917 v8::Local<v8::String> cons = |
| 15916 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")->ToString(isolate); | 15918 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")->ToString(isolate); |
| 15917 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString()); | 15919 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString()); |
| 15918 CcTest::heap()->CollectAllAvailableGarbage(); | 15920 CcTest::heap()->CollectAllAvailableGarbage(); |
| 15919 CHECK(CcTest::heap()->old_space()->Contains(*v8::Utils::OpenHandle(*cons))); | 15921 CHECK(CcTest::heap()->old_pointer_space()->Contains( |
| 15922 *v8::Utils::OpenHandle(*cons))); |
| 15920 | 15923 |
| 15921 TestResource* resource = new TestResource( | 15924 TestResource* resource = new TestResource( |
| 15922 AsciiToTwoByteString("Romeo Montague Juliet Capulet")); | 15925 AsciiToTwoByteString("Romeo Montague Juliet Capulet")); |
| 15923 cons->MakeExternal(resource); | 15926 cons->MakeExternal(resource); |
| 15924 | 15927 |
| 15925 CHECK(cons->IsExternal()); | 15928 CHECK(cons->IsExternal()); |
| 15926 CHECK_EQ(resource, cons->GetExternalStringResource()); | 15929 CHECK_EQ(resource, cons->GetExternalStringResource()); |
| 15927 String::Encoding encoding; | 15930 String::Encoding encoding; |
| 15928 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding)); | 15931 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding)); |
| 15929 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); | 15932 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); |
| 15930 } | 15933 } |
| 15931 | 15934 |
| 15932 | 15935 |
| 15933 TEST(ExternalizeOldSpaceOneByteCons) { | 15936 TEST(ExternalizeOldSpaceOneByteCons) { |
| 15934 v8::Isolate* isolate = CcTest::isolate(); | 15937 v8::Isolate* isolate = CcTest::isolate(); |
| 15935 LocalContext env; | 15938 LocalContext env; |
| 15936 v8::HandleScope scope(isolate); | 15939 v8::HandleScope scope(isolate); |
| 15937 v8::Local<v8::String> cons = | 15940 v8::Local<v8::String> cons = |
| 15938 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")->ToString(isolate); | 15941 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")->ToString(isolate); |
| 15939 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString()); | 15942 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString()); |
| 15940 CcTest::heap()->CollectAllAvailableGarbage(); | 15943 CcTest::heap()->CollectAllAvailableGarbage(); |
| 15941 CHECK(CcTest::heap()->old_space()->Contains(*v8::Utils::OpenHandle(*cons))); | 15944 CHECK(CcTest::heap()->old_pointer_space()->Contains( |
| 15945 *v8::Utils::OpenHandle(*cons))); |
| 15942 | 15946 |
| 15943 TestOneByteResource* resource = | 15947 TestOneByteResource* resource = |
| 15944 new TestOneByteResource(i::StrDup("Romeo Montague Juliet Capulet")); | 15948 new TestOneByteResource(i::StrDup("Romeo Montague Juliet Capulet")); |
| 15945 cons->MakeExternal(resource); | 15949 cons->MakeExternal(resource); |
| 15946 | 15950 |
| 15947 CHECK(cons->IsExternalOneByte()); | 15951 CHECK(cons->IsExternalOneByte()); |
| 15948 CHECK_EQ(resource, cons->GetExternalOneByteStringResource()); | 15952 CHECK_EQ(resource, cons->GetExternalOneByteStringResource()); |
| 15949 String::Encoding encoding; | 15953 String::Encoding encoding; |
| 15950 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding)); | 15954 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding)); |
| 15951 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); | 15955 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); |
| (...skipping 5678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21630 } | 21634 } |
| 21631 { | 21635 { |
| 21632 v8::TryCatch try_catch; | 21636 v8::TryCatch try_catch; |
| 21633 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); | 21637 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); |
| 21634 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString, | 21638 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString, |
| 21635 length).IsEmpty()); | 21639 length).IsEmpty()); |
| 21636 CHECK(!try_catch.HasCaught()); | 21640 CHECK(!try_catch.HasCaught()); |
| 21637 } | 21641 } |
| 21638 free(buffer); | 21642 free(buffer); |
| 21639 } | 21643 } |
| OLD | NEW |