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

Side by Side Diff: src/objects.h

Issue 7477045: Tentative implementation of string slices (hidden under the flag --string-slices). (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Some more suggested changes. Created 9 years, 4 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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 // - CompilationCacheTable 79 // - CompilationCacheTable
80 // - CodeCacheHashTable 80 // - CodeCacheHashTable
81 // - MapCache 81 // - MapCache
82 // - Context 82 // - Context
83 // - JSFunctionResultCache 83 // - JSFunctionResultCache
84 // - SerializedScopeInfo 84 // - SerializedScopeInfo
85 // - String 85 // - String
86 // - SeqString 86 // - SeqString
87 // - SeqAsciiString 87 // - SeqAsciiString
88 // - SeqTwoByteString 88 // - SeqTwoByteString
89 // - SlicedString
89 // - ConsString 90 // - ConsString
90 // - ExternalString 91 // - ExternalString
91 // - ExternalAsciiString 92 // - ExternalAsciiString
92 // - ExternalTwoByteString 93 // - ExternalTwoByteString
93 // - HeapNumber 94 // - HeapNumber
94 // - Code 95 // - Code
95 // - Map 96 // - Map
96 // - Oddball 97 // - Oddball
97 // - Foreign 98 // - Foreign
98 // - SharedFunctionInfo 99 // - SharedFunctionInfo
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 V(ASCII_SYMBOL_TYPE) \ 274 V(ASCII_SYMBOL_TYPE) \
274 V(CONS_SYMBOL_TYPE) \ 275 V(CONS_SYMBOL_TYPE) \
275 V(CONS_ASCII_SYMBOL_TYPE) \ 276 V(CONS_ASCII_SYMBOL_TYPE) \
276 V(EXTERNAL_SYMBOL_TYPE) \ 277 V(EXTERNAL_SYMBOL_TYPE) \
277 V(EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE) \ 278 V(EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE) \
278 V(EXTERNAL_ASCII_SYMBOL_TYPE) \ 279 V(EXTERNAL_ASCII_SYMBOL_TYPE) \
279 V(STRING_TYPE) \ 280 V(STRING_TYPE) \
280 V(ASCII_STRING_TYPE) \ 281 V(ASCII_STRING_TYPE) \
281 V(CONS_STRING_TYPE) \ 282 V(CONS_STRING_TYPE) \
282 V(CONS_ASCII_STRING_TYPE) \ 283 V(CONS_ASCII_STRING_TYPE) \
284 V(SLICED_STRING_TYPE) \
283 V(EXTERNAL_STRING_TYPE) \ 285 V(EXTERNAL_STRING_TYPE) \
284 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE) \ 286 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE) \
285 V(EXTERNAL_ASCII_STRING_TYPE) \ 287 V(EXTERNAL_ASCII_STRING_TYPE) \
286 V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \ 288 V(PRIVATE_EXTERNAL_ASCII_STRING_TYPE) \
287 \ 289 \
288 V(MAP_TYPE) \ 290 V(MAP_TYPE) \
289 V(CODE_TYPE) \ 291 V(CODE_TYPE) \
290 V(ODDBALL_TYPE) \ 292 V(ODDBALL_TYPE) \
291 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \ 293 V(JS_GLOBAL_PROPERTY_CELL_TYPE) \
292 \ 294 \
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 ascii_string, \ 391 ascii_string, \
390 AsciiString) \ 392 AsciiString) \
391 V(CONS_STRING_TYPE, \ 393 V(CONS_STRING_TYPE, \
392 ConsString::kSize, \ 394 ConsString::kSize, \
393 cons_string, \ 395 cons_string, \
394 ConsString) \ 396 ConsString) \
395 V(CONS_ASCII_STRING_TYPE, \ 397 V(CONS_ASCII_STRING_TYPE, \
396 ConsString::kSize, \ 398 ConsString::kSize, \
397 cons_ascii_string, \ 399 cons_ascii_string, \
398 ConsAsciiString) \ 400 ConsAsciiString) \
401 V(SLICED_STRING_TYPE, \
402 SlicedString::kSize, \
403 sliced_string, \
404 SlicedString) \
405 V(SLICED_ASCII_STRING_TYPE, \
406 SlicedString::kSize, \
407 sliced_ascii_string, \
408 SlicedAsciiString) \
399 V(EXTERNAL_STRING_TYPE, \ 409 V(EXTERNAL_STRING_TYPE, \
400 ExternalTwoByteString::kSize, \ 410 ExternalTwoByteString::kSize, \
401 external_string, \ 411 external_string, \
402 ExternalString) \ 412 ExternalString) \
403 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE, \ 413 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE, \
404 ExternalTwoByteString::kSize, \ 414 ExternalTwoByteString::kSize, \
405 external_string_with_ascii_data, \ 415 external_string_with_ascii_data, \
406 ExternalStringWithAsciiData) \ 416 ExternalStringWithAsciiData) \
407 V(EXTERNAL_ASCII_STRING_TYPE, \ 417 V(EXTERNAL_ASCII_STRING_TYPE, \
408 ExternalAsciiString::kSize, \ 418 ExternalAsciiString::kSize, \
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 const uint32_t kStringEncodingMask = 0x4; 472 const uint32_t kStringEncodingMask = 0x4;
463 const uint32_t kTwoByteStringTag = 0x0; 473 const uint32_t kTwoByteStringTag = 0x0;
464 const uint32_t kAsciiStringTag = 0x4; 474 const uint32_t kAsciiStringTag = 0x4;
465 475
466 // If bit 7 is clear, the low-order 2 bits indicate the representation 476 // If bit 7 is clear, the low-order 2 bits indicate the representation
467 // of the string. 477 // of the string.
468 const uint32_t kStringRepresentationMask = 0x03; 478 const uint32_t kStringRepresentationMask = 0x03;
469 enum StringRepresentationTag { 479 enum StringRepresentationTag {
470 kSeqStringTag = 0x0, 480 kSeqStringTag = 0x0,
471 kConsStringTag = 0x1, 481 kConsStringTag = 0x1,
472 kExternalStringTag = 0x2 482 kExternalStringTag = 0x2,
483 kSlicedStringTag = 0x3
473 }; 484 };
474 const uint32_t kIsConsStringMask = 0x1; 485 const uint32_t kIsIndirectStringMask = 0x1;
486 const uint32_t kIsIndirectStringTag = 0x1;
487 STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0);
488 STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0);
489 STATIC_ASSERT(
490 (kConsStringTag & kIsIndirectStringMask) == kIsIndirectStringTag);
491 STATIC_ASSERT(
492 (kSlicedStringTag & kIsIndirectStringMask) == kIsIndirectStringTag);
475 493
476 // If bit 7 is clear, then bit 3 indicates whether this two-byte 494 // If bit 7 is clear, then bit 3 indicates whether this two-byte
477 // string actually contains ascii data. 495 // string actually contains ascii data.
478 const uint32_t kAsciiDataHintMask = 0x08; 496 const uint32_t kAsciiDataHintMask = 0x08;
479 const uint32_t kAsciiDataHintTag = 0x08; 497 const uint32_t kAsciiDataHintTag = 0x08;
480 498
481 499
482 // A ConsString with an empty string as the right side is a candidate 500 // A ConsString with an empty string as the right side is a candidate
483 // for being shortcut by the garbage collector unless it is a 501 // for being shortcut by the garbage collector unless it is a
484 // symbol. It's not common to have non-flat symbols, so we do not 502 // symbol. It's not common to have non-flat symbols, so we do not
(...skipping 14 matching lines...) Expand all
499 CONS_ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kConsStringTag, 517 CONS_ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kConsStringTag,
500 EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag, 518 EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag,
501 EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE = 519 EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE =
502 kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag, 520 kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag,
503 EXTERNAL_ASCII_SYMBOL_TYPE = 521 EXTERNAL_ASCII_SYMBOL_TYPE =
504 kAsciiStringTag | kSymbolTag | kExternalStringTag, 522 kAsciiStringTag | kSymbolTag | kExternalStringTag,
505 STRING_TYPE = kTwoByteStringTag | kSeqStringTag, 523 STRING_TYPE = kTwoByteStringTag | kSeqStringTag,
506 ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag, 524 ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag,
507 CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag, 525 CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag,
508 CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag, 526 CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag,
527 SLICED_STRING_TYPE = kTwoByteStringTag | kSlicedStringTag,
528 SLICED_ASCII_STRING_TYPE = kAsciiStringTag | kSlicedStringTag,
509 EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag, 529 EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag,
510 EXTERNAL_STRING_WITH_ASCII_DATA_TYPE = 530 EXTERNAL_STRING_WITH_ASCII_DATA_TYPE =
511 kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag, 531 kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag,
512 // LAST_STRING_TYPE 532 // LAST_STRING_TYPE
513 EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag, 533 EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag,
514 PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, 534 PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE,
515 535
516 // Objects allocated in their own spaces (never in new space). 536 // Objects allocated in their own spaces (never in new space).
517 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE 537 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE
518 CODE_TYPE, 538 CODE_TYPE,
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 V(HeapObject) \ 722 V(HeapObject) \
703 V(Number) \ 723 V(Number) \
704 724
705 #define HEAP_OBJECT_TYPE_LIST(V) \ 725 #define HEAP_OBJECT_TYPE_LIST(V) \
706 V(HeapNumber) \ 726 V(HeapNumber) \
707 V(String) \ 727 V(String) \
708 V(Symbol) \ 728 V(Symbol) \
709 V(SeqString) \ 729 V(SeqString) \
710 V(ExternalString) \ 730 V(ExternalString) \
711 V(ConsString) \ 731 V(ConsString) \
732 V(SlicedString) \
712 V(ExternalTwoByteString) \ 733 V(ExternalTwoByteString) \
713 V(ExternalAsciiString) \ 734 V(ExternalAsciiString) \
714 V(SeqTwoByteString) \ 735 V(SeqTwoByteString) \
715 V(SeqAsciiString) \ 736 V(SeqAsciiString) \
716 \ 737 \
717 V(ExternalArray) \ 738 V(ExternalArray) \
718 V(ExternalByteArray) \ 739 V(ExternalByteArray) \
719 V(ExternalUnsignedByteArray) \ 740 V(ExternalUnsignedByteArray) \
720 V(ExternalShortArray) \ 741 V(ExternalShortArray) \
721 V(ExternalUnsignedShortArray) \ 742 V(ExternalUnsignedShortArray) \
(...skipping 4960 matching lines...) Expand 10 before | Expand all | Expand 10 after
5682 // prone and so we no longer put StringShapes in variables unless there is a 5703 // prone and so we no longer put StringShapes in variables unless there is a
5683 // concrete performance benefit at that particular point in the code. 5704 // concrete performance benefit at that particular point in the code.
5684 class StringShape BASE_EMBEDDED { 5705 class StringShape BASE_EMBEDDED {
5685 public: 5706 public:
5686 inline explicit StringShape(String* s); 5707 inline explicit StringShape(String* s);
5687 inline explicit StringShape(Map* s); 5708 inline explicit StringShape(Map* s);
5688 inline explicit StringShape(InstanceType t); 5709 inline explicit StringShape(InstanceType t);
5689 inline bool IsSequential(); 5710 inline bool IsSequential();
5690 inline bool IsExternal(); 5711 inline bool IsExternal();
5691 inline bool IsCons(); 5712 inline bool IsCons();
5713 inline bool IsSliced();
5714 inline bool IsIndirect();
5692 inline bool IsExternalAscii(); 5715 inline bool IsExternalAscii();
5693 inline bool IsExternalTwoByte(); 5716 inline bool IsExternalTwoByte();
5694 inline bool IsSequentialAscii(); 5717 inline bool IsSequentialAscii();
5695 inline bool IsSequentialTwoByte(); 5718 inline bool IsSequentialTwoByte();
5696 inline bool IsSymbol(); 5719 inline bool IsSymbol();
5697 inline StringRepresentationTag representation_tag(); 5720 inline StringRepresentationTag representation_tag();
5698 inline uint32_t full_representation_tag(); 5721 inline uint32_t full_representation_tag();
5699 inline uint32_t size_tag(); 5722 inline uint32_t size_tag();
5700 #ifdef DEBUG 5723 #ifdef DEBUG
5701 inline uint32_t type() { return type_; } 5724 inline uint32_t type() { return type_; }
(...skipping 28 matching lines...) Expand all
5730 inline int length(); 5753 inline int length();
5731 inline void set_length(int value); 5754 inline void set_length(int value);
5732 5755
5733 // Get and set the hash field of the string. 5756 // Get and set the hash field of the string.
5734 inline uint32_t hash_field(); 5757 inline uint32_t hash_field();
5735 inline void set_hash_field(uint32_t value); 5758 inline void set_hash_field(uint32_t value);
5736 5759
5737 inline bool IsAsciiRepresentation(); 5760 inline bool IsAsciiRepresentation();
5738 inline bool IsTwoByteRepresentation(); 5761 inline bool IsTwoByteRepresentation();
5739 5762
5763 // Cons and slices have an encoding flag that may not represent the actual
5764 // encoding of the underlying string. This is taken into account here.
5765 // Requires: this->IsFlat()
5766 inline bool IsAsciiRepresentationUnderneath();
5767 inline bool IsTwoByteRepresentationUnderneath();
5768
5740 // Returns whether this string has ascii chars, i.e. all of them can 5769 // Returns whether this string has ascii chars, i.e. all of them can
5741 // be ascii encoded. This might be the case even if the string is 5770 // be ascii encoded. This might be the case even if the string is
5742 // two-byte. Such strings may appear when the embedder prefers 5771 // two-byte. Such strings may appear when the embedder prefers
5743 // two-byte external representations even for ascii data. 5772 // two-byte external representations even for ascii data.
5744 // 5773 //
5745 // NOTE: this should be considered only a hint. False negatives are 5774 // NOTE: this should be considered only a hint. False negatives are
5746 // possible. 5775 // possible.
5747 inline bool HasOnlyAsciiChars(); 5776 inline bool HasOnlyAsciiChars();
5748 5777
5749 // Get and set individual two byte chars in the string. 5778 // Get and set individual two byte chars in the string.
(...skipping 17 matching lines...) Expand all
5767 // 5796 //
5768 // Use FlattenString from Handles.cc to flatten even in case an 5797 // Use FlattenString from Handles.cc to flatten even in case an
5769 // allocation failure happens. 5798 // allocation failure happens.
5770 inline MaybeObject* TryFlatten(PretenureFlag pretenure = NOT_TENURED); 5799 inline MaybeObject* TryFlatten(PretenureFlag pretenure = NOT_TENURED);
5771 5800
5772 // Convenience function. Has exactly the same behavior as 5801 // Convenience function. Has exactly the same behavior as
5773 // TryFlatten(), except in the case of failure returns the original 5802 // TryFlatten(), except in the case of failure returns the original
5774 // string. 5803 // string.
5775 inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED); 5804 inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED);
5776 5805
5806 // Returns the parent of a sliced string or first part of a flat cons string.
5807 // Requires: StringShape(this).IsIndirect() && this->IsFlat()
5808 inline String* GetUnderlying();
5809
5777 Vector<const char> ToAsciiVector(); 5810 Vector<const char> ToAsciiVector();
5778 Vector<const uc16> ToUC16Vector(); 5811 Vector<const uc16> ToUC16Vector();
5779 5812
5780 // Mark the string as an undetectable object. It only applies to 5813 // Mark the string as an undetectable object. It only applies to
5781 // ascii and two byte string types. 5814 // ascii and two byte string types.
5782 bool MarkAsUndetectable(); 5815 bool MarkAsUndetectable();
5783 5816
5784 // Return a substring. 5817 // Return a substring.
5785 MUST_USE_RESULT MaybeObject* SubString(int from, 5818 MUST_USE_RESULT MaybeObject* SubString(int from,
5786 int to, 5819 int to,
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
6196 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, 6229 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer,
6197 unsigned* offset_ptr, 6230 unsigned* offset_ptr,
6198 unsigned chars); 6231 unsigned chars);
6199 6232
6200 // Minimum length for a cons string. 6233 // Minimum length for a cons string.
6201 static const int kMinLength = 13; 6234 static const int kMinLength = 13;
6202 6235
6203 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> 6236 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize>
6204 BodyDescriptor; 6237 BodyDescriptor;
6205 6238
6239 #ifdef DEBUG
6240 void ConsStringVerify();
6241 #endif
6242
6206 private: 6243 private:
6207 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); 6244 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString);
6208 }; 6245 };
6209 6246
6210 6247
6248 // The Sliced String class describes strings that are substrings of another
6249 // sequential string. The motivation is to save time and memory when creating
6250 // a substring. A Sliced String is described as a pointer to the parent,
6251 // the offset from the start of the parent string and the length. Using
6252 // a Sliced String therefore requires unpacking of the parent string and
6253 // adding the offset to the start address. A substring of a Sliced String
6254 // are not nested since the double indirection is simplified when creating
6255 // such a substring.
6256 // Currently missing features are:
6257 // - handling externalized parent strings
6258 // - external strings as parent
6259 // - truncating sliced string to enable otherwise unneeded parent to be GC'ed.
6260 class SlicedString: public String {
6261 public:
6262
6263 inline String* parent();
6264 inline void set_parent(String* parent);
6265 inline int offset();
6266 inline void set_offset(int offset);
6267
6268 // Dispatched behavior.
6269 uint16_t SlicedStringGet(int index);
6270
6271 // Casting.
6272 static inline SlicedString* cast(Object* obj);
6273
6274 // Layout description.
6275 static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize);
6276 static const int kOffsetOffset = kParentOffset + kPointerSize;
6277 static const int kSize = kOffsetOffset + kPointerSize;
6278
6279 // Support for StringInputBuffer
6280 inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer,
6281 unsigned* offset_ptr,
6282 unsigned chars);
6283 inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer,
6284 unsigned* offset_ptr,
6285 unsigned chars);
6286 // Minimum length for a sliced string.
6287 static const int kMinLength = 13;
6288
6289 typedef FixedBodyDescriptor<kParentOffset,
6290 kOffsetOffset + kPointerSize, kSize>
6291 BodyDescriptor;
6292
6293 #ifdef DEBUG
6294 void SlicedStringVerify();
6295 #endif
6296
6297 private:
6298 DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString);
6299 };
6300
6301
6211 // The ExternalString class describes string values that are backed by 6302 // The ExternalString class describes string values that are backed by
6212 // a string resource that lies outside the V8 heap. ExternalStrings 6303 // a string resource that lies outside the V8 heap. ExternalStrings
6213 // consist of the length field common to all strings, a pointer to the 6304 // consist of the length field common to all strings, a pointer to the
6214 // external resource. It is important to ensure (externally) that the 6305 // external resource. It is important to ensure (externally) that the
6215 // resource is not deallocated while the ExternalString is live in the 6306 // resource is not deallocated while the ExternalString is live in the
6216 // V8 heap. 6307 // V8 heap.
6217 // 6308 //
6218 // The API expects that all ExternalStrings are created through the 6309 // The API expects that all ExternalStrings are created through the
6219 // API. Therefore, ExternalStrings should not be used internally. 6310 // API. Therefore, ExternalStrings should not be used internally.
6220 class ExternalString: public String { 6311 class ExternalString: public String {
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after
7183 } else { 7274 } else {
7184 value &= ~(1 << bit_position); 7275 value &= ~(1 << bit_position);
7185 } 7276 }
7186 return value; 7277 return value;
7187 } 7278 }
7188 }; 7279 };
7189 7280
7190 } } // namespace v8::internal 7281 } } // namespace v8::internal
7191 7282
7192 #endif // V8_OBJECTS_H_ 7283 #endif // V8_OBJECTS_H_
OLDNEW
« src/ia32/code-stubs-ia32.cc ('K') | « src/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698