Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(514)

Unified Diff: src/objects.cc

Issue 11575007: Make embedded maps in optimized code weak. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add test that reproduces memleak and rebase. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/mark-compact.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« src/mark-compact.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698