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

Side by Side Diff: src/objects-inl.h

Issue 385004: Remove sliced string string type... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 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 | Annotate | Revision Log
« no previous file with comments | « src/objects-debug.cc ('k') | src/regexp-macro-assembler.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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 196 }
197 197
198 198
199 bool Object::IsExternalTwoByteString() { 199 bool Object::IsExternalTwoByteString() {
200 if (!IsString()) return false; 200 if (!IsString()) return false;
201 return StringShape(String::cast(this)).IsExternal() && 201 return StringShape(String::cast(this)).IsExternal() &&
202 String::cast(this)->IsTwoByteRepresentation(); 202 String::cast(this)->IsTwoByteRepresentation();
203 } 203 }
204 204
205 205
206 bool Object::IsSlicedString() {
207 if (!IsString()) return false;
208 return StringShape(String::cast(this)).IsSliced();
209 }
210
211
212 StringShape::StringShape(String* str) 206 StringShape::StringShape(String* str)
213 : type_(str->map()->instance_type()) { 207 : type_(str->map()->instance_type()) {
214 set_valid(); 208 set_valid();
215 ASSERT((type_ & kIsNotStringMask) == kStringTag); 209 ASSERT((type_ & kIsNotStringMask) == kStringTag);
216 } 210 }
217 211
218 212
219 StringShape::StringShape(Map* map) 213 StringShape::StringShape(Map* map)
220 : type_(map->instance_type()) { 214 : type_(map->instance_type()) {
221 set_valid(); 215 set_valid();
222 ASSERT((type_ & kIsNotStringMask) == kStringTag); 216 ASSERT((type_ & kIsNotStringMask) == kStringTag);
223 } 217 }
224 218
225 219
226 StringShape::StringShape(InstanceType t) 220 StringShape::StringShape(InstanceType t)
227 : type_(static_cast<uint32_t>(t)) { 221 : type_(static_cast<uint32_t>(t)) {
228 set_valid(); 222 set_valid();
229 ASSERT((type_ & kIsNotStringMask) == kStringTag); 223 ASSERT((type_ & kIsNotStringMask) == kStringTag);
230 } 224 }
231 225
232 226
233 bool StringShape::IsSymbol() { 227 bool StringShape::IsSymbol() {
234 ASSERT(valid()); 228 ASSERT(valid());
235 return (type_ & kIsSymbolMask) == kSymbolTag; 229 return (type_ & kIsSymbolMask) == kSymbolTag;
236 } 230 }
237 231
238 232
239 bool String::IsAsciiRepresentation() { 233 bool String::IsAsciiRepresentation() {
240 uint32_t type = map()->instance_type(); 234 uint32_t type = map()->instance_type();
241 if ((type & kStringRepresentationMask) == kSlicedStringTag) {
242 return SlicedString::cast(this)->buffer()->IsAsciiRepresentation();
243 }
244 if ((type & kStringRepresentationMask) == kConsStringTag && 235 if ((type & kStringRepresentationMask) == kConsStringTag &&
245 ConsString::cast(this)->second()->length() == 0) { 236 ConsString::cast(this)->second()->length() == 0) {
246 return ConsString::cast(this)->first()->IsAsciiRepresentation(); 237 return ConsString::cast(this)->first()->IsAsciiRepresentation();
247 } 238 }
248 return (type & kStringEncodingMask) == kAsciiStringTag; 239 return (type & kStringEncodingMask) == kAsciiStringTag;
249 } 240 }
250 241
251 242
252 bool String::IsTwoByteRepresentation() { 243 bool String::IsTwoByteRepresentation() {
253 uint32_t type = map()->instance_type(); 244 uint32_t type = map()->instance_type();
254 if ((type & kStringRepresentationMask) == kSlicedStringTag) { 245 if ((type & kStringRepresentationMask) == kConsStringTag &&
255 return SlicedString::cast(this)->buffer()->IsTwoByteRepresentation();
256 } else if ((type & kStringRepresentationMask) == kConsStringTag &&
257 ConsString::cast(this)->second()->length() == 0) { 246 ConsString::cast(this)->second()->length() == 0) {
258 return ConsString::cast(this)->first()->IsTwoByteRepresentation(); 247 return ConsString::cast(this)->first()->IsTwoByteRepresentation();
259 } 248 }
260 return (type & kStringEncodingMask) == kTwoByteStringTag; 249 return (type & kStringEncodingMask) == kTwoByteStringTag;
261 } 250 }
262 251
263 252
264 bool StringShape::IsCons() { 253 bool StringShape::IsCons() {
265 return (type_ & kStringRepresentationMask) == kConsStringTag; 254 return (type_ & kStringRepresentationMask) == kConsStringTag;
266 } 255 }
267 256
268 257
269 bool StringShape::IsSliced() {
270 return (type_ & kStringRepresentationMask) == kSlicedStringTag;
271 }
272
273
274 bool StringShape::IsExternal() { 258 bool StringShape::IsExternal() {
275 return (type_ & kStringRepresentationMask) == kExternalStringTag; 259 return (type_ & kStringRepresentationMask) == kExternalStringTag;
276 } 260 }
277 261
278 262
279 bool StringShape::IsSequential() { 263 bool StringShape::IsSequential() {
280 return (type_ & kStringRepresentationMask) == kSeqStringTag; 264 return (type_ & kStringRepresentationMask) == kSeqStringTag;
281 } 265 }
282 266
283 267
(...skipping 1311 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 CAST_ACCESSOR(FixedArray) 1579 CAST_ACCESSOR(FixedArray)
1596 CAST_ACCESSOR(DescriptorArray) 1580 CAST_ACCESSOR(DescriptorArray)
1597 CAST_ACCESSOR(SymbolTable) 1581 CAST_ACCESSOR(SymbolTable)
1598 CAST_ACCESSOR(CompilationCacheTable) 1582 CAST_ACCESSOR(CompilationCacheTable)
1599 CAST_ACCESSOR(MapCache) 1583 CAST_ACCESSOR(MapCache)
1600 CAST_ACCESSOR(String) 1584 CAST_ACCESSOR(String)
1601 CAST_ACCESSOR(SeqString) 1585 CAST_ACCESSOR(SeqString)
1602 CAST_ACCESSOR(SeqAsciiString) 1586 CAST_ACCESSOR(SeqAsciiString)
1603 CAST_ACCESSOR(SeqTwoByteString) 1587 CAST_ACCESSOR(SeqTwoByteString)
1604 CAST_ACCESSOR(ConsString) 1588 CAST_ACCESSOR(ConsString)
1605 CAST_ACCESSOR(SlicedString)
1606 CAST_ACCESSOR(ExternalString) 1589 CAST_ACCESSOR(ExternalString)
1607 CAST_ACCESSOR(ExternalAsciiString) 1590 CAST_ACCESSOR(ExternalAsciiString)
1608 CAST_ACCESSOR(ExternalTwoByteString) 1591 CAST_ACCESSOR(ExternalTwoByteString)
1609 CAST_ACCESSOR(JSObject) 1592 CAST_ACCESSOR(JSObject)
1610 CAST_ACCESSOR(Smi) 1593 CAST_ACCESSOR(Smi)
1611 CAST_ACCESSOR(Failure) 1594 CAST_ACCESSOR(Failure)
1612 CAST_ACCESSOR(HeapObject) 1595 CAST_ACCESSOR(HeapObject)
1613 CAST_ACCESSOR(HeapNumber) 1596 CAST_ACCESSOR(HeapNumber)
1614 CAST_ACCESSOR(Oddball) 1597 CAST_ACCESSOR(Oddball)
1615 CAST_ACCESSOR(JSGlobalPropertyCell) 1598 CAST_ACCESSOR(JSGlobalPropertyCell)
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1706 uint16_t String::Get(int index) { 1689 uint16_t String::Get(int index) {
1707 ASSERT(index >= 0 && index < length()); 1690 ASSERT(index >= 0 && index < length());
1708 switch (StringShape(this).full_representation_tag()) { 1691 switch (StringShape(this).full_representation_tag()) {
1709 case kSeqStringTag | kAsciiStringTag: 1692 case kSeqStringTag | kAsciiStringTag:
1710 return SeqAsciiString::cast(this)->SeqAsciiStringGet(index); 1693 return SeqAsciiString::cast(this)->SeqAsciiStringGet(index);
1711 case kSeqStringTag | kTwoByteStringTag: 1694 case kSeqStringTag | kTwoByteStringTag:
1712 return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index); 1695 return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
1713 case kConsStringTag | kAsciiStringTag: 1696 case kConsStringTag | kAsciiStringTag:
1714 case kConsStringTag | kTwoByteStringTag: 1697 case kConsStringTag | kTwoByteStringTag:
1715 return ConsString::cast(this)->ConsStringGet(index); 1698 return ConsString::cast(this)->ConsStringGet(index);
1716 case kSlicedStringTag | kAsciiStringTag:
1717 case kSlicedStringTag | kTwoByteStringTag:
1718 return SlicedString::cast(this)->SlicedStringGet(index);
1719 case kExternalStringTag | kAsciiStringTag: 1699 case kExternalStringTag | kAsciiStringTag:
1720 return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index); 1700 return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
1721 case kExternalStringTag | kTwoByteStringTag: 1701 case kExternalStringTag | kTwoByteStringTag:
1722 return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index); 1702 return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
1723 default: 1703 default:
1724 break; 1704 break;
1725 } 1705 }
1726 1706
1727 UNREACHABLE(); 1707 UNREACHABLE();
1728 return 0; 1708 return 0;
(...skipping 10 matching lines...) Expand all
1739 } 1719 }
1740 1720
1741 1721
1742 bool String::IsFlat() { 1722 bool String::IsFlat() {
1743 switch (StringShape(this).representation_tag()) { 1723 switch (StringShape(this).representation_tag()) {
1744 case kConsStringTag: { 1724 case kConsStringTag: {
1745 String* second = ConsString::cast(this)->second(); 1725 String* second = ConsString::cast(this)->second();
1746 // Only flattened strings have second part empty. 1726 // Only flattened strings have second part empty.
1747 return second->length() == 0; 1727 return second->length() == 0;
1748 } 1728 }
1749 case kSlicedStringTag: {
1750 StringRepresentationTag tag =
1751 StringShape(SlicedString::cast(this)->buffer()).representation_tag();
1752 return tag == kSeqStringTag || tag == kExternalStringTag;
1753 }
1754 default: 1729 default:
1755 return true; 1730 return true;
1756 } 1731 }
1757 } 1732 }
1758 1733
1759 1734
1760 uint16_t SeqAsciiString::SeqAsciiStringGet(int index) { 1735 uint16_t SeqAsciiString::SeqAsciiStringGet(int index) {
1761 ASSERT(index >= 0 && index < length()); 1736 ASSERT(index >= 0 && index < length());
1762 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 1737 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
1763 } 1738 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1857 return READ_FIELD(this, kSecondOffset); 1832 return READ_FIELD(this, kSecondOffset);
1858 } 1833 }
1859 1834
1860 1835
1861 void ConsString::set_second(String* value, WriteBarrierMode mode) { 1836 void ConsString::set_second(String* value, WriteBarrierMode mode) {
1862 WRITE_FIELD(this, kSecondOffset, value); 1837 WRITE_FIELD(this, kSecondOffset, value);
1863 CONDITIONAL_WRITE_BARRIER(this, kSecondOffset, mode); 1838 CONDITIONAL_WRITE_BARRIER(this, kSecondOffset, mode);
1864 } 1839 }
1865 1840
1866 1841
1867 String* SlicedString::buffer() {
1868 return String::cast(READ_FIELD(this, kBufferOffset));
1869 }
1870
1871
1872 void SlicedString::set_buffer(String* buffer) {
1873 WRITE_FIELD(this, kBufferOffset, buffer);
1874 WRITE_BARRIER(this, kBufferOffset);
1875 }
1876
1877
1878 int SlicedString::start() {
1879 return READ_INT_FIELD(this, kStartOffset);
1880 }
1881
1882
1883 void SlicedString::set_start(int start) {
1884 WRITE_INT_FIELD(this, kStartOffset, start);
1885 }
1886
1887
1888 ExternalAsciiString::Resource* ExternalAsciiString::resource() { 1842 ExternalAsciiString::Resource* ExternalAsciiString::resource() {
1889 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); 1843 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
1890 } 1844 }
1891 1845
1892 1846
1893 void ExternalAsciiString::set_resource( 1847 void ExternalAsciiString::set_resource(
1894 ExternalAsciiString::Resource* resource) { 1848 ExternalAsciiString::Resource* resource) {
1895 *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource; 1849 *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource;
1896 } 1850 }
1897 1851
(...skipping 1250 matching lines...) Expand 10 before | Expand all | Expand 10 after
3148 #undef WRITE_INT_FIELD 3102 #undef WRITE_INT_FIELD
3149 #undef READ_SHORT_FIELD 3103 #undef READ_SHORT_FIELD
3150 #undef WRITE_SHORT_FIELD 3104 #undef WRITE_SHORT_FIELD
3151 #undef READ_BYTE_FIELD 3105 #undef READ_BYTE_FIELD
3152 #undef WRITE_BYTE_FIELD 3106 #undef WRITE_BYTE_FIELD
3153 3107
3154 3108
3155 } } // namespace v8::internal 3109 } } // namespace v8::internal
3156 3110
3157 #endif // V8_OBJECTS_INL_H_ 3111 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/regexp-macro-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698