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

Side by Side Diff: src/objects.h

Issue 6088012: Separate markbits from heap object map words into bitmaps. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: profiler related code reenabled Created 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 912 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 // collection. Only valid during a scavenge collection (specifically, 923 // collection. Only valid during a scavenge collection (specifically,
924 // when all map words are heap object pointers, ie. not during a full GC). 924 // when all map words are heap object pointers, ie. not during a full GC).
925 inline bool IsForwardingAddress(); 925 inline bool IsForwardingAddress();
926 926
927 // Create a map word from a forwarding address. 927 // Create a map word from a forwarding address.
928 static inline MapWord FromForwardingAddress(HeapObject* object); 928 static inline MapWord FromForwardingAddress(HeapObject* object);
929 929
930 // View this map word as a forwarding address. 930 // View this map word as a forwarding address.
931 inline HeapObject* ToForwardingAddress(); 931 inline HeapObject* ToForwardingAddress();
932 932
933 // Marking phase of full collection: the map word of live objects is 933 static inline MapWord FromRawValue(uintptr_t value) {
934 // marked, and may be marked as overflowed (eg, the object is live, its 934 return MapWord(value);
935 // children have not been visited, and it does not fit in the marking 935 }
936 // stack).
937 936
938 // True if this map word's mark bit is set. 937 inline uintptr_t ToRawValue() {
939 inline bool IsMarked(); 938 return value_;
940 939 }
941 // Return this map word but with its mark bit set.
942 inline void SetMark();
943
944 // Return this map word but with its mark bit cleared.
945 inline void ClearMark();
946
947 // True if this map word's overflow bit is set.
948 inline bool IsOverflowed();
949
950 // Return this map word but with its overflow bit set.
951 inline void SetOverflow();
952
953 // Return this map word but with its overflow bit cleared.
954 inline void ClearOverflow();
955
956 // Bits used by the marking phase of the garbage collector.
957 //
958 // The first word of a heap object is normally a map pointer. The last two
959 // bits are tagged as '01' (kHeapObjectTag). We reuse the last two bits to
960 // mark an object as live and/or overflowed:
961 // last bit = 0, marked as alive
962 // second bit = 1, overflowed
963 // An object is only marked as overflowed when it is marked as live while
964 // the marking stack is overflowed.
965 static const int kMarkingBit = 0; // marking bit
966 static const int kMarkingMask = (1 << kMarkingBit); // marking mask
967 static const int kOverflowBit = 1; // overflow bit
968 static const int kOverflowMask = (1 << kOverflowBit); // overflow mask
969 940
970 private: 941 private:
971 // HeapObject calls the private constructor and directly reads the value. 942 // HeapObject calls the private constructor and directly reads the value.
972 friend class HeapObject; 943 friend class HeapObject;
973 944
974 explicit MapWord(uintptr_t value) : value_(value) {} 945 explicit MapWord(uintptr_t value) : value_(value) {}
975 946
976 uintptr_t value_; 947 uintptr_t value_;
977 }; 948 };
978 949
(...skipping 28 matching lines...) Expand all
1007 void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); 978 void IterateBody(InstanceType type, int object_size, ObjectVisitor* v);
1008 979
1009 // Returns the heap object's size in bytes 980 // Returns the heap object's size in bytes
1010 inline int Size(); 981 inline int Size();
1011 982
1012 // Given a heap object's map pointer, returns the heap size in bytes 983 // Given a heap object's map pointer, returns the heap size in bytes
1013 // Useful when the map pointer field is used for other purposes. 984 // Useful when the map pointer field is used for other purposes.
1014 // GC internal. 985 // GC internal.
1015 inline int SizeFromMap(Map* map); 986 inline int SizeFromMap(Map* map);
1016 987
1017 // Support for the marking heap objects during the marking phase of GC.
1018 // True if the object is marked live.
1019 inline bool IsMarked();
1020
1021 // Mutate this object's map pointer to indicate that the object is live.
1022 inline void SetMark();
1023
1024 // Mutate this object's map pointer to remove the indication that the
1025 // object is live (ie, partially restore the map pointer).
1026 inline void ClearMark();
1027
1028 // True if this object is marked as overflowed. Overflowed objects have 988 // True if this object is marked as overflowed. Overflowed objects have
1029 // been reached and marked during marking of the heap, but their children 989 // been reached and marked during marking of the heap, but their children
1030 // have not necessarily been marked and they have not been pushed on the 990 // have not necessarily been marked and they have not been pushed on the
1031 // marking stack. 991 // marking stack.
1032 inline bool IsOverflowed(); 992 inline bool IsOverflowed() { return false; }
1033 993
1034 // Mutate this object's map pointer to indicate that the object is 994 // Mutate this object's map pointer to indicate that the object is
1035 // overflowed. 995 // overflowed.
1036 inline void SetOverflow(); 996 inline void SetOverflow() {}
1037 997
1038 // Mutate this object's map pointer to remove the indication that the 998 // Mutate this object's map pointer to remove the indication that the
1039 // object is overflowed (ie, partially restore the map pointer). 999 // object is overflowed (ie, partially restore the map pointer).
1040 inline void ClearOverflow(); 1000 inline void ClearOverflow() {}
1041 1001
1042 // Returns the field at offset in obj, as a read/write Object* reference. 1002 // Returns the field at offset in obj, as a read/write Object* reference.
1043 // Does no checking, and is safe to use during GC, while maps are invalid. 1003 // Does no checking, and is safe to use during GC, while maps are invalid.
1044 // Does not invoke write barrier, so should only be assigned to 1004 // Does not invoke write barrier, so should only be assigned to
1045 // during marking GC. 1005 // during marking GC.
1046 static inline Object** RawField(HeapObject* obj, int offset); 1006 static inline Object** RawField(HeapObject* obj, int offset);
1047 1007
1048 // Casting. 1008 // Casting.
1049 static inline HeapObject* cast(Object* obj); 1009 static inline HeapObject* cast(Object* obj);
1050 1010
(...skipping 5279 matching lines...) Expand 10 before | Expand all | Expand 10 after
6330 } else { 6290 } else {
6331 value &= ~(1 << bit_position); 6291 value &= ~(1 << bit_position);
6332 } 6292 }
6333 return value; 6293 return value;
6334 } 6294 }
6335 }; 6295 };
6336 6296
6337 } } // namespace v8::internal 6297 } } // namespace v8::internal
6338 6298
6339 #endif // V8_OBJECTS_H_ 6299 #endif // V8_OBJECTS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698