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

Side by Side Diff: src/objects.h

Issue 1435313002: Refactor dependent code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « src/crankshaft/lithium.cc ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_OBJECTS_H_ 5 #ifndef V8_OBJECTS_H_
6 #define V8_OBJECTS_H_ 6 #define V8_OBJECTS_H_
7 7
8 #include <iosfwd> 8 #include <iosfwd>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 5371 matching lines...) Expand 10 before | Expand all | Expand 10 after
5382 5382
5383 // Code aging -- platform-specific 5383 // Code aging -- platform-specific
5384 static void PatchPlatformCodeAge(Isolate* isolate, 5384 static void PatchPlatformCodeAge(Isolate* isolate,
5385 byte* sequence, Age age, 5385 byte* sequence, Age age,
5386 MarkingParity parity); 5386 MarkingParity parity);
5387 5387
5388 DISALLOW_IMPLICIT_CONSTRUCTORS(Code); 5388 DISALLOW_IMPLICIT_CONSTRUCTORS(Code);
5389 }; 5389 };
5390 5390
5391 5391
5392 // This class describes the layout of dependent codes array of a map. The 5392 // Dependent code is a singly linked list of fixed arrays. Each array contains
5393 // array is partitioned into several groups of dependent codes. Each group 5393 // code objects in weak cells for one dependent group. The suffix of the array
5394 // contains codes with the same dependency on the map. The array has the 5394 // can be filled with the undefined value if the number of codes is less than
5395 // following layout for n dependency groups: 5395 // the length of the array.
5396 // 5396 //
5397 // +----+----+-----+----+---------+----------+-----+---------+-----------+ 5397 // +------+-----------------+--------+--------+-----+--------+-----------+-----+
5398 // | C1 | C2 | ... | Cn | group 1 | group 2 | ... | group n | undefined | 5398 // | next | count & group 1 | code 1 | code 2 | ... | code n | undefined | ... |
5399 // +----+----+-----+----+---------+----------+-----+---------+-----------+ 5399 // +------+-----------------+--------+--------+-----+--------+-----------+-----+
5400 // |
5401 // V
5402 // +------+-----------------+--------+--------+-----+--------+-----------+-----+
5403 // | next | count & group 2 | code 1 | code 2 | ... | code m | undefined | ... |
5404 // +------+-----------------+--------+--------+-----+--------+-----------+-----+
5405 // |
5406 // V
5407 // empty_fixed_array()
5400 // 5408 //
5401 // The first n elements are Smis, each of them specifies the number of codes 5409 // The list of fixed arrays is ordered by dependency groups.
5402 // in the corresponding group. The subsequent elements contain grouped code
5403 // objects in weak cells. The suffix of the array can be filled with the
5404 // undefined value if the number of codes is less than the length of the
5405 // array. The order of the code objects within a group is not preserved.
5406 //
5407 // All code indexes used in the class are counted starting from the first
5408 // code object of the first group. In other words, code index 0 corresponds
5409 // to array index n = kCodesStartIndex.
5410 5410
5411 class DependentCode: public FixedArray { 5411 class DependentCode: public FixedArray {
5412 public: 5412 public:
5413 enum DependencyGroup { 5413 enum DependencyGroup {
5414 // Group of code that weakly embed this map and depend on being 5414 // Group of code that weakly embed this map and depend on being
5415 // deoptimized when the map is garbage collected. 5415 // deoptimized when the map is garbage collected.
5416 kWeakCodeGroup, 5416 kWeakCodeGroup,
5417 // Group of code that embed a transition to this map, and depend on being 5417 // Group of code that embed a transition to this map, and depend on being
5418 // deoptimized when the transition is replaced by a new version. 5418 // deoptimized when the transition is replaced by a new version.
5419 kTransitionGroup, 5419 kTransitionGroup,
(...skipping 14 matching lines...) Expand all
5434 // Group of code that depends on tenuring information in AllocationSites 5434 // Group of code that depends on tenuring information in AllocationSites
5435 // not being changed. 5435 // not being changed.
5436 kAllocationSiteTenuringChangedGroup, 5436 kAllocationSiteTenuringChangedGroup,
5437 // Group of code that depends on element transition information in 5437 // Group of code that depends on element transition information in
5438 // AllocationSites not being changed. 5438 // AllocationSites not being changed.
5439 kAllocationSiteTransitionChangedGroup 5439 kAllocationSiteTransitionChangedGroup
5440 }; 5440 };
5441 5441
5442 static const int kGroupCount = kAllocationSiteTransitionChangedGroup + 1; 5442 static const int kGroupCount = kAllocationSiteTransitionChangedGroup + 1;
5443 5443
5444 // Array for holding the index of the first code object of each group.
5445 // The last element stores the total number of code objects.
5446 class GroupStartIndexes {
5447 public:
5448 explicit GroupStartIndexes(DependentCode* entries);
5449 void Recompute(DependentCode* entries);
5450 int at(int i) { return start_indexes_[i]; }
5451 int number_of_entries() { return start_indexes_[kGroupCount]; }
5452 private:
5453 int start_indexes_[kGroupCount + 1];
5454 };
5455
5456 bool Contains(DependencyGroup group, WeakCell* code_cell); 5444 bool Contains(DependencyGroup group, WeakCell* code_cell);
5445 bool IsEmpty(DependencyGroup group);
5457 5446
5458 static Handle<DependentCode> InsertCompilationDependencies( 5447 static Handle<DependentCode> InsertCompilationDependencies(
5459 Handle<DependentCode> entries, DependencyGroup group, 5448 Handle<DependentCode> entries, DependencyGroup group,
5460 Handle<Foreign> info); 5449 Handle<Foreign> info);
5461 5450
5462 static Handle<DependentCode> InsertWeakCode(Handle<DependentCode> entries, 5451 static Handle<DependentCode> InsertWeakCode(Handle<DependentCode> entries,
5463 DependencyGroup group, 5452 DependencyGroup group,
5464 Handle<WeakCell> code_cell); 5453 Handle<WeakCell> code_cell);
5465 5454
5466 void UpdateToFinishedCode(DependencyGroup group, Foreign* info, 5455 void UpdateToFinishedCode(DependencyGroup group, Foreign* info,
5467 WeakCell* code_cell); 5456 WeakCell* code_cell);
5468 5457
5469 void RemoveCompilationDependencies(DependentCode::DependencyGroup group, 5458 void RemoveCompilationDependencies(DependentCode::DependencyGroup group,
5470 Foreign* info); 5459 Foreign* info);
5471 5460
5472 void DeoptimizeDependentCodeGroup(Isolate* isolate, 5461 void DeoptimizeDependentCodeGroup(Isolate* isolate,
5473 DependentCode::DependencyGroup group); 5462 DependentCode::DependencyGroup group);
5474 5463
5475 bool MarkCodeForDeoptimization(Isolate* isolate, 5464 bool MarkCodeForDeoptimization(Isolate* isolate,
5476 DependentCode::DependencyGroup group); 5465 DependentCode::DependencyGroup group);
5477 5466
5478 // The following low-level accessors should only be used by this class 5467 // The following low-level accessors should only be used by this class
5479 // and the mark compact collector. 5468 // and the mark compact collector.
5480 inline int number_of_entries(DependencyGroup group); 5469 inline DependentCode* next_link();
5481 inline void set_number_of_entries(DependencyGroup group, int value); 5470 inline void set_next_link(DependentCode* next);
5471 inline int count();
5472 inline void set_count(int value);
5473 inline DependencyGroup group();
5474 inline void set_group(DependencyGroup group);
5482 inline Object* object_at(int i); 5475 inline Object* object_at(int i);
5483 inline void set_object_at(int i, Object* object); 5476 inline void set_object_at(int i, Object* object);
5484 inline void clear_at(int i); 5477 inline void clear_at(int i);
5485 inline void copy(int from, int to); 5478 inline void copy(int from, int to);
5486 DECLARE_CAST(DependentCode) 5479 DECLARE_CAST(DependentCode)
5487 5480
5488 static const char* DependencyGroupName(DependencyGroup group); 5481 static const char* DependencyGroupName(DependencyGroup group);
5489 static void SetMarkedForDeoptimization(Code* code, DependencyGroup group); 5482 static void SetMarkedForDeoptimization(Code* code, DependencyGroup group);
5490 5483
5491 private: 5484 private:
5492 static Handle<DependentCode> Insert(Handle<DependentCode> entries, 5485 static Handle<DependentCode> Insert(Handle<DependentCode> entries,
5493 DependencyGroup group, 5486 DependencyGroup group,
5494 Handle<Object> object); 5487 Handle<Object> object);
5488 static Handle<DependentCode> New(DependencyGroup group, Handle<Object> object,
5489 Handle<DependentCode> next);
5495 static Handle<DependentCode> EnsureSpace(Handle<DependentCode> entries); 5490 static Handle<DependentCode> EnsureSpace(Handle<DependentCode> entries);
5496 // Make a room at the end of the given group by moving out the first
5497 // code objects of the subsequent groups.
5498 inline void ExtendGroup(DependencyGroup group);
5499 // Compact by removing cleared weak cells and return true if there was 5491 // Compact by removing cleared weak cells and return true if there was
5500 // any cleared weak cell. 5492 // any cleared weak cell.
5501 bool Compact(); 5493 bool Compact();
5502 static int Grow(int number_of_entries) { 5494 static int Grow(int number_of_entries) {
5503 if (number_of_entries < 5) return number_of_entries + 1; 5495 if (number_of_entries < 5) return number_of_entries + 1;
5504 return number_of_entries * 5 / 4; 5496 return number_of_entries * 5 / 4;
5505 } 5497 }
5506 static const int kCodesStartIndex = kGroupCount; 5498 inline int flags();
5499 inline void set_flags(int flags);
5500 class GroupField : public BitField<int, 0, 3> {};
5501 class CountField : public BitField<int, 3, 27> {};
5502 STATIC_ASSERT(kGroupCount <= GroupField::kMax + 1);
5503 static const int kNextLinkIndex = 0;
5504 static const int kFlagsIndex = 1;
5505 static const int kCodesStartIndex = 2;
5507 }; 5506 };
5508 5507
5509 5508
5510 class PrototypeInfo; 5509 class PrototypeInfo;
5511 5510
5512 5511
5513 // All heap objects have a Map that describes their structure. 5512 // All heap objects have a Map that describes their structure.
5514 // A Map contains information about: 5513 // A Map contains information about:
5515 // - Size information about the object 5514 // - Size information about the object
5516 // - How to iterate over an object (for garbage collection) 5515 // - How to iterate over an object (for garbage collection)
(...skipping 5271 matching lines...) Expand 10 before | Expand all | Expand 10 after
10788 } 10787 }
10789 return value; 10788 return value;
10790 } 10789 }
10791 }; 10790 };
10792 10791
10793 10792
10794 } // NOLINT, false-positive due to second-order macros. 10793 } // NOLINT, false-positive due to second-order macros.
10795 } // NOLINT, false-positive due to second-order macros. 10794 } // NOLINT, false-positive due to second-order macros.
10796 10795
10797 #endif // V8_OBJECTS_H_ 10796 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/crankshaft/lithium.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698