Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/heap.cc

Issue 8816020: More removal of write barriers and a rename to a less scary name. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/heap-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1795 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 1806
1807 MaybeObject* Heap::AllocateMap(InstanceType instance_type, 1807 MaybeObject* Heap::AllocateMap(InstanceType instance_type,
1808 int instance_size, 1808 int instance_size,
1809 ElementsKind elements_kind) { 1809 ElementsKind elements_kind) {
1810 Object* result; 1810 Object* result;
1811 { MaybeObject* maybe_result = AllocateRawMap(); 1811 { MaybeObject* maybe_result = AllocateRawMap();
1812 if (!maybe_result->ToObject(&result)) return maybe_result; 1812 if (!maybe_result->ToObject(&result)) return maybe_result;
1813 } 1813 }
1814 1814
1815 Map* map = reinterpret_cast<Map*>(result); 1815 Map* map = reinterpret_cast<Map*>(result);
1816 map->set_map_unsafe(meta_map()); 1816 map->set_map_no_wb(meta_map());
1817 map->set_instance_type(instance_type); 1817 map->set_instance_type(instance_type);
1818 map->set_visitor_id( 1818 map->set_visitor_id(
1819 StaticVisitorBase::GetVisitorId(instance_type, instance_size)); 1819 StaticVisitorBase::GetVisitorId(instance_type, instance_size));
1820 map->set_prototype(null_value(), SKIP_WRITE_BARRIER); 1820 map->set_prototype(null_value(), SKIP_WRITE_BARRIER);
1821 map->set_constructor(null_value(), SKIP_WRITE_BARRIER); 1821 map->set_constructor(null_value(), SKIP_WRITE_BARRIER);
1822 map->set_instance_size(instance_size); 1822 map->set_instance_size(instance_size);
1823 map->set_inobject_properties(0); 1823 map->set_inobject_properties(0);
1824 map->set_pre_allocated_property_fields(0); 1824 map->set_pre_allocated_property_fields(0);
1825 map->init_instance_descriptors(); 1825 map->init_instance_descriptors();
1826 map->set_code_cache(empty_fixed_array(), SKIP_WRITE_BARRIER); 1826 map->set_code_cache(empty_fixed_array(), SKIP_WRITE_BARRIER);
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
2166 // spaces. 2166 // spaces.
2167 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); 2167 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize);
2168 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; 2168 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE;
2169 2169
2170 Object* result; 2170 Object* result;
2171 { MaybeObject* maybe_result = 2171 { MaybeObject* maybe_result =
2172 AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE); 2172 AllocateRaw(HeapNumber::kSize, space, OLD_DATA_SPACE);
2173 if (!maybe_result->ToObject(&result)) return maybe_result; 2173 if (!maybe_result->ToObject(&result)) return maybe_result;
2174 } 2174 }
2175 2175
2176 HeapObject::cast(result)->set_map_unsafe(heap_number_map()); 2176 HeapObject::cast(result)->set_map_no_wb(heap_number_map());
2177 HeapNumber::cast(result)->set_value(value); 2177 HeapNumber::cast(result)->set_value(value);
2178 return result; 2178 return result;
2179 } 2179 }
2180 2180
2181 2181
2182 MaybeObject* Heap::AllocateHeapNumber(double value) { 2182 MaybeObject* Heap::AllocateHeapNumber(double value) {
2183 // Use general version, if we're forced to always allocate. 2183 // Use general version, if we're forced to always allocate.
2184 if (always_allocate()) return AllocateHeapNumber(value, TENURED); 2184 if (always_allocate()) return AllocateHeapNumber(value, TENURED);
2185 2185
2186 // This version of AllocateHeapNumber is optimized for 2186 // This version of AllocateHeapNumber is optimized for
2187 // allocation in new space. 2187 // allocation in new space.
2188 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize); 2188 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxHeapObjectSize);
2189 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC); 2189 ASSERT(allocation_allowed_ && gc_state_ == NOT_IN_GC);
2190 Object* result; 2190 Object* result;
2191 { MaybeObject* maybe_result = new_space_.AllocateRaw(HeapNumber::kSize); 2191 { MaybeObject* maybe_result = new_space_.AllocateRaw(HeapNumber::kSize);
2192 if (!maybe_result->ToObject(&result)) return maybe_result; 2192 if (!maybe_result->ToObject(&result)) return maybe_result;
2193 } 2193 }
2194 HeapObject::cast(result)->set_map_unsafe(heap_number_map()); 2194 HeapObject::cast(result)->set_map_no_wb(heap_number_map());
2195 HeapNumber::cast(result)->set_value(value); 2195 HeapNumber::cast(result)->set_value(value);
2196 return result; 2196 return result;
2197 } 2197 }
2198 2198
2199 2199
2200 MaybeObject* Heap::AllocateJSGlobalPropertyCell(Object* value) { 2200 MaybeObject* Heap::AllocateJSGlobalPropertyCell(Object* value) {
2201 Object* result; 2201 Object* result;
2202 { MaybeObject* maybe_result = AllocateRawCell(); 2202 { MaybeObject* maybe_result = AllocateRawCell();
2203 if (!maybe_result->ToObject(&result)) return maybe_result; 2203 if (!maybe_result->ToObject(&result)) return maybe_result;
2204 } 2204 }
2205 HeapObject::cast(result)->set_map_unsafe(global_property_cell_map()); 2205 HeapObject::cast(result)->set_map_no_wb(global_property_cell_map());
2206 JSGlobalPropertyCell::cast(result)->set_value(value); 2206 JSGlobalPropertyCell::cast(result)->set_value(value);
2207 return result; 2207 return result;
2208 } 2208 }
2209 2209
2210 2210
2211 MaybeObject* Heap::CreateOddball(const char* to_string, 2211 MaybeObject* Heap::CreateOddball(const char* to_string,
2212 Object* to_number, 2212 Object* to_number,
2213 byte kind) { 2213 byte kind) {
2214 Object* result; 2214 Object* result;
2215 { MaybeObject* maybe_result = Allocate(oddball_map(), OLD_POINTER_SPACE); 2215 { MaybeObject* maybe_result = Allocate(oddball_map(), OLD_POINTER_SPACE);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
2536 if (array->length() < 100) { // Limit how many new symbols we want to make. 2536 if (array->length() < 100) { // Limit how many new symbols we want to make.
2537 for (int i = 0; i < array->length(); i++) { 2537 for (int i = 0; i < array->length(); i++) {
2538 String* str = String::cast(array->get(i)); 2538 String* str = String::cast(array->get(i));
2539 Object* symbol; 2539 Object* symbol;
2540 MaybeObject* maybe_symbol = heap->LookupSymbol(str); 2540 MaybeObject* maybe_symbol = heap->LookupSymbol(str);
2541 if (maybe_symbol->ToObject(&symbol)) { 2541 if (maybe_symbol->ToObject(&symbol)) {
2542 array->set(i, symbol); 2542 array->set(i, symbol);
2543 } 2543 }
2544 } 2544 }
2545 } 2545 }
2546 array->set_map(heap->fixed_cow_array_map()); 2546 array->set_map_no_wb(heap->fixed_cow_array_map());
2547 } 2547 }
2548 2548
2549 2549
2550 void StringSplitCache::Clear(FixedArray* cache) { 2550 void StringSplitCache::Clear(FixedArray* cache) {
2551 for (int i = 0; i < kStringSplitCacheSize; i++) { 2551 for (int i = 0; i < kStringSplitCacheSize; i++) {
2552 cache->set(i, Smi::FromInt(0)); 2552 cache->set(i, Smi::FromInt(0));
2553 } 2553 }
2554 } 2554 }
2555 2555
2556 2556
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
3132 return AllocateByteArray(length); 3132 return AllocateByteArray(length);
3133 } 3133 }
3134 int size = ByteArray::SizeFor(length); 3134 int size = ByteArray::SizeFor(length);
3135 Object* result; 3135 Object* result;
3136 { MaybeObject* maybe_result = (size <= MaxObjectSizeInPagedSpace()) 3136 { MaybeObject* maybe_result = (size <= MaxObjectSizeInPagedSpace())
3137 ? old_data_space_->AllocateRaw(size) 3137 ? old_data_space_->AllocateRaw(size)
3138 : lo_space_->AllocateRaw(size, NOT_EXECUTABLE); 3138 : lo_space_->AllocateRaw(size, NOT_EXECUTABLE);
3139 if (!maybe_result->ToObject(&result)) return maybe_result; 3139 if (!maybe_result->ToObject(&result)) return maybe_result;
3140 } 3140 }
3141 3141
3142 reinterpret_cast<ByteArray*>(result)->set_map_unsafe(byte_array_map()); 3142 reinterpret_cast<ByteArray*>(result)->set_map_no_wb(byte_array_map());
3143 reinterpret_cast<ByteArray*>(result)->set_length(length); 3143 reinterpret_cast<ByteArray*>(result)->set_length(length);
3144 return result; 3144 return result;
3145 } 3145 }
3146 3146
3147 3147
3148 MaybeObject* Heap::AllocateByteArray(int length) { 3148 MaybeObject* Heap::AllocateByteArray(int length) {
3149 if (length < 0 || length > ByteArray::kMaxLength) { 3149 if (length < 0 || length > ByteArray::kMaxLength) {
3150 return Failure::OutOfMemoryException(); 3150 return Failure::OutOfMemoryException();
3151 } 3151 }
3152 int size = ByteArray::SizeFor(length); 3152 int size = ByteArray::SizeFor(length);
3153 AllocationSpace space = 3153 AllocationSpace space =
3154 (size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : NEW_SPACE; 3154 (size > MaxObjectSizeInPagedSpace()) ? LO_SPACE : NEW_SPACE;
3155 Object* result; 3155 Object* result;
3156 { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE); 3156 { MaybeObject* maybe_result = AllocateRaw(size, space, OLD_DATA_SPACE);
3157 if (!maybe_result->ToObject(&result)) return maybe_result; 3157 if (!maybe_result->ToObject(&result)) return maybe_result;
3158 } 3158 }
3159 3159
3160 reinterpret_cast<ByteArray*>(result)->set_map_unsafe(byte_array_map()); 3160 reinterpret_cast<ByteArray*>(result)->set_map_no_wb(byte_array_map());
3161 reinterpret_cast<ByteArray*>(result)->set_length(length); 3161 reinterpret_cast<ByteArray*>(result)->set_length(length);
3162 return result; 3162 return result;
3163 } 3163 }
3164 3164
3165 3165
3166 void Heap::CreateFillerObjectAt(Address addr, int size) { 3166 void Heap::CreateFillerObjectAt(Address addr, int size) {
3167 if (size == 0) return; 3167 if (size == 0) return;
3168 HeapObject* filler = HeapObject::FromAddress(addr); 3168 HeapObject* filler = HeapObject::FromAddress(addr);
3169 if (size == kPointerSize) { 3169 if (size == kPointerSize) {
3170 filler->set_map_unsafe(one_pointer_filler_map()); 3170 filler->set_map_no_wb(one_pointer_filler_map());
3171 } else if (size == 2 * kPointerSize) { 3171 } else if (size == 2 * kPointerSize) {
3172 filler->set_map_unsafe(two_pointer_filler_map()); 3172 filler->set_map_no_wb(two_pointer_filler_map());
3173 } else { 3173 } else {
3174 filler->set_map_unsafe(free_space_map()); 3174 filler->set_map_no_wb(free_space_map());
3175 FreeSpace::cast(filler)->set_size(size); 3175 FreeSpace::cast(filler)->set_size(size);
3176 } 3176 }
3177 } 3177 }
3178 3178
3179 3179
3180 MaybeObject* Heap::AllocateExternalArray(int length, 3180 MaybeObject* Heap::AllocateExternalArray(int length,
3181 ExternalArrayType array_type, 3181 ExternalArrayType array_type,
3182 void* external_pointer, 3182 void* external_pointer,
3183 PretenureFlag pretenure) { 3183 PretenureFlag pretenure) {
3184 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE; 3184 AllocationSpace space = (pretenure == TENURED) ? OLD_DATA_SPACE : NEW_SPACE;
3185 Object* result; 3185 Object* result;
3186 { MaybeObject* maybe_result = AllocateRaw(ExternalArray::kAlignedSize, 3186 { MaybeObject* maybe_result = AllocateRaw(ExternalArray::kAlignedSize,
3187 space, 3187 space,
3188 OLD_DATA_SPACE); 3188 OLD_DATA_SPACE);
3189 if (!maybe_result->ToObject(&result)) return maybe_result; 3189 if (!maybe_result->ToObject(&result)) return maybe_result;
3190 } 3190 }
3191 3191
3192 reinterpret_cast<ExternalArray*>(result)->set_map_unsafe( 3192 reinterpret_cast<ExternalArray*>(result)->set_map_no_wb(
3193 MapForExternalArrayType(array_type)); 3193 MapForExternalArrayType(array_type));
3194 reinterpret_cast<ExternalArray*>(result)->set_length(length); 3194 reinterpret_cast<ExternalArray*>(result)->set_length(length);
3195 reinterpret_cast<ExternalArray*>(result)->set_external_pointer( 3195 reinterpret_cast<ExternalArray*>(result)->set_external_pointer(
3196 external_pointer); 3196 external_pointer);
3197 3197
3198 return result; 3198 return result;
3199 } 3199 }
3200 3200
3201 3201
3202 MaybeObject* Heap::CreateCode(const CodeDesc& desc, 3202 MaybeObject* Heap::CreateCode(const CodeDesc& desc,
(...skipping 16 matching lines...) Expand all
3219 if (obj_size > MaxObjectSizeInPagedSpace() || immovable) { 3219 if (obj_size > MaxObjectSizeInPagedSpace() || immovable) {
3220 maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE); 3220 maybe_result = lo_space_->AllocateRaw(obj_size, EXECUTABLE);
3221 } else { 3221 } else {
3222 maybe_result = code_space_->AllocateRaw(obj_size); 3222 maybe_result = code_space_->AllocateRaw(obj_size);
3223 } 3223 }
3224 3224
3225 Object* result; 3225 Object* result;
3226 if (!maybe_result->ToObject(&result)) return maybe_result; 3226 if (!maybe_result->ToObject(&result)) return maybe_result;
3227 3227
3228 // Initialize the object 3228 // Initialize the object
3229 HeapObject::cast(result)->set_map_unsafe(code_map()); 3229 HeapObject::cast(result)->set_map_no_wb(code_map());
3230 Code* code = Code::cast(result); 3230 Code* code = Code::cast(result);
3231 ASSERT(!isolate_->code_range()->exists() || 3231 ASSERT(!isolate_->code_range()->exists() ||
3232 isolate_->code_range()->contains(code->address())); 3232 isolate_->code_range()->contains(code->address()));
3233 code->set_instruction_size(desc.instr_size); 3233 code->set_instruction_size(desc.instr_size);
3234 code->set_relocation_info(reloc_info); 3234 code->set_relocation_info(reloc_info);
3235 code->set_flags(flags); 3235 code->set_flags(flags);
3236 if (code->is_call_stub() || code->is_keyed_call_stub()) { 3236 if (code->is_call_stub() || code->is_keyed_call_stub()) {
3237 code->set_check_type(RECEIVER_MAP_CHECK); 3237 code->set_check_type(RECEIVER_MAP_CHECK);
3238 } 3238 }
3239 code->set_deoptimization_data(empty_fixed_array(), SKIP_WRITE_BARRIER); 3239 code->set_deoptimization_data(empty_fixed_array(), SKIP_WRITE_BARRIER);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
3348 // If allocation failures are disallowed, we may allocate in a different 3348 // If allocation failures are disallowed, we may allocate in a different
3349 // space when new space is full and the object is not a large object. 3349 // space when new space is full and the object is not a large object.
3350 AllocationSpace retry_space = 3350 AllocationSpace retry_space =
3351 (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type()); 3351 (space != NEW_SPACE) ? space : TargetSpaceId(map->instance_type());
3352 Object* result; 3352 Object* result;
3353 { MaybeObject* maybe_result = 3353 { MaybeObject* maybe_result =
3354 AllocateRaw(map->instance_size(), space, retry_space); 3354 AllocateRaw(map->instance_size(), space, retry_space);
3355 if (!maybe_result->ToObject(&result)) return maybe_result; 3355 if (!maybe_result->ToObject(&result)) return maybe_result;
3356 } 3356 }
3357 // No need for write barrier since object is white and map is in old space. 3357 // No need for write barrier since object is white and map is in old space.
3358 HeapObject::cast(result)->set_map_unsafe(map); 3358 HeapObject::cast(result)->set_map_no_wb(map);
3359 return result; 3359 return result;
3360 } 3360 }
3361 3361
3362 3362
3363 void Heap::InitializeFunction(JSFunction* function, 3363 void Heap::InitializeFunction(JSFunction* function,
3364 SharedFunctionInfo* shared, 3364 SharedFunctionInfo* shared,
3365 Object* prototype) { 3365 Object* prototype) {
3366 ASSERT(!prototype->IsMap()); 3366 ASSERT(!prototype->IsMap());
3367 function->initialize_properties(); 3367 function->initialize_properties();
3368 function->initialize_elements(); 3368 function->initialize_elements();
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after
4077 } 4077 }
4078 4078
4079 // Allocate string. 4079 // Allocate string.
4080 Object* result; 4080 Object* result;
4081 { MaybeObject* maybe_result = (size > MaxObjectSizeInPagedSpace()) 4081 { MaybeObject* maybe_result = (size > MaxObjectSizeInPagedSpace())
4082 ? lo_space_->AllocateRaw(size, NOT_EXECUTABLE) 4082 ? lo_space_->AllocateRaw(size, NOT_EXECUTABLE)
4083 : old_data_space_->AllocateRaw(size); 4083 : old_data_space_->AllocateRaw(size);
4084 if (!maybe_result->ToObject(&result)) return maybe_result; 4084 if (!maybe_result->ToObject(&result)) return maybe_result;
4085 } 4085 }
4086 4086
4087 reinterpret_cast<HeapObject*>(result)->set_map_unsafe(map); 4087 reinterpret_cast<HeapObject*>(result)->set_map_no_wb(map);
4088 // Set length and hash fields of the allocated string. 4088 // Set length and hash fields of the allocated string.
4089 String* answer = String::cast(result); 4089 String* answer = String::cast(result);
4090 answer->set_length(chars); 4090 answer->set_length(chars);
4091 answer->set_hash_field(hash_field); 4091 answer->set_hash_field(hash_field);
4092 4092
4093 ASSERT_EQ(size, answer->Size()); 4093 ASSERT_EQ(size, answer->Size());
4094 4094
4095 // Fill in the characters. 4095 // Fill in the characters.
4096 for (int i = 0; i < chars; i++) { 4096 for (int i = 0; i < chars; i++) {
4097 answer->Set(i, buffer->GetNext()); 4097 answer->Set(i, buffer->GetNext());
(...skipping 23 matching lines...) Expand all
4121 } 4121 }
4122 } else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) { 4122 } else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) {
4123 space = LO_SPACE; 4123 space = LO_SPACE;
4124 } 4124 }
4125 Object* result; 4125 Object* result;
4126 { MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); 4126 { MaybeObject* maybe_result = AllocateRaw(size, space, retry_space);
4127 if (!maybe_result->ToObject(&result)) return maybe_result; 4127 if (!maybe_result->ToObject(&result)) return maybe_result;
4128 } 4128 }
4129 4129
4130 // Partially initialize the object. 4130 // Partially initialize the object.
4131 HeapObject::cast(result)->set_map_unsafe(ascii_string_map()); 4131 HeapObject::cast(result)->set_map_no_wb(ascii_string_map());
4132 String::cast(result)->set_length(length); 4132 String::cast(result)->set_length(length);
4133 String::cast(result)->set_hash_field(String::kEmptyHashField); 4133 String::cast(result)->set_hash_field(String::kEmptyHashField);
4134 ASSERT_EQ(size, HeapObject::cast(result)->Size()); 4134 ASSERT_EQ(size, HeapObject::cast(result)->Size());
4135 return result; 4135 return result;
4136 } 4136 }
4137 4137
4138 4138
4139 MaybeObject* Heap::AllocateRawTwoByteString(int length, 4139 MaybeObject* Heap::AllocateRawTwoByteString(int length,
4140 PretenureFlag pretenure) { 4140 PretenureFlag pretenure) {
4141 if (length < 0 || length > SeqTwoByteString::kMaxLength) { 4141 if (length < 0 || length > SeqTwoByteString::kMaxLength) {
(...skipping 14 matching lines...) Expand all
4156 } 4156 }
4157 } else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) { 4157 } else if (space == OLD_DATA_SPACE && size > MaxObjectSizeInPagedSpace()) {
4158 space = LO_SPACE; 4158 space = LO_SPACE;
4159 } 4159 }
4160 Object* result; 4160 Object* result;
4161 { MaybeObject* maybe_result = AllocateRaw(size, space, retry_space); 4161 { MaybeObject* maybe_result = AllocateRaw(size, space, retry_space);
4162 if (!maybe_result->ToObject(&result)) return maybe_result; 4162 if (!maybe_result->ToObject(&result)) return maybe_result;
4163 } 4163 }
4164 4164
4165 // Partially initialize the object. 4165 // Partially initialize the object.
4166 HeapObject::cast(result)->set_map_unsafe(string_map()); 4166 HeapObject::cast(result)->set_map_no_wb(string_map());
4167 String::cast(result)->set_length(length); 4167 String::cast(result)->set_length(length);
4168 String::cast(result)->set_hash_field(String::kEmptyHashField); 4168 String::cast(result)->set_hash_field(String::kEmptyHashField);
4169 ASSERT_EQ(size, HeapObject::cast(result)->Size()); 4169 ASSERT_EQ(size, HeapObject::cast(result)->Size());
4170 return result; 4170 return result;
4171 } 4171 }
4172 4172
4173 4173
4174 MaybeObject* Heap::AllocateEmptyFixedArray() { 4174 MaybeObject* Heap::AllocateEmptyFixedArray() {
4175 int size = FixedArray::SizeFor(0); 4175 int size = FixedArray::SizeFor(0);
4176 Object* result; 4176 Object* result;
4177 { MaybeObject* maybe_result = 4177 { MaybeObject* maybe_result =
4178 AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); 4178 AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE);
4179 if (!maybe_result->ToObject(&result)) return maybe_result; 4179 if (!maybe_result->ToObject(&result)) return maybe_result;
4180 } 4180 }
4181 // Initialize the object. 4181 // Initialize the object.
4182 reinterpret_cast<FixedArray*>(result)->set_map_unsafe(fixed_array_map()); 4182 reinterpret_cast<FixedArray*>(result)->set_map_no_wb(fixed_array_map());
4183 reinterpret_cast<FixedArray*>(result)->set_length(0); 4183 reinterpret_cast<FixedArray*>(result)->set_length(0);
4184 return result; 4184 return result;
4185 } 4185 }
4186 4186
4187 4187
4188 MaybeObject* Heap::AllocateRawFixedArray(int length) { 4188 MaybeObject* Heap::AllocateRawFixedArray(int length) {
4189 if (length < 0 || length > FixedArray::kMaxLength) { 4189 if (length < 0 || length > FixedArray::kMaxLength) {
4190 return Failure::OutOfMemoryException(); 4190 return Failure::OutOfMemoryException();
4191 } 4191 }
4192 ASSERT(length > 0); 4192 ASSERT(length > 0);
4193 // Use the general function if we're forced to always allocate. 4193 // Use the general function if we're forced to always allocate.
4194 if (always_allocate()) return AllocateFixedArray(length, TENURED); 4194 if (always_allocate()) return AllocateFixedArray(length, TENURED);
4195 // Allocate the raw data for a fixed array. 4195 // Allocate the raw data for a fixed array.
4196 int size = FixedArray::SizeFor(length); 4196 int size = FixedArray::SizeFor(length);
4197 return size <= kMaxObjectSizeInNewSpace 4197 return size <= kMaxObjectSizeInNewSpace
4198 ? new_space_.AllocateRaw(size) 4198 ? new_space_.AllocateRaw(size)
4199 : lo_space_->AllocateRaw(size, NOT_EXECUTABLE); 4199 : lo_space_->AllocateRaw(size, NOT_EXECUTABLE);
4200 } 4200 }
4201 4201
4202 4202
4203 MaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) { 4203 MaybeObject* Heap::CopyFixedArrayWithMap(FixedArray* src, Map* map) {
4204 int len = src->length(); 4204 int len = src->length();
4205 Object* obj; 4205 Object* obj;
4206 { MaybeObject* maybe_obj = AllocateRawFixedArray(len); 4206 { MaybeObject* maybe_obj = AllocateRawFixedArray(len);
4207 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 4207 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
4208 } 4208 }
4209 if (InNewSpace(obj)) { 4209 if (InNewSpace(obj)) {
4210 HeapObject* dst = HeapObject::cast(obj); 4210 HeapObject* dst = HeapObject::cast(obj);
4211 dst->set_map_unsafe(map); 4211 dst->set_map_no_wb(map);
4212 CopyBlock(dst->address() + kPointerSize, 4212 CopyBlock(dst->address() + kPointerSize,
4213 src->address() + kPointerSize, 4213 src->address() + kPointerSize,
4214 FixedArray::SizeFor(len) - kPointerSize); 4214 FixedArray::SizeFor(len) - kPointerSize);
4215 return obj; 4215 return obj;
4216 } 4216 }
4217 HeapObject::cast(obj)->set_map_unsafe(map); 4217 HeapObject::cast(obj)->set_map_no_wb(map);
4218 FixedArray* result = FixedArray::cast(obj); 4218 FixedArray* result = FixedArray::cast(obj);
4219 result->set_length(len); 4219 result->set_length(len);
4220 4220
4221 // Copy the content 4221 // Copy the content
4222 AssertNoAllocation no_gc; 4222 AssertNoAllocation no_gc;
4223 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); 4223 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);
4224 for (int i = 0; i < len; i++) result->set(i, src->get(i), mode); 4224 for (int i = 0; i < len; i++) result->set(i, src->get(i), mode);
4225 return result; 4225 return result;
4226 } 4226 }
4227 4227
4228 4228
4229 MaybeObject* Heap::CopyFixedDoubleArrayWithMap(FixedDoubleArray* src, 4229 MaybeObject* Heap::CopyFixedDoubleArrayWithMap(FixedDoubleArray* src,
4230 Map* map) { 4230 Map* map) {
4231 int len = src->length(); 4231 int len = src->length();
4232 Object* obj; 4232 Object* obj;
4233 { MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(len, NOT_TENURED); 4233 { MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(len, NOT_TENURED);
4234 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 4234 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
4235 } 4235 }
4236 HeapObject* dst = HeapObject::cast(obj); 4236 HeapObject* dst = HeapObject::cast(obj);
4237 dst->set_map_unsafe(map); 4237 dst->set_map_no_wb(map);
4238 CopyBlock( 4238 CopyBlock(
4239 dst->address() + FixedDoubleArray::kLengthOffset, 4239 dst->address() + FixedDoubleArray::kLengthOffset,
4240 src->address() + FixedDoubleArray::kLengthOffset, 4240 src->address() + FixedDoubleArray::kLengthOffset,
4241 FixedDoubleArray::SizeFor(len) - FixedDoubleArray::kLengthOffset); 4241 FixedDoubleArray::SizeFor(len) - FixedDoubleArray::kLengthOffset);
4242 return obj; 4242 return obj;
4243 } 4243 }
4244 4244
4245 4245
4246 MaybeObject* Heap::AllocateFixedArray(int length) { 4246 MaybeObject* Heap::AllocateFixedArray(int length) {
4247 ASSERT(length >= 0); 4247 ASSERT(length >= 0);
4248 if (length == 0) return empty_fixed_array(); 4248 if (length == 0) return empty_fixed_array();
4249 Object* result; 4249 Object* result;
4250 { MaybeObject* maybe_result = AllocateRawFixedArray(length); 4250 { MaybeObject* maybe_result = AllocateRawFixedArray(length);
4251 if (!maybe_result->ToObject(&result)) return maybe_result; 4251 if (!maybe_result->ToObject(&result)) return maybe_result;
4252 } 4252 }
4253 // Initialize header. 4253 // Initialize header.
4254 FixedArray* array = reinterpret_cast<FixedArray*>(result); 4254 FixedArray* array = reinterpret_cast<FixedArray*>(result);
4255 array->set_map_unsafe(fixed_array_map()); 4255 array->set_map_no_wb(fixed_array_map());
4256 array->set_length(length); 4256 array->set_length(length);
4257 // Initialize body. 4257 // Initialize body.
4258 ASSERT(!InNewSpace(undefined_value())); 4258 ASSERT(!InNewSpace(undefined_value()));
4259 MemsetPointer(array->data_start(), undefined_value(), length); 4259 MemsetPointer(array->data_start(), undefined_value(), length);
4260 return result; 4260 return result;
4261 } 4261 }
4262 4262
4263 4263
4264 MaybeObject* Heap::AllocateRawFixedArray(int length, PretenureFlag pretenure) { 4264 MaybeObject* Heap::AllocateRawFixedArray(int length, PretenureFlag pretenure) {
4265 if (length < 0 || length > FixedArray::kMaxLength) { 4265 if (length < 0 || length > FixedArray::kMaxLength) {
(...skipping 27 matching lines...) Expand all
4293 ASSERT(length >= 0); 4293 ASSERT(length >= 0);
4294 ASSERT(heap->empty_fixed_array()->IsFixedArray()); 4294 ASSERT(heap->empty_fixed_array()->IsFixedArray());
4295 if (length == 0) return heap->empty_fixed_array(); 4295 if (length == 0) return heap->empty_fixed_array();
4296 4296
4297 ASSERT(!heap->InNewSpace(filler)); 4297 ASSERT(!heap->InNewSpace(filler));
4298 Object* result; 4298 Object* result;
4299 { MaybeObject* maybe_result = heap->AllocateRawFixedArray(length, pretenure); 4299 { MaybeObject* maybe_result = heap->AllocateRawFixedArray(length, pretenure);
4300 if (!maybe_result->ToObject(&result)) return maybe_result; 4300 if (!maybe_result->ToObject(&result)) return maybe_result;
4301 } 4301 }
4302 4302
4303 HeapObject::cast(result)->set_map_unsafe(heap->fixed_array_map()); 4303 HeapObject::cast(result)->set_map_no_wb(heap->fixed_array_map());
4304 FixedArray* array = FixedArray::cast(result); 4304 FixedArray* array = FixedArray::cast(result);
4305 array->set_length(length); 4305 array->set_length(length);
4306 MemsetPointer(array->data_start(), filler, length); 4306 MemsetPointer(array->data_start(), filler, length);
4307 return array; 4307 return array;
4308 } 4308 }
4309 4309
4310 4310
4311 MaybeObject* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) { 4311 MaybeObject* Heap::AllocateFixedArray(int length, PretenureFlag pretenure) {
4312 return AllocateFixedArrayWithFiller(this, 4312 return AllocateFixedArrayWithFiller(this,
4313 length, 4313 length,
(...skipping 12 matching lines...) Expand all
4326 4326
4327 4327
4328 MaybeObject* Heap::AllocateUninitializedFixedArray(int length) { 4328 MaybeObject* Heap::AllocateUninitializedFixedArray(int length) {
4329 if (length == 0) return empty_fixed_array(); 4329 if (length == 0) return empty_fixed_array();
4330 4330
4331 Object* obj; 4331 Object* obj;
4332 { MaybeObject* maybe_obj = AllocateRawFixedArray(length); 4332 { MaybeObject* maybe_obj = AllocateRawFixedArray(length);
4333 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 4333 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
4334 } 4334 }
4335 4335
4336 reinterpret_cast<FixedArray*>(obj)->set_map_unsafe(fixed_array_map()); 4336 reinterpret_cast<FixedArray*>(obj)->set_map_no_wb(fixed_array_map());
4337 FixedArray::cast(obj)->set_length(length); 4337 FixedArray::cast(obj)->set_length(length);
4338 return obj; 4338 return obj;
4339 } 4339 }
4340 4340
4341 4341
4342 MaybeObject* Heap::AllocateEmptyFixedDoubleArray() { 4342 MaybeObject* Heap::AllocateEmptyFixedDoubleArray() {
4343 int size = FixedDoubleArray::SizeFor(0); 4343 int size = FixedDoubleArray::SizeFor(0);
4344 Object* result; 4344 Object* result;
4345 { MaybeObject* maybe_result = 4345 { MaybeObject* maybe_result =
4346 AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE); 4346 AllocateRaw(size, OLD_DATA_SPACE, OLD_DATA_SPACE);
4347 if (!maybe_result->ToObject(&result)) return maybe_result; 4347 if (!maybe_result->ToObject(&result)) return maybe_result;
4348 } 4348 }
4349 // Initialize the object. 4349 // Initialize the object.
4350 reinterpret_cast<FixedDoubleArray*>(result)->set_map_unsafe( 4350 reinterpret_cast<FixedDoubleArray*>(result)->set_map_no_wb(
4351 fixed_double_array_map()); 4351 fixed_double_array_map());
4352 reinterpret_cast<FixedDoubleArray*>(result)->set_length(0); 4352 reinterpret_cast<FixedDoubleArray*>(result)->set_length(0);
4353 return result; 4353 return result;
4354 } 4354 }
4355 4355
4356 4356
4357 MaybeObject* Heap::AllocateUninitializedFixedDoubleArray( 4357 MaybeObject* Heap::AllocateUninitializedFixedDoubleArray(
4358 int length, 4358 int length,
4359 PretenureFlag pretenure) { 4359 PretenureFlag pretenure) {
4360 if (length == 0) return empty_fixed_double_array(); 4360 if (length == 0) return empty_fixed_double_array();
4361 4361
4362 Object* obj; 4362 Object* obj;
4363 { MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(length, pretenure); 4363 { MaybeObject* maybe_obj = AllocateRawFixedDoubleArray(length, pretenure);
4364 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 4364 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
4365 } 4365 }
4366 4366
4367 reinterpret_cast<FixedDoubleArray*>(obj)->set_map_unsafe( 4367 reinterpret_cast<FixedDoubleArray*>(obj)->set_map_no_wb(
4368 fixed_double_array_map()); 4368 fixed_double_array_map());
4369 FixedDoubleArray::cast(obj)->set_length(length); 4369 FixedDoubleArray::cast(obj)->set_length(length);
4370 return obj; 4370 return obj;
4371 } 4371 }
4372 4372
4373 4373
4374 MaybeObject* Heap::AllocateRawFixedDoubleArray(int length, 4374 MaybeObject* Heap::AllocateRawFixedDoubleArray(int length,
4375 PretenureFlag pretenure) { 4375 PretenureFlag pretenure) {
4376 if (length < 0 || length > FixedDoubleArray::kMaxLength) { 4376 if (length < 0 || length > FixedDoubleArray::kMaxLength) {
4377 return Failure::OutOfMemoryException(); 4377 return Failure::OutOfMemoryException();
(...skipping 16 matching lines...) Expand all
4394 4394
4395 return AllocateRaw(size, space, retry_space); 4395 return AllocateRaw(size, space, retry_space);
4396 } 4396 }
4397 4397
4398 4398
4399 MaybeObject* Heap::AllocateHashTable(int length, PretenureFlag pretenure) { 4399 MaybeObject* Heap::AllocateHashTable(int length, PretenureFlag pretenure) {
4400 Object* result; 4400 Object* result;
4401 { MaybeObject* maybe_result = AllocateFixedArray(length, pretenure); 4401 { MaybeObject* maybe_result = AllocateFixedArray(length, pretenure);
4402 if (!maybe_result->ToObject(&result)) return maybe_result; 4402 if (!maybe_result->ToObject(&result)) return maybe_result;
4403 } 4403 }
4404 reinterpret_cast<HeapObject*>(result)->set_map_unsafe(hash_table_map()); 4404 reinterpret_cast<HeapObject*>(result)->set_map_no_wb(hash_table_map());
4405 ASSERT(result->IsHashTable()); 4405 ASSERT(result->IsHashTable());
4406 return result; 4406 return result;
4407 } 4407 }
4408 4408
4409 4409
4410 MaybeObject* Heap::AllocateGlobalContext() { 4410 MaybeObject* Heap::AllocateGlobalContext() {
4411 Object* result; 4411 Object* result;
4412 { MaybeObject* maybe_result = 4412 { MaybeObject* maybe_result =
4413 AllocateFixedArray(Context::GLOBAL_CONTEXT_SLOTS); 4413 AllocateFixedArray(Context::GLOBAL_CONTEXT_SLOTS);
4414 if (!maybe_result->ToObject(&result)) return maybe_result; 4414 if (!maybe_result->ToObject(&result)) return maybe_result;
4415 } 4415 }
4416 Context* context = reinterpret_cast<Context*>(result); 4416 Context* context = reinterpret_cast<Context*>(result);
4417 context->set_map_unsafe(global_context_map()); 4417 context->set_map_no_wb(global_context_map());
4418 ASSERT(context->IsGlobalContext()); 4418 ASSERT(context->IsGlobalContext());
4419 ASSERT(result->IsContext()); 4419 ASSERT(result->IsContext());
4420 return result; 4420 return result;
4421 } 4421 }
4422 4422
4423 4423
4424 MaybeObject* Heap::AllocateFunctionContext(int length, JSFunction* function) { 4424 MaybeObject* Heap::AllocateFunctionContext(int length, JSFunction* function) {
4425 ASSERT(length >= Context::MIN_CONTEXT_SLOTS); 4425 ASSERT(length >= Context::MIN_CONTEXT_SLOTS);
4426 Object* result; 4426 Object* result;
4427 { MaybeObject* maybe_result = AllocateFixedArray(length); 4427 { MaybeObject* maybe_result = AllocateFixedArray(length);
4428 if (!maybe_result->ToObject(&result)) return maybe_result; 4428 if (!maybe_result->ToObject(&result)) return maybe_result;
4429 } 4429 }
4430 Context* context = reinterpret_cast<Context*>(result); 4430 Context* context = reinterpret_cast<Context*>(result);
4431 context->set_map_unsafe(function_context_map()); 4431 context->set_map_no_wb(function_context_map());
4432 context->set_closure(function); 4432 context->set_closure(function);
4433 context->set_previous(function->context()); 4433 context->set_previous(function->context());
4434 context->set_extension(NULL); 4434 context->set_extension(NULL);
4435 context->set_global(function->context()->global()); 4435 context->set_global(function->context()->global());
4436 return context; 4436 return context;
4437 } 4437 }
4438 4438
4439 4439
4440 MaybeObject* Heap::AllocateCatchContext(JSFunction* function, 4440 MaybeObject* Heap::AllocateCatchContext(JSFunction* function,
4441 Context* previous, 4441 Context* previous,
4442 String* name, 4442 String* name,
4443 Object* thrown_object) { 4443 Object* thrown_object) {
4444 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS == Context::THROWN_OBJECT_INDEX); 4444 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS == Context::THROWN_OBJECT_INDEX);
4445 Object* result; 4445 Object* result;
4446 { MaybeObject* maybe_result = 4446 { MaybeObject* maybe_result =
4447 AllocateFixedArray(Context::MIN_CONTEXT_SLOTS + 1); 4447 AllocateFixedArray(Context::MIN_CONTEXT_SLOTS + 1);
4448 if (!maybe_result->ToObject(&result)) return maybe_result; 4448 if (!maybe_result->ToObject(&result)) return maybe_result;
4449 } 4449 }
4450 Context* context = reinterpret_cast<Context*>(result); 4450 Context* context = reinterpret_cast<Context*>(result);
4451 context->set_map_unsafe(catch_context_map()); 4451 context->set_map_no_wb(catch_context_map());
4452 context->set_closure(function); 4452 context->set_closure(function);
4453 context->set_previous(previous); 4453 context->set_previous(previous);
4454 context->set_extension(name); 4454 context->set_extension(name);
4455 context->set_global(previous->global()); 4455 context->set_global(previous->global());
4456 context->set(Context::THROWN_OBJECT_INDEX, thrown_object); 4456 context->set(Context::THROWN_OBJECT_INDEX, thrown_object);
4457 return context; 4457 return context;
4458 } 4458 }
4459 4459
4460 4460
4461 MaybeObject* Heap::AllocateWithContext(JSFunction* function, 4461 MaybeObject* Heap::AllocateWithContext(JSFunction* function,
4462 Context* previous, 4462 Context* previous,
4463 JSObject* extension) { 4463 JSObject* extension) {
4464 Object* result; 4464 Object* result;
4465 { MaybeObject* maybe_result = AllocateFixedArray(Context::MIN_CONTEXT_SLOTS); 4465 { MaybeObject* maybe_result = AllocateFixedArray(Context::MIN_CONTEXT_SLOTS);
4466 if (!maybe_result->ToObject(&result)) return maybe_result; 4466 if (!maybe_result->ToObject(&result)) return maybe_result;
4467 } 4467 }
4468 Context* context = reinterpret_cast<Context*>(result); 4468 Context* context = reinterpret_cast<Context*>(result);
4469 context->set_map_unsafe(with_context_map()); 4469 context->set_map_no_wb(with_context_map());
4470 context->set_closure(function); 4470 context->set_closure(function);
4471 context->set_previous(previous); 4471 context->set_previous(previous);
4472 context->set_extension(extension); 4472 context->set_extension(extension);
4473 context->set_global(previous->global()); 4473 context->set_global(previous->global());
4474 return context; 4474 return context;
4475 } 4475 }
4476 4476
4477 4477
4478 MaybeObject* Heap::AllocateBlockContext(JSFunction* function, 4478 MaybeObject* Heap::AllocateBlockContext(JSFunction* function,
4479 Context* previous, 4479 Context* previous,
4480 ScopeInfo* scope_info) { 4480 ScopeInfo* scope_info) {
4481 Object* result; 4481 Object* result;
4482 { MaybeObject* maybe_result = 4482 { MaybeObject* maybe_result =
4483 AllocateFixedArrayWithHoles(scope_info->ContextLength()); 4483 AllocateFixedArrayWithHoles(scope_info->ContextLength());
4484 if (!maybe_result->ToObject(&result)) return maybe_result; 4484 if (!maybe_result->ToObject(&result)) return maybe_result;
4485 } 4485 }
4486 Context* context = reinterpret_cast<Context*>(result); 4486 Context* context = reinterpret_cast<Context*>(result);
4487 context->set_map_unsafe(block_context_map()); 4487 context->set_map_no_wb(block_context_map());
4488 context->set_closure(function); 4488 context->set_closure(function);
4489 context->set_previous(previous); 4489 context->set_previous(previous);
4490 context->set_extension(scope_info); 4490 context->set_extension(scope_info);
4491 context->set_global(previous->global()); 4491 context->set_global(previous->global());
4492 return context; 4492 return context;
4493 } 4493 }
4494 4494
4495 4495
4496 MaybeObject* Heap::AllocateScopeInfo(int length) { 4496 MaybeObject* Heap::AllocateScopeInfo(int length) {
4497 FixedArray* scope_info; 4497 FixedArray* scope_info;
4498 MaybeObject* maybe_scope_info = AllocateFixedArray(length, TENURED); 4498 MaybeObject* maybe_scope_info = AllocateFixedArray(length, TENURED);
4499 if (!maybe_scope_info->To(&scope_info)) return maybe_scope_info; 4499 if (!maybe_scope_info->To(&scope_info)) return maybe_scope_info;
4500 scope_info->set_map_unsafe(scope_info_map()); 4500 scope_info->set_map_no_wb(scope_info_map());
4501 return scope_info; 4501 return scope_info;
4502 } 4502 }
4503 4503
4504 4504
4505 MaybeObject* Heap::AllocateStruct(InstanceType type) { 4505 MaybeObject* Heap::AllocateStruct(InstanceType type) {
4506 Map* map; 4506 Map* map;
4507 switch (type) { 4507 switch (type) {
4508 #define MAKE_CASE(NAME, Name, name) \ 4508 #define MAKE_CASE(NAME, Name, name) \
4509 case NAME##_TYPE: map = name##_map(); break; 4509 case NAME##_TYPE: map = name##_map(); break;
4510 STRUCT_LIST(MAKE_CASE) 4510 STRUCT_LIST(MAKE_CASE)
(...skipping 896 matching lines...) Expand 10 before | Expand all | Expand 10 after
5407 (!search_for_any_global_ && (obj == search_target_))) { 5407 (!search_for_any_global_ && (obj == search_target_))) {
5408 found_target_ = true; 5408 found_target_ = true;
5409 return; 5409 return;
5410 } 5410 }
5411 5411
5412 // not visited yet 5412 // not visited yet
5413 Map* map_p = reinterpret_cast<Map*>(HeapObject::cast(map)); 5413 Map* map_p = reinterpret_cast<Map*>(HeapObject::cast(map));
5414 5414
5415 Address map_addr = map_p->address(); 5415 Address map_addr = map_p->address();
5416 5416
5417 obj->set_map(reinterpret_cast<Map*>(map_addr + kMarkTag)); 5417 obj->set_map_no_wb(reinterpret_cast<Map*>(map_addr + kMarkTag));
5418 5418
5419 MarkObjectRecursively(&map); 5419 MarkObjectRecursively(&map);
5420 5420
5421 MarkObjectVisitor mark_visitor(this); 5421 MarkObjectVisitor mark_visitor(this);
5422 5422
5423 obj->IterateBody(map_p->instance_type(), obj->SizeFromMap(map_p), 5423 obj->IterateBody(map_p->instance_type(), obj->SizeFromMap(map_p),
5424 &mark_visitor); 5424 &mark_visitor);
5425 5425
5426 if (!found_target_) // don't pop if found the target 5426 if (!found_target_) // don't pop if found the target
5427 object_stack_.RemoveLast(); 5427 object_stack_.RemoveLast();
(...skipping 26 matching lines...) Expand all
5454 if (map->IsHeapObject()) return; // unmarked already 5454 if (map->IsHeapObject()) return; // unmarked already
5455 5455
5456 Address map_addr = reinterpret_cast<Address>(map); 5456 Address map_addr = reinterpret_cast<Address>(map);
5457 5457
5458 map_addr -= kMarkTag; 5458 map_addr -= kMarkTag;
5459 5459
5460 ASSERT_TAG_ALIGNED(map_addr); 5460 ASSERT_TAG_ALIGNED(map_addr);
5461 5461
5462 HeapObject* map_p = HeapObject::FromAddress(map_addr); 5462 HeapObject* map_p = HeapObject::FromAddress(map_addr);
5463 5463
5464 obj->set_map(reinterpret_cast<Map*>(map_p)); 5464 obj->set_map_no_wb(reinterpret_cast<Map*>(map_p));
5465 5465
5466 UnmarkObjectRecursively(reinterpret_cast<Object**>(&map_p)); 5466 UnmarkObjectRecursively(reinterpret_cast<Object**>(&map_p));
5467 5467
5468 UnmarkObjectVisitor unmark_visitor(this); 5468 UnmarkObjectVisitor unmark_visitor(this);
5469 5469
5470 obj->IterateBody(Map::cast(map_p)->instance_type(), 5470 obj->IterateBody(Map::cast(map_p)->instance_type(),
5471 obj->SizeFromMap(Map::cast(map_p)), 5471 obj->SizeFromMap(Map::cast(map_p)),
5472 &unmark_visitor); 5472 &unmark_visitor);
5473 } 5473 }
5474 5474
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
6166 return; 6166 return;
6167 } 6167 }
6168 6168
6169 bool is_global_context = SafeIsGlobalContext(obj); 6169 bool is_global_context = SafeIsGlobalContext(obj);
6170 6170
6171 // not visited yet 6171 // not visited yet
6172 Map* map_p = reinterpret_cast<Map*>(HeapObject::cast(map)); 6172 Map* map_p = reinterpret_cast<Map*>(HeapObject::cast(map));
6173 6173
6174 Address map_addr = map_p->address(); 6174 Address map_addr = map_p->address();
6175 6175
6176 obj->set_map(reinterpret_cast<Map*>(map_addr + kMarkTag)); 6176 obj->set_map_no_wb(reinterpret_cast<Map*>(map_addr + kMarkTag));
6177 6177
6178 // Scan the object body. 6178 // Scan the object body.
6179 if (is_global_context && (visit_mode_ == VISIT_ONLY_STRONG)) { 6179 if (is_global_context && (visit_mode_ == VISIT_ONLY_STRONG)) {
6180 // This is specialized to scan Context's properly. 6180 // This is specialized to scan Context's properly.
6181 Object** start = reinterpret_cast<Object**>(obj->address() + 6181 Object** start = reinterpret_cast<Object**>(obj->address() +
6182 Context::kHeaderSize); 6182 Context::kHeaderSize);
6183 Object** end = reinterpret_cast<Object**>(obj->address() + 6183 Object** end = reinterpret_cast<Object**>(obj->address() +
6184 Context::kHeaderSize + Context::FIRST_WEAK_SLOT * kPointerSize); 6184 Context::kHeaderSize + Context::FIRST_WEAK_SLOT * kPointerSize);
6185 mark_visitor->VisitPointers(start, end); 6185 mark_visitor->VisitPointers(start, end);
6186 } else { 6186 } else {
(...skipping 21 matching lines...) Expand all
6208 if (map->IsHeapObject()) return; // unmarked already 6208 if (map->IsHeapObject()) return; // unmarked already
6209 6209
6210 Address map_addr = reinterpret_cast<Address>(map); 6210 Address map_addr = reinterpret_cast<Address>(map);
6211 6211
6212 map_addr -= kMarkTag; 6212 map_addr -= kMarkTag;
6213 6213
6214 ASSERT_TAG_ALIGNED(map_addr); 6214 ASSERT_TAG_ALIGNED(map_addr);
6215 6215
6216 HeapObject* map_p = HeapObject::FromAddress(map_addr); 6216 HeapObject* map_p = HeapObject::FromAddress(map_addr);
6217 6217
6218 obj->set_map(reinterpret_cast<Map*>(map_p)); 6218 obj->set_map_no_wb(reinterpret_cast<Map*>(map_p));
6219 6219
6220 UnmarkRecursively(reinterpret_cast<Object**>(&map_p), unmark_visitor); 6220 UnmarkRecursively(reinterpret_cast<Object**>(&map_p), unmark_visitor);
6221 6221
6222 obj->IterateBody(Map::cast(map_p)->instance_type(), 6222 obj->IterateBody(Map::cast(map_p)->instance_type(),
6223 obj->SizeFromMap(Map::cast(map_p)), 6223 obj->SizeFromMap(Map::cast(map_p)),
6224 unmark_visitor); 6224 unmark_visitor);
6225 } 6225 }
6226 6226
6227 6227
6228 void PathTracer::ProcessResults() { 6228 void PathTracer::ProcessResults() {
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
6583 isolate_->heap()->store_buffer()->Compact(); 6583 isolate_->heap()->store_buffer()->Compact();
6584 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); 6584 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED);
6585 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { 6585 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) {
6586 next = chunk->next_chunk(); 6586 next = chunk->next_chunk();
6587 isolate_->memory_allocator()->Free(chunk); 6587 isolate_->memory_allocator()->Free(chunk);
6588 } 6588 }
6589 chunks_queued_for_free_ = NULL; 6589 chunks_queued_for_free_ = NULL;
6590 } 6590 }
6591 6591
6592 } } // namespace v8::internal 6592 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/heap-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698