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 3369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3380 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); | 3380 STATIC_ASSERT(Foreign::kSize <= Page::kMaxRegularHeapObjectSize); |
3381 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 3381 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
3382 Foreign* result; | 3382 Foreign* result; |
3383 MaybeObject* maybe_result = Allocate(foreign_map(), space); | 3383 MaybeObject* maybe_result = Allocate(foreign_map(), space); |
3384 if (!maybe_result->To(&result)) return maybe_result; | 3384 if (!maybe_result->To(&result)) return maybe_result; |
3385 result->set_foreign_address(address); | 3385 result->set_foreign_address(address); |
3386 return result; | 3386 return result; |
3387 } | 3387 } |
3388 | 3388 |
3389 | 3389 |
3390 MaybeObject* Heap::LookupSingleCharacterStringFromCode(uint16_t code) { | |
3391 if (code <= String::kMaxOneByteCharCode) { | |
3392 Object* value = single_character_string_cache()->get(code); | |
3393 if (value != undefined_value()) return value; | |
3394 | |
3395 uint8_t buffer[1]; | |
3396 buffer[0] = static_cast<uint8_t>(code); | |
3397 Object* result; | |
3398 OneByteStringKey key(Vector<const uint8_t>(buffer, 1), HashSeed()); | |
3399 MaybeObject* maybe_result = InternalizeStringWithKey(&key); | |
3400 | |
3401 if (!maybe_result->ToObject(&result)) return maybe_result; | |
3402 single_character_string_cache()->set(code, result); | |
3403 return result; | |
3404 } | |
3405 | |
3406 SeqTwoByteString* result; | |
3407 { MaybeObject* maybe_result = AllocateRawTwoByteString(1, NOT_TENURED); | |
3408 if (!maybe_result->To<SeqTwoByteString>(&result)) return maybe_result; | |
3409 } | |
3410 result->SeqTwoByteStringSet(0, code); | |
3411 return result; | |
3412 } | |
3413 | |
3414 | |
3415 MaybeObject* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { | 3390 MaybeObject* Heap::AllocateByteArray(int length, PretenureFlag pretenure) { |
3416 if (length < 0 || length > ByteArray::kMaxLength) { | 3391 if (length < 0 || length > ByteArray::kMaxLength) { |
3417 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); | 3392 v8::internal::Heap::FatalProcessOutOfMemory("invalid array length", true); |
3418 } | 3393 } |
3419 int size = ByteArray::SizeFor(length); | 3394 int size = ByteArray::SizeFor(length); |
3420 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); | 3395 AllocationSpace space = SelectSpace(size, OLD_DATA_SPACE, pretenure); |
3421 Object* result; | 3396 Object* result; |
3422 { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); | 3397 { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); |
3423 if (!maybe_result->ToObject(&result)) return maybe_result; | 3398 if (!maybe_result->ToObject(&result)) return maybe_result; |
3424 } | 3399 } |
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4868 old_data_space_->Verify(&no_dirty_regions_visitor); | 4843 old_data_space_->Verify(&no_dirty_regions_visitor); |
4869 code_space_->Verify(&no_dirty_regions_visitor); | 4844 code_space_->Verify(&no_dirty_regions_visitor); |
4870 cell_space_->Verify(&no_dirty_regions_visitor); | 4845 cell_space_->Verify(&no_dirty_regions_visitor); |
4871 property_cell_space_->Verify(&no_dirty_regions_visitor); | 4846 property_cell_space_->Verify(&no_dirty_regions_visitor); |
4872 | 4847 |
4873 lo_space_->Verify(); | 4848 lo_space_->Verify(); |
4874 } | 4849 } |
4875 #endif | 4850 #endif |
4876 | 4851 |
4877 | 4852 |
4878 MaybeObject* Heap::InternalizeUtf8String(Vector<const char> string) { | |
4879 Utf8StringKey key(string, HashSeed()); | |
4880 return InternalizeStringWithKey(&key); | |
4881 } | |
4882 | |
4883 | |
4884 MaybeObject* Heap::InternalizeString(String* string) { | |
4885 if (string->IsInternalizedString()) return string; | |
4886 Object* result = NULL; | |
4887 Object* new_table; | |
4888 { MaybeObject* maybe_new_table = | |
4889 string_table()->LookupString(string, &result); | |
4890 if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; | |
4891 } | |
4892 // Can't use set_string_table because StringTable::cast knows that | |
4893 // StringTable is a singleton and checks for identity. | |
4894 roots_[kStringTableRootIndex] = new_table; | |
4895 ASSERT(result != NULL); | |
4896 return result; | |
4897 } | |
4898 | |
4899 | |
4900 bool Heap::InternalizeStringIfExists(String* string, String** result) { | 4853 bool Heap::InternalizeStringIfExists(String* string, String** result) { |
4901 if (string->IsInternalizedString()) { | 4854 if (string->IsInternalizedString()) { |
4902 *result = string; | 4855 *result = string; |
4903 return true; | 4856 return true; |
4904 } | 4857 } |
4905 return string_table()->LookupStringIfExists(string, result); | 4858 return string_table()->LookupStringIfExists(string, result); |
4906 } | 4859 } |
4907 | 4860 |
4908 | 4861 |
4909 MaybeObject* Heap::InternalizeStringWithKey(HashTableKey* key) { | |
4910 Object* result = NULL; | |
4911 Object* new_table; | |
4912 { MaybeObject* maybe_new_table = | |
4913 string_table()->LookupKey(key, &result); | |
4914 if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table; | |
4915 } | |
4916 // Can't use set_string_table because StringTable::cast knows that | |
4917 // StringTable is a singleton and checks for identity. | |
4918 roots_[kStringTableRootIndex] = new_table; | |
4919 ASSERT(result != NULL); | |
4920 return result; | |
4921 } | |
4922 | |
4923 | |
4924 void Heap::ZapFromSpace() { | 4862 void Heap::ZapFromSpace() { |
4925 NewSpacePageIterator it(new_space_.FromSpaceStart(), | 4863 NewSpacePageIterator it(new_space_.FromSpaceStart(), |
4926 new_space_.FromSpaceEnd()); | 4864 new_space_.FromSpaceEnd()); |
4927 while (it.has_next()) { | 4865 while (it.has_next()) { |
4928 NewSpacePage* page = it.next(); | 4866 NewSpacePage* page = it.next(); |
4929 for (Address cursor = page->area_start(), limit = page->area_end(); | 4867 for (Address cursor = page->area_start(), limit = page->area_end(); |
4930 cursor < limit; | 4868 cursor < limit; |
4931 cursor += kPointerSize) { | 4869 cursor += kPointerSize) { |
4932 Memory::Address_at(cursor) = kFromSpaceZapValue; | 4870 Memory::Address_at(cursor) = kFromSpaceZapValue; |
4933 } | 4871 } |
(...skipping 1803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6737 static_cast<int>(object_sizes_last_time_[index])); | 6675 static_cast<int>(object_sizes_last_time_[index])); |
6738 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6676 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
6739 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6677 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
6740 | 6678 |
6741 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6679 OS::MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
6742 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6680 OS::MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
6743 ClearObjectStats(); | 6681 ClearObjectStats(); |
6744 } | 6682 } |
6745 | 6683 |
6746 } } // namespace v8::internal | 6684 } } // namespace v8::internal |
OLD | NEW |