Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 1ef8f58f293f73341318838f7487ba49b60f46e9..7366cd3d429b277376046c05a2b92e0042174f48 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -9480,6 +9480,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); |
+ } |
+ 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 |