| 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 int inobject_props = obj->map()->inobject_properties(); |
| 12451 |
| 12452 // Allocate new map. |
| 12453 Map* new_map; |
| 12454 MaybeObject* maybe_new_map = obj->map()->CopyDropDescriptors(); |
| 12455 if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
| 12456 |
| 12457 if (instance_descriptor_length == 0) { |
| 12458 ASSERT_LE(unused_property_fields, inobject_props); |
| 12459 // Transform the object. |
| 12460 new_map->set_unused_property_fields(unused_property_fields); |
| 12461 obj->set_map(new_map); |
| 12462 obj->set_properties(heap->empty_fixed_array()); |
| 12463 // Check that it really works. |
| 12464 ASSERT(obj->HasFastProperties()); |
| 12465 return obj; |
| 12466 } |
| 12467 |
| 12450 // Allocate the instance descriptor. | 12468 // Allocate the instance descriptor. |
| 12451 DescriptorArray* descriptors; | 12469 DescriptorArray* descriptors; |
| 12452 MaybeObject* maybe_descriptors = | 12470 MaybeObject* maybe_descriptors = |
| 12453 DescriptorArray::Allocate(instance_descriptor_length, | 12471 DescriptorArray::Allocate(instance_descriptor_length, |
| 12454 DescriptorArray::MAY_BE_SHARED); | 12472 DescriptorArray::MAY_BE_SHARED); |
| 12455 if (!maybe_descriptors->To(&descriptors)) { | 12473 if (!maybe_descriptors->To(&descriptors)) { |
| 12456 return maybe_descriptors; | 12474 return maybe_descriptors; |
| 12457 } | 12475 } |
| 12458 | 12476 |
| 12459 FixedArray::WhitenessWitness witness(descriptors); | 12477 FixedArray::WhitenessWitness witness(descriptors); |
| 12460 | 12478 |
| 12461 int inobject_props = obj->map()->inobject_properties(); | 12479 // Calculate fields to allocate.s |
| 12462 int number_of_allocated_fields = | 12480 int number_of_allocated_fields = |
| 12463 number_of_fields + unused_property_fields - inobject_props; | 12481 number_of_fields + unused_property_fields - inobject_props; |
| 12464 if (number_of_allocated_fields < 0) { | 12482 if (number_of_allocated_fields < 0) { |
| 12465 // There is enough inobject space for all fields (including unused). | 12483 // There is enough inobject space for all fields (including unused). |
| 12466 number_of_allocated_fields = 0; | 12484 number_of_allocated_fields = 0; |
| 12467 unused_property_fields = inobject_props - number_of_fields; | 12485 unused_property_fields = inobject_props - number_of_fields; |
| 12468 } | 12486 } |
| 12469 | 12487 |
| 12470 // Allocate the fixed array for the fields. | 12488 // Allocate the fixed array for the fields. |
| 12471 FixedArray* fields; | 12489 FixedArray* fields; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12516 descriptors->Set(next_descriptor, &d, witness); | 12534 descriptors->Set(next_descriptor, &d, witness); |
| 12517 } else { | 12535 } else { |
| 12518 UNREACHABLE(); | 12536 UNREACHABLE(); |
| 12519 } | 12537 } |
| 12520 ++next_descriptor; | 12538 ++next_descriptor; |
| 12521 } | 12539 } |
| 12522 } | 12540 } |
| 12523 ASSERT(current_offset == number_of_fields); | 12541 ASSERT(current_offset == number_of_fields); |
| 12524 | 12542 |
| 12525 descriptors->Sort(witness); | 12543 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 | 12544 |
| 12545 new_map->set_unused_property_fields(unused_property_fields); |
| 12531 new_map->InitializeDescriptors(descriptors); | 12546 new_map->InitializeDescriptors(descriptors); |
| 12532 new_map->set_unused_property_fields(unused_property_fields); | |
| 12533 | 12547 |
| 12534 // Transform the object. | 12548 // Transform the object. |
| 12535 obj->set_map(new_map); | 12549 obj->set_map(new_map); |
| 12536 | 12550 |
| 12537 obj->set_properties(fields); | 12551 obj->set_properties(fields); |
| 12538 ASSERT(obj->IsJSObject()); | 12552 ASSERT(obj->IsJSObject()); |
| 12539 | 12553 |
| 12540 // Check that it really works. | 12554 // Check that it really works. |
| 12541 ASSERT(obj->HasFastProperties()); | 12555 ASSERT(obj->HasFastProperties()); |
| 12542 | 12556 |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13041 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13055 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 13042 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13056 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 13043 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13057 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 13044 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13058 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 13045 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13059 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 13046 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13060 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 13047 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13061 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 13048 } | 13062 } |
| 13049 | 13063 |
| 13050 } } // namespace v8::internal | 13064 } } // namespace v8::internal |
| OLD | NEW |