| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 | 77 |
| 78 // semispace_size_ should be a power of 2 and old_generation_size_ should be | 78 // semispace_size_ should be a power of 2 and old_generation_size_ should be |
| 79 // a multiple of Page::kPageSize. | 79 // a multiple of Page::kPageSize. |
| 80 int Heap::semispace_size_ = 2*MB; | 80 int Heap::semispace_size_ = 2*MB; |
| 81 int Heap::old_generation_size_ = 512*MB; | 81 int Heap::old_generation_size_ = 512*MB; |
| 82 int Heap::initial_semispace_size_ = 256*KB; | 82 int Heap::initial_semispace_size_ = 256*KB; |
| 83 | 83 |
| 84 GCCallback Heap::global_gc_prologue_callback_ = NULL; | 84 GCCallback Heap::global_gc_prologue_callback_ = NULL; |
| 85 GCCallback Heap::global_gc_epilogue_callback_ = NULL; | 85 GCCallback Heap::global_gc_epilogue_callback_ = NULL; |
| 86 | 86 |
| 87 ExternalSymbolCallback Heap::global_external_symbol_callback_ = NULL; | |
| 88 | |
| 89 // Variables set based on semispace_size_ and old_generation_size_ in | 87 // Variables set based on semispace_size_ and old_generation_size_ in |
| 90 // ConfigureHeap. | 88 // ConfigureHeap. |
| 91 int Heap::young_generation_size_ = 0; // Will be 2 * semispace_size_. | 89 int Heap::young_generation_size_ = 0; // Will be 2 * semispace_size_. |
| 92 | 90 |
| 93 // Double the new space after this many scavenge collections. | 91 // Double the new space after this many scavenge collections. |
| 94 int Heap::new_space_growth_limit_ = 8; | 92 int Heap::new_space_growth_limit_ = 8; |
| 95 int Heap::scavenge_count_ = 0; | 93 int Heap::scavenge_count_ = 0; |
| 96 Heap::HeapState Heap::gc_state_ = NOT_IN_GC; | 94 Heap::HeapState Heap::gc_state_ = NOT_IN_GC; |
| 97 | 95 |
| 98 int Heap::mc_count_ = 0; | 96 int Heap::mc_count_ = 0; |
| (...skipping 1427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 if (result->IsFailure()) return result; | 1524 if (result->IsFailure()) return result; |
| 1527 | 1525 |
| 1528 ExternalTwoByteString* external_string = ExternalTwoByteString::cast(result); | 1526 ExternalTwoByteString* external_string = ExternalTwoByteString::cast(result); |
| 1529 external_string->set_length(length); | 1527 external_string->set_length(length); |
| 1530 external_string->set_resource(resource); | 1528 external_string->set_resource(resource); |
| 1531 | 1529 |
| 1532 return result; | 1530 return result; |
| 1533 } | 1531 } |
| 1534 | 1532 |
| 1535 | 1533 |
| 1536 Object* Heap::AllocateExternalSymbolFromTwoByte( | |
| 1537 ExternalTwoByteString::Resource* resource) { | |
| 1538 int length = resource->length(); | |
| 1539 | |
| 1540 Map* map = ExternalTwoByteString::SymbolMap(length); | |
| 1541 Object* result = Allocate(map, OLD_DATA_SPACE); | |
| 1542 if (result->IsFailure()) return result; | |
| 1543 | |
| 1544 ExternalTwoByteString* external_string = ExternalTwoByteString::cast(result); | |
| 1545 external_string->set_length(length); | |
| 1546 external_string->set_resource(resource); | |
| 1547 | |
| 1548 return result; | |
| 1549 } | |
| 1550 | |
| 1551 | |
| 1552 Object* Heap::LookupSingleCharacterStringFromCode(uint16_t code) { | 1534 Object* Heap::LookupSingleCharacterStringFromCode(uint16_t code) { |
| 1553 if (code <= String::kMaxAsciiCharCode) { | 1535 if (code <= String::kMaxAsciiCharCode) { |
| 1554 Object* value = Heap::single_character_string_cache()->get(code); | 1536 Object* value = Heap::single_character_string_cache()->get(code); |
| 1555 if (value != Heap::undefined_value()) return value; | 1537 if (value != Heap::undefined_value()) return value; |
| 1556 | 1538 |
| 1557 char buffer[1]; | 1539 char buffer[1]; |
| 1558 buffer[0] = static_cast<char>(code); | 1540 buffer[0] = static_cast<char>(code); |
| 1559 Object* result = LookupSymbol(Vector<const char>(buffer, 1)); | 1541 Object* result = LookupSymbol(Vector<const char>(buffer, 1)); |
| 1560 | 1542 |
| 1561 if (result->IsFailure()) return result; | 1543 if (result->IsFailure()) return result; |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2092 } | 2074 } |
| 2093 | 2075 |
| 2094 | 2076 |
| 2095 Object* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, | 2077 Object* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, |
| 2096 int chars, | 2078 int chars, |
| 2097 uint32_t length_field) { | 2079 uint32_t length_field) { |
| 2098 // Ensure the chars matches the number of characters in the buffer. | 2080 // Ensure the chars matches the number of characters in the buffer. |
| 2099 ASSERT(static_cast<unsigned>(chars) == buffer->Length()); | 2081 ASSERT(static_cast<unsigned>(chars) == buffer->Length()); |
| 2100 // Determine whether the string is ascii. | 2082 // Determine whether the string is ascii. |
| 2101 bool is_ascii = true; | 2083 bool is_ascii = true; |
| 2102 while (buffer->has_more()) { | 2084 while (buffer->has_more() && is_ascii) { |
| 2103 if (buffer->GetNext() > unibrow::Utf8::kMaxOneByteChar) is_ascii = false; | 2085 if (buffer->GetNext() > unibrow::Utf8::kMaxOneByteChar) is_ascii = false; |
| 2104 } | 2086 } |
| 2105 buffer->Rewind(); | 2087 buffer->Rewind(); |
| 2106 | 2088 |
| 2107 // Compute map and object size. | 2089 // Compute map and object size. |
| 2108 int size; | 2090 int size; |
| 2109 Map* map; | 2091 Map* map; |
| 2110 | 2092 |
| 2111 if (is_ascii) { | 2093 if (is_ascii) { |
| 2112 if (chars <= String::kMaxShortStringSize) { | 2094 if (chars <= String::kMaxShortStringSize) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2143 ASSERT_EQ(size, answer->Size()); | 2125 ASSERT_EQ(size, answer->Size()); |
| 2144 | 2126 |
| 2145 // Fill in the characters. | 2127 // Fill in the characters. |
| 2146 for (int i = 0; i < chars; i++) { | 2128 for (int i = 0; i < chars; i++) { |
| 2147 answer->Set(answer_shape, i, buffer->GetNext()); | 2129 answer->Set(answer_shape, i, buffer->GetNext()); |
| 2148 } | 2130 } |
| 2149 return answer; | 2131 return answer; |
| 2150 } | 2132 } |
| 2151 | 2133 |
| 2152 | 2134 |
| 2153 // External string resource that only contains a length field. These | |
| 2154 // are used temporarily when allocating external symbols. | |
| 2155 class DummyExternalStringResource | |
| 2156 : public v8::String::ExternalStringResource { | |
| 2157 public: | |
| 2158 explicit DummyExternalStringResource(size_t length) : length_(length) { } | |
| 2159 | |
| 2160 virtual const uint16_t* data() const { | |
| 2161 UNREACHABLE(); | |
| 2162 return NULL; | |
| 2163 } | |
| 2164 | |
| 2165 virtual size_t length() const { return length_; } | |
| 2166 private: | |
| 2167 size_t length_; | |
| 2168 }; | |
| 2169 | |
| 2170 | |
| 2171 Object* Heap::AllocateExternalSymbol(Vector<const char> string, int chars) { | |
| 2172 // Attempt to allocate the resulting external string first. Use a | |
| 2173 // dummy string resource that has the correct length so that we only | |
| 2174 // have to patch the external string resource after the callback. | |
| 2175 DummyExternalStringResource dummy_resource(chars); | |
| 2176 Object* obj = AllocateExternalSymbolFromTwoByte(&dummy_resource); | |
| 2177 if (obj->IsFailure()) return obj; | |
| 2178 // Perform callback. | |
| 2179 v8::String::ExternalStringResource* resource = | |
| 2180 global_external_symbol_callback_(string.start(), string.length()); | |
| 2181 // Patch the resource pointer of the result. | |
| 2182 ExternalTwoByteString* result = ExternalTwoByteString::cast(obj); | |
| 2183 result->set_resource(resource); | |
| 2184 // Force hash code to be computed. | |
| 2185 result->Hash(); | |
| 2186 ASSERT(result->IsEqualTo(string)); | |
| 2187 return result; | |
| 2188 } | |
| 2189 | |
| 2190 | |
| 2191 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { | 2135 Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { |
| 2192 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; | 2136 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| 2193 int size = SeqAsciiString::SizeFor(length); | 2137 int size = SeqAsciiString::SizeFor(length); |
| 2194 if (size > MaxHeapObjectSize()) { | 2138 if (size > MaxHeapObjectSize()) { |
| 2195 space = LO_SPACE; | 2139 space = LO_SPACE; |
| 2196 } | 2140 } |
| 2197 | 2141 |
| 2198 // Use AllocateRaw rather than Allocate because the object's size cannot be | 2142 // Use AllocateRaw rather than Allocate because the object's size cannot be |
| 2199 // determined from the map. | 2143 // determined from the map. |
| 2200 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); | 2144 Object* result = AllocateRaw(size, space, OLD_DATA_SPACE); |
| (...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3356 #ifdef DEBUG | 3300 #ifdef DEBUG |
| 3357 bool Heap::GarbageCollectionGreedyCheck() { | 3301 bool Heap::GarbageCollectionGreedyCheck() { |
| 3358 ASSERT(FLAG_gc_greedy); | 3302 ASSERT(FLAG_gc_greedy); |
| 3359 if (Bootstrapper::IsActive()) return true; | 3303 if (Bootstrapper::IsActive()) return true; |
| 3360 if (disallow_allocation_failure()) return true; | 3304 if (disallow_allocation_failure()) return true; |
| 3361 return CollectGarbage(0, NEW_SPACE); | 3305 return CollectGarbage(0, NEW_SPACE); |
| 3362 } | 3306 } |
| 3363 #endif | 3307 #endif |
| 3364 | 3308 |
| 3365 } } // namespace v8::internal | 3309 } } // namespace v8::internal |
| OLD | NEW |