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

Unified Diff: src/objects.cc

Issue 12224035: Generalize map dependent codes array to allow multiple dependency groups. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 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
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 46539311de9625d9c7ffccc54bd476ab5510a47b..a72585d696948c827a1659fb0d0c201003b9ac11 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -9501,37 +9501,55 @@ void Map::ZapPrototypeTransitions() {
}
-Handle<DependentCodes> DependentCodes::Append(Handle<DependentCodes> codes,
+Handle<DependentCodes> DependentCodes::Insert(Handle<DependentCodes> codes,
+ DependencyGroup group,
Handle<Code> value) {
- int append_index = codes->number_of_codes();
- if (append_index > 0 && codes->code_at(append_index - 1) == *value) {
+ GroupStartIndexes starts;
+ codes->ComputeGroupStartIndexes(starts);
+ int start = starts[group];
+ int end = starts[group + 1];
+ int number_of_codes = starts[kGroupCount];
+ if (start < end && codes->code_at(end - 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() < kCodesIndex + append_index + 1) {
+ if (codes->length() < kCodesStartIndex + number_of_codes + 1) {
Factory* factory = codes->GetIsolate()->factory();
- int capacity = kCodesIndex + append_index + 1;
+ int capacity = kCodesStartIndex + number_of_codes + 1;
if (capacity > 5) capacity = capacity * 5 / 4;
Handle<DependentCodes> new_codes = Handle<DependentCodes>::cast(
factory->CopySizeFixedArray(codes, capacity));
// The number of codes can change after GC.
- append_index = codes->number_of_codes();
- for (int i = 0; i < append_index; i++) {
+ codes->ComputeGroupStartIndexes(starts);
+ start = starts[group];
+ end = starts[group + 1];
+ number_of_codes = starts[kGroupCount];
+ for (int i = 0; i < number_of_codes; i++) {
codes->clear_code_at(i);
}
+ // If the old fixed array was empty, we need to reset counters of the
+ // new array.
+ if (number_of_codes == 0) {
+ for (int g = 0; g < kGroupCount; g++) {
+ new_codes->set_number_of_codes(static_cast<DependencyGroup>(g), 0);
+ }
+ }
codes = new_codes;
}
- codes->set_code_at(append_index, *value);
- codes->set_number_of_codes(append_index + 1);
+ codes->ExtendGroup(group);
+ codes->set_code_at(end, *value);
+ codes->set_number_of_codes(group, end + 1 - start);
return codes;
}
-bool DependentCodes::Contains(Code* code) {
- int limit = number_of_codes();
- for (int i = 0; i < limit; i++) {
+bool DependentCodes::Contains(DependencyGroup group, Code* code) {
+ GroupStartIndexes starts;
+ ComputeGroupStartIndexes(starts);
+ int number_of_codes = starts[kGroupCount];
+ for (int i = 0; i < number_of_codes; i++) {
if (code_at(i) == code) return true;
}
return false;

Powered by Google App Engine
This is Rietveld 408576698