Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index 1d95a5c15271ab3d955e2cbd3f2b6ad1b270cc25..aeb501155b00157319ec3fdf157946d633ff5dbd 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -9684,6 +9684,40 @@ void Map::ZapPrototypeTransitions() { |
| } |
| +Handle<DependentCodes> DependentCodes::Append(Handle<DependentCodes> codes, |
| + Handle<Code> value) { |
| + int append_index = codes->number_of_codes(); |
| + if (append_index > 0 && codes->code_at(append_index - 1) == *value) { |
| + // Do not append the code if it is already in the array. |
| + // It is sufficient to just check only the last element because |
| + // we process embedded maps of an optimized code in one batch. |
| + return codes; |
| + } |
| + if (codes->length() < kCodesOffset + append_index + 1) { |
| + Factory* factory = codes->GetIsolate()->factory(); |
| + int capacity = kCodesOffset + append_index + 1; |
| + if (capacity > 5) capacity = capacity * 5 / 4; |
| + Handle<DependentCodes> new_codes = |
| + Handle<DependentCodes>::cast(factory->NewFixedArray(capacity)); |
| + // The number of codes can change after GC. |
| + append_index = codes->number_of_codes(); |
| + new_codes->set_number_of_codes(append_index + 1); |
| + for (int i = 0; i < append_index; i++) { |
| + new_codes->set_code_at(i, codes->code_at(i)); |
| + codes->clear_code_at(i); |
| + } |
|
Michael Starzinger
2013/01/21 10:31:48
This resizing is already implemented in Factory::C
ulan
2013/01/21 13:11:57
Done.
|
| + new_codes->set_code_at(append_index, *value); |
| + for (int i = append_index + 1; kCodesOffset + i < capacity; i++) { |
| + new_codes->clear_code_at(i); |
| + } |
| + return new_codes; |
| + } |
| + codes->set_code_at(append_index, *value); |
| + codes->set_number_of_codes(append_index + 1); |
| + return codes; |
| +} |
| + |
| + |
| MaybeObject* JSReceiver::SetPrototype(Object* value, |
| bool skip_hidden_prototypes) { |
| #ifdef DEBUG |