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 12429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12440 PropertyType type = DetailsAt(i).type(); | 12440 PropertyType type = DetailsAt(i).type(); |
| 12441 ASSERT(type != FIELD); | 12441 ASSERT(type != FIELD); |
| 12442 instance_descriptor_length++; | 12442 instance_descriptor_length++; |
| 12443 if (type == NORMAL && | 12443 if (type == NORMAL && |
| 12444 (!value->IsJSFunction() || heap->InNewSpace(value))) { | 12444 (!value->IsJSFunction() || heap->InNewSpace(value))) { |
| 12445 number_of_fields += 1; | 12445 number_of_fields += 1; |
| 12446 } | 12446 } |
| 12447 } | 12447 } |
| 12448 } | 12448 } |
| 12449 | 12449 |
| 12450 // Allocate new map. | |
| 12451 Map* new_map; | |
| 12452 MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors(); | |
| 12453 if (!maybe_new_map->To(&new_map)) return maybe_new_map; | |
| 12454 | |
| 12455 // Calculate fields to allocate. | |
| 12456 int inobject_props = obj->map()->inobject_properties(); | |
| 12457 int number_of_allocated_fields = | |
| 12458 number_of_fields + unused_property_fields - inobject_props; | |
| 12459 if (number_of_allocated_fields < 0) { | |
| 12460 // There is enough inobject space for all fields (including unused). | |
| 12461 number_of_allocated_fields = 0; | |
| 12462 unused_property_fields = inobject_props - number_of_fields; | |
| 12463 } | |
|
Toon Verwaest
2012/07/20 13:47:49
What about moving all of this code (starting from
| |
| 12464 | |
| 12465 if (instance_descriptor_length == 0) { | |
| 12466 ASSERT_EQ(0, number_of_allocated_fields); | |
|
Toon Verwaest
2012/07/20 13:47:49
Here we can just use number_of_fields.
| |
| 12467 // Transform the object. | |
| 12468 obj->set_map(new_map); | |
| 12469 obj->set_properties(heap->empty_fixed_array()); | |
| 12470 // Check that it really works. | |
| 12471 ASSERT(obj->HasFastProperties()); | |
| 12472 return obj; | |
| 12473 } | |
| 12474 | |
| 12450 // Allocate the instance descriptor. | 12475 // Allocate the instance descriptor. |
| 12451 DescriptorArray* descriptors; | 12476 DescriptorArray* descriptors; |
| 12452 MaybeObject* maybe_descriptors = | 12477 MaybeObject* maybe_descriptors = |
| 12453 DescriptorArray::Allocate(instance_descriptor_length, | 12478 DescriptorArray::Allocate(instance_descriptor_length, |
| 12454 DescriptorArray::MAY_BE_SHARED); | 12479 DescriptorArray::MAY_BE_SHARED); |
| 12455 if (!maybe_descriptors->To(&descriptors)) { | 12480 if (!maybe_descriptors->To(&descriptors)) { |
| 12456 return maybe_descriptors; | 12481 return maybe_descriptors; |
| 12457 } | 12482 } |
| 12458 | 12483 |
| 12459 FixedArray::WhitenessWitness witness(descriptors); | 12484 FixedArray::WhitenessWitness witness(descriptors); |
| 12460 | 12485 |
| 12461 int inobject_props = obj->map()->inobject_properties(); | |
| 12462 int number_of_allocated_fields = | |
| 12463 number_of_fields + unused_property_fields - inobject_props; | |
| 12464 if (number_of_allocated_fields < 0) { | |
| 12465 // There is enough inobject space for all fields (including unused). | |
| 12466 number_of_allocated_fields = 0; | |
| 12467 unused_property_fields = inobject_props - number_of_fields; | |
| 12468 } | |
| 12469 | |
| 12470 // Allocate the fixed array for the fields. | 12486 // Allocate the fixed array for the fields. |
| 12471 FixedArray* fields; | 12487 FixedArray* fields; |
| 12472 MaybeObject* maybe_fields = | 12488 MaybeObject* maybe_fields = |
| 12473 heap->AllocateFixedArray(number_of_allocated_fields); | 12489 heap->AllocateFixedArray(number_of_allocated_fields); |
| 12474 if (!maybe_fields->To(&fields)) return maybe_fields; | 12490 if (!maybe_fields->To(&fields)) return maybe_fields; |
| 12475 | 12491 |
| 12476 // Fill in the instance descriptor and the fields. | 12492 // Fill in the instance descriptor and the fields. |
| 12477 int next_descriptor = 0; | 12493 int next_descriptor = 0; |
| 12478 int current_offset = 0; | 12494 int current_offset = 0; |
| 12479 for (int i = 0; i < capacity; i++) { | 12495 for (int i = 0; i < capacity; i++) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12516 descriptors->Set(next_descriptor, &d, witness); | 12532 descriptors->Set(next_descriptor, &d, witness); |
| 12517 } else { | 12533 } else { |
| 12518 UNREACHABLE(); | 12534 UNREACHABLE(); |
| 12519 } | 12535 } |
| 12520 ++next_descriptor; | 12536 ++next_descriptor; |
| 12521 } | 12537 } |
| 12522 } | 12538 } |
| 12523 ASSERT(current_offset == number_of_fields); | 12539 ASSERT(current_offset == number_of_fields); |
| 12524 | 12540 |
| 12525 descriptors->Sort(witness); | 12541 descriptors->Sort(witness); |
| 12526 // Allocate new map. | |
| 12527 Map* new_map; | |
| 12528 MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors(); | |
| 12529 if (!maybe_new_map->To(&new_map)) return maybe_new_map; | |
| 12530 | 12542 |
| 12531 new_map->InitializeDescriptors(descriptors); | 12543 new_map->InitializeDescriptors(descriptors); |
| 12532 new_map->set_unused_property_fields(unused_property_fields); | 12544 new_map->set_unused_property_fields(unused_property_fields); |
| 12533 | 12545 |
| 12534 // Transform the object. | 12546 // Transform the object. |
| 12535 obj->set_map(new_map); | 12547 obj->set_map(new_map); |
| 12536 | 12548 |
| 12537 obj->set_properties(fields); | 12549 obj->set_properties(fields); |
| 12538 ASSERT(obj->IsJSObject()); | 12550 ASSERT(obj->IsJSObject()); |
| 12539 | 12551 |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13041 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13053 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 13042 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13054 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 13043 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13055 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 13044 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13056 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 13045 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13057 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 13046 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13058 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 13047 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13059 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 13048 } | 13060 } |
| 13049 | 13061 |
| 13050 } } // namespace v8::internal | 13062 } } // namespace v8::internal |
| OLD | NEW |