Chromium Code Reviews| 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 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 509 if (details.IsDontDelete()) { | 509 if (details.IsDontDelete()) { |
| 510 if (mode != FORCE_DELETION) return GetHeap()->false_value(); | 510 if (mode != FORCE_DELETION) return GetHeap()->false_value(); |
| 511 // When forced to delete global properties, we have to make a | 511 // When forced to delete global properties, we have to make a |
| 512 // map change to invalidate any ICs that think they can load | 512 // map change to invalidate any ICs that think they can load |
| 513 // from the DontDelete cell without checking if it contains | 513 // from the DontDelete cell without checking if it contains |
| 514 // the hole value. | 514 // the hole value. |
| 515 Map* new_map; | 515 Map* new_map; |
| 516 MaybeObject* maybe_new_map = map()->CopyDropDescriptors(); | 516 MaybeObject* maybe_new_map = map()->CopyDropDescriptors(); |
| 517 if (!maybe_new_map->To(&new_map)) return maybe_new_map; | 517 if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
| 518 | 518 |
| 519 ASSERT(new_map->is_dictionary_map()); | |
| 519 set_map(new_map); | 520 set_map(new_map); |
| 520 } | 521 } |
| 521 JSGlobalPropertyCell* cell = | 522 JSGlobalPropertyCell* cell = |
| 522 JSGlobalPropertyCell::cast(dictionary->ValueAt(entry)); | 523 JSGlobalPropertyCell::cast(dictionary->ValueAt(entry)); |
| 523 cell->set_value(cell->GetHeap()->the_hole_value()); | 524 cell->set_value(cell->GetHeap()->the_hole_value()); |
| 524 dictionary->DetailsAtPut(entry, details.AsDeleted()); | 525 dictionary->DetailsAtPut(entry, details.AsDeleted()); |
| 525 } else { | 526 } else { |
| 526 Object* deleted = dictionary->DeleteProperty(entry, mode); | 527 Object* deleted = dictionary->DeleteProperty(entry, mode); |
| 527 if (deleted == GetHeap()->true_value()) { | 528 if (deleted == GetHeap()->true_value()) { |
| 528 FixedArray* new_properties = NULL; | 529 FixedArray* new_properties = NULL; |
| (...skipping 2682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3211 } | 3212 } |
| 3212 } | 3213 } |
| 3213 #endif | 3214 #endif |
| 3214 return result; | 3215 return result; |
| 3215 } | 3216 } |
| 3216 | 3217 |
| 3217 { MaybeObject* maybe_result = | 3218 { MaybeObject* maybe_result = |
| 3218 fast->CopyNormalized(mode, SHARED_NORMALIZED_MAP); | 3219 fast->CopyNormalized(mode, SHARED_NORMALIZED_MAP); |
| 3219 if (!maybe_result->ToObject(&result)) return maybe_result; | 3220 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 3220 } | 3221 } |
| 3222 Map::cast(result)->set_dictionary_map(true); | |
|
Toon Verwaest
2012/08/06 13:49:24
This is superfluous since CopyNormalized already s
Erik Corry
2012/08/06 14:26:46
Done.
| |
| 3221 set(index, result); | 3223 set(index, result); |
| 3222 isolate->counters()->normalized_maps()->Increment(); | 3224 isolate->counters()->normalized_maps()->Increment(); |
| 3223 | 3225 |
| 3224 return result; | 3226 return result; |
| 3225 } | 3227 } |
| 3226 | 3228 |
| 3227 | 3229 |
| 3228 void NormalizedMapCache::Clear() { | 3230 void NormalizedMapCache::Clear() { |
| 3229 int entries = length(); | 3231 int entries = length(); |
| 3230 for (int i = 0; i != entries; i++) { | 3232 for (int i = 0; i != entries; i++) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3336 | 3338 |
| 3337 // Copy the next enumeration index from instance descriptor. | 3339 // Copy the next enumeration index from instance descriptor. |
| 3338 int index = map_of_this->instance_descriptors()->NextEnumerationIndex(); | 3340 int index = map_of_this->instance_descriptors()->NextEnumerationIndex(); |
| 3339 dictionary->SetNextEnumerationIndex(index); | 3341 dictionary->SetNextEnumerationIndex(index); |
| 3340 | 3342 |
| 3341 Map* new_map; | 3343 Map* new_map; |
| 3342 MaybeObject* maybe_map = | 3344 MaybeObject* maybe_map = |
| 3343 current_heap->isolate()->context()->global_context()-> | 3345 current_heap->isolate()->context()->global_context()-> |
| 3344 normalized_map_cache()->Get(this, mode); | 3346 normalized_map_cache()->Get(this, mode); |
| 3345 if (!maybe_map->To(&new_map)) return maybe_map; | 3347 if (!maybe_map->To(&new_map)) return maybe_map; |
| 3348 ASSERT(new_map->is_dictionary_map()); | |
| 3346 | 3349 |
| 3347 // We have now successfully allocated all the necessary objects. | 3350 // We have now successfully allocated all the necessary objects. |
| 3348 // Changes can now be made with the guarantee that all of them take effect. | 3351 // Changes can now be made with the guarantee that all of them take effect. |
| 3349 | 3352 |
| 3350 // Resize the object in the heap if necessary. | 3353 // Resize the object in the heap if necessary. |
| 3351 int new_instance_size = new_map->instance_size(); | 3354 int new_instance_size = new_map->instance_size(); |
| 3352 int instance_size_delta = map_of_this->instance_size() - new_instance_size; | 3355 int instance_size_delta = map_of_this->instance_size() - new_instance_size; |
| 3353 ASSERT(instance_size_delta >= 0); | 3356 ASSERT(instance_size_delta >= 0); |
| 3354 current_heap->CreateFillerObjectAt(this->address() + new_instance_size, | 3357 current_heap->CreateFillerObjectAt(this->address() + new_instance_size, |
| 3355 instance_size_delta); | 3358 instance_size_delta); |
| (...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4505 // Normalize object to make this operation simple. | 4508 // Normalize object to make this operation simple. |
| 4506 MaybeObject* maybe_ok = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); | 4509 MaybeObject* maybe_ok = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); |
| 4507 if (maybe_ok->IsFailure()) return maybe_ok; | 4510 if (maybe_ok->IsFailure()) return maybe_ok; |
| 4508 | 4511 |
| 4509 // For the global object allocate a new map to invalidate the global inline | 4512 // For the global object allocate a new map to invalidate the global inline |
| 4510 // caches which have a global property cell reference directly in the code. | 4513 // caches which have a global property cell reference directly in the code. |
| 4511 if (IsGlobalObject()) { | 4514 if (IsGlobalObject()) { |
| 4512 Map* new_map; | 4515 Map* new_map; |
| 4513 MaybeObject* maybe_new_map = map()->CopyDropDescriptors(); | 4516 MaybeObject* maybe_new_map = map()->CopyDropDescriptors(); |
| 4514 if (!maybe_new_map->To(&new_map)) return maybe_new_map; | 4517 if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
| 4518 ASSERT(new_map->is_dictionary_map()); | |
| 4515 | 4519 |
| 4516 set_map(new_map); | 4520 set_map(new_map); |
| 4517 // When running crankshaft, changing the map is not enough. We | 4521 // When running crankshaft, changing the map is not enough. We |
| 4518 // need to deoptimize all functions that rely on this global | 4522 // need to deoptimize all functions that rely on this global |
| 4519 // object. | 4523 // object. |
| 4520 Deoptimizer::DeoptimizeGlobalObject(this); | 4524 Deoptimizer::DeoptimizeGlobalObject(this); |
| 4521 } | 4525 } |
| 4522 | 4526 |
| 4523 // Update the dictionary with the new CALLBACKS property. | 4527 // Update the dictionary with the new CALLBACKS property. |
| 4524 PropertyDetails details = PropertyDetails(attributes, CALLBACKS); | 4528 PropertyDetails details = PropertyDetails(attributes, CALLBACKS); |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4866 Map* result; | 4870 Map* result; |
| 4867 MaybeObject* maybe_result = RawCopy(new_instance_size); | 4871 MaybeObject* maybe_result = RawCopy(new_instance_size); |
| 4868 if (!maybe_result->To(&result)) return maybe_result; | 4872 if (!maybe_result->To(&result)) return maybe_result; |
| 4869 | 4873 |
| 4870 if (mode != CLEAR_INOBJECT_PROPERTIES) { | 4874 if (mode != CLEAR_INOBJECT_PROPERTIES) { |
| 4871 result->set_inobject_properties(inobject_properties()); | 4875 result->set_inobject_properties(inobject_properties()); |
| 4872 } | 4876 } |
| 4873 | 4877 |
| 4874 result->set_code_cache(code_cache()); | 4878 result->set_code_cache(code_cache()); |
| 4875 result->set_is_shared(sharing == SHARED_NORMALIZED_MAP); | 4879 result->set_is_shared(sharing == SHARED_NORMALIZED_MAP); |
| 4880 result->set_dictionary_map(true); | |
| 4876 | 4881 |
| 4877 #ifdef DEBUG | 4882 #ifdef DEBUG |
| 4878 if (FLAG_verify_heap && result->is_shared()) { | 4883 if (FLAG_verify_heap && result->is_shared()) { |
| 4879 result->SharedMapVerify(); | 4884 result->SharedMapVerify(); |
| 4880 } | 4885 } |
| 4881 #endif | 4886 #endif |
| 4882 | 4887 |
| 4883 return result; | 4888 return result; |
| 4884 } | 4889 } |
| 4885 | 4890 |
| (...skipping 2437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7323 constructor() == other->constructor() && | 7328 constructor() == other->constructor() && |
| 7324 prototype() == other->prototype() && | 7329 prototype() == other->prototype() && |
| 7325 inobject_properties() == ((mode == CLEAR_INOBJECT_PROPERTIES) ? | 7330 inobject_properties() == ((mode == CLEAR_INOBJECT_PROPERTIES) ? |
| 7326 0 : | 7331 0 : |
| 7327 other->inobject_properties()) && | 7332 other->inobject_properties()) && |
| 7328 instance_type() == other->instance_type() && | 7333 instance_type() == other->instance_type() && |
| 7329 bit_field() == other->bit_field() && | 7334 bit_field() == other->bit_field() && |
| 7330 bit_field2() == other->bit_field2() && | 7335 bit_field2() == other->bit_field2() && |
| 7331 static_cast<uint32_t>(bit_field3()) == | 7336 static_cast<uint32_t>(bit_field3()) == |
| 7332 LastAddedBits::update( | 7337 LastAddedBits::update( |
| 7333 IsShared::update(other->bit_field3(), true), | 7338 IsShared::update(DictionaryMap::update(other->bit_field3(), true), |
| 7339 true), | |
| 7334 kNoneAdded); | 7340 kNoneAdded); |
| 7335 } | 7341 } |
| 7336 | 7342 |
| 7337 | 7343 |
| 7338 void JSFunction::JSFunctionIterateBody(int object_size, ObjectVisitor* v) { | 7344 void JSFunction::JSFunctionIterateBody(int object_size, ObjectVisitor* v) { |
| 7339 // Iterate over all fields in the body but take care in dealing with | 7345 // Iterate over all fields in the body but take care in dealing with |
| 7340 // the code entry. | 7346 // the code entry. |
| 7341 IteratePointers(v, kPropertiesOffset, kCodeEntryOffset); | 7347 IteratePointers(v, kPropertiesOffset, kCodeEntryOffset); |
| 7342 v->VisitCodeEntry(this->address() + kCodeEntryOffset); | 7348 v->VisitCodeEntry(this->address() + kCodeEntryOffset); |
| 7343 IteratePointers(v, kCodeEntryOffset + kPointerSize, object_size); | 7349 IteratePointers(v, kCodeEntryOffset + kPointerSize, object_size); |
| (...skipping 5222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12566 } | 12572 } |
| 12567 } | 12573 } |
| 12568 } | 12574 } |
| 12569 | 12575 |
| 12570 int inobject_props = obj->map()->inobject_properties(); | 12576 int inobject_props = obj->map()->inobject_properties(); |
| 12571 | 12577 |
| 12572 // Allocate new map. | 12578 // Allocate new map. |
| 12573 Map* new_map; | 12579 Map* new_map; |
| 12574 MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors(); | 12580 MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors(); |
| 12575 if (!maybe_new_map->To(&new_map)) return maybe_new_map; | 12581 if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
| 12582 new_map->set_dictionary_map(false); | |
| 12576 | 12583 |
| 12577 if (instance_descriptor_length == 0) { | 12584 if (instance_descriptor_length == 0) { |
| 12578 ASSERT_LE(unused_property_fields, inobject_props); | 12585 ASSERT_LE(unused_property_fields, inobject_props); |
| 12579 // Transform the object. | 12586 // Transform the object. |
| 12580 new_map->set_unused_property_fields(inobject_props); | 12587 new_map->set_unused_property_fields(inobject_props); |
| 12581 obj->set_map(new_map); | 12588 obj->set_map(new_map); |
| 12582 obj->set_properties(heap->empty_fixed_array()); | 12589 obj->set_properties(heap->empty_fixed_array()); |
| 12583 // Check that it really works. | 12590 // Check that it really works. |
| 12584 ASSERT(obj->HasFastProperties()); | 12591 ASSERT(obj->HasFastProperties()); |
| 12585 return obj; | 12592 return obj; |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13174 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13181 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 13175 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13182 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 13176 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13183 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 13177 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13184 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 13178 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13185 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 13179 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13186 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 13180 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13187 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 13181 } | 13188 } |
| 13182 | 13189 |
| 13183 } } // namespace v8::internal | 13190 } } // namespace v8::internal |
| OLD | NEW |