Chromium Code Reviews| Index: src/heap.cc |
| diff --git a/src/heap.cc b/src/heap.cc |
| index 532186a5955138da5503acb7644d144b2b22cdd2..175cb8900fd2c7bdc22a9a1e89d1fa23e6c4e907 100644 |
| --- a/src/heap.cc |
| +++ b/src/heap.cc |
| @@ -2387,6 +2387,11 @@ bool Heap::CreateInitialMaps() { |
| } |
| set_heap_number_map(Map::cast(obj)); |
| + { MaybeObject* maybe_obj = AllocateMap(SYMBOL_TYPE, Symbol::kSize); |
| + if (!maybe_obj->ToObject(&obj)) return false; |
| + } |
| + set_symbol_map(Map::cast(obj)); |
| + |
| { MaybeObject* maybe_obj = AllocateMap(FOREIGN_TYPE, Foreign::kSize); |
| if (!maybe_obj->ToObject(&obj)) return false; |
| } |
| @@ -5170,6 +5175,34 @@ MaybeObject* Heap::AllocateHashTable(int length, PretenureFlag pretenure) { |
| } |
| +MaybeObject* Heap::AllocateSymbol(PretenureFlag pretenure) { |
| + // Statically ensure that it is safe to allocate heap numbers in paged spaces. |
| + STATIC_ASSERT(HeapNumber::kSize <= Page::kNonCodeObjectAreaSize); |
|
Michael Starzinger
2013/02/12 10:03:53
Both comment and assertion are out-dated and use t
rossberg
2013/02/13 10:04:28
Oops, done.
|
| + AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; |
| + |
| + Object* result; |
| + MaybeObject* maybe = AllocateRaw(Symbol::kSize, space, OLD_DATA_SPACE); |
| + if (!maybe->ToObject(&result)) return maybe; |
| + |
| + HeapObject::cast(result)->set_map_no_write_barrier(symbol_map()); |
| + |
| + // Generate a random hash value. |
| + int hash; |
| + int attempts = 0; |
| + do { |
| + hash = V8::RandomPrivate(isolate()) & Name::kHashBitMask; |
| + attempts++; |
| + } while (hash == 0 && attempts < 30); |
| + if (hash == 0) hash = 1; // never return 0 |
| + |
| + Symbol::cast(result)->set_hash_field( |
| + Name::kIsNotArrayIndexMask | (hash << Name::kHashShift)); |
| + |
| + ASSERT(result->IsSymbol()); |
| + return result; |
| +} |
| + |
| + |
| MaybeObject* Heap::AllocateNativeContext() { |
| Object* result; |
| { MaybeObject* maybe_result = |