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

Side by Side Diff: src/objects.h

Issue 2549773002: Internalize strings in-place (Closed)
Patch Set: rebased Created 3 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
« no previous file with comments | « src/mips64/codegen-mips64.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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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 #include <memory> 9 #include <memory>
10 10
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 // - ScriptContextTable 102 // - ScriptContextTable
103 // - WeakFixedArray 103 // - WeakFixedArray
104 // - FixedDoubleArray 104 // - FixedDoubleArray
105 // - Name 105 // - Name
106 // - String 106 // - String
107 // - SeqString 107 // - SeqString
108 // - SeqOneByteString 108 // - SeqOneByteString
109 // - SeqTwoByteString 109 // - SeqTwoByteString
110 // - SlicedString 110 // - SlicedString
111 // - ConsString 111 // - ConsString
112 // - ThinString
112 // - ExternalString 113 // - ExternalString
113 // - ExternalOneByteString 114 // - ExternalOneByteString
114 // - ExternalTwoByteString 115 // - ExternalTwoByteString
115 // - InternalizedString 116 // - InternalizedString
116 // - SeqInternalizedString 117 // - SeqInternalizedString
117 // - SeqOneByteInternalizedString 118 // - SeqOneByteInternalizedString
118 // - SeqTwoByteInternalizedString 119 // - SeqTwoByteInternalizedString
119 // - ConsInternalizedString 120 // - ConsInternalizedString
120 // - ExternalInternalizedString 121 // - ExternalInternalizedString
121 // - ExternalOneByteInternalizedString 122 // - ExternalOneByteInternalizedString
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 V(ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 324 V(ONE_BYTE_INTERNALIZED_STRING_TYPE) \
324 V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 325 V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \
325 V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 326 V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \
326 V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE) \ 327 V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE) \
327 V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 328 V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \
328 V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 329 V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \
329 V(STRING_TYPE) \ 330 V(STRING_TYPE) \
330 V(CONS_STRING_TYPE) \ 331 V(CONS_STRING_TYPE) \
331 V(EXTERNAL_STRING_TYPE) \ 332 V(EXTERNAL_STRING_TYPE) \
332 V(SLICED_STRING_TYPE) \ 333 V(SLICED_STRING_TYPE) \
334 V(THIN_STRING_TYPE) \
333 V(ONE_BYTE_STRING_TYPE) \ 335 V(ONE_BYTE_STRING_TYPE) \
334 V(CONS_ONE_BYTE_STRING_TYPE) \ 336 V(CONS_ONE_BYTE_STRING_TYPE) \
335 V(EXTERNAL_ONE_BYTE_STRING_TYPE) \ 337 V(EXTERNAL_ONE_BYTE_STRING_TYPE) \
336 V(SLICED_ONE_BYTE_STRING_TYPE) \ 338 V(SLICED_ONE_BYTE_STRING_TYPE) \
339 V(THIN_ONE_BYTE_STRING_TYPE) \
337 V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 340 V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \
338 V(SHORT_EXTERNAL_STRING_TYPE) \ 341 V(SHORT_EXTERNAL_STRING_TYPE) \
339 V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE) \ 342 V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE) \
340 V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 343 V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \
341 \ 344 \
342 V(SYMBOL_TYPE) \ 345 V(SYMBOL_TYPE) \
343 V(HEAP_NUMBER_TYPE) \ 346 V(HEAP_NUMBER_TYPE) \
344 V(SIMD128_VALUE_TYPE) \ 347 V(SIMD128_VALUE_TYPE) \
345 V(ODDBALL_TYPE) \ 348 V(ODDBALL_TYPE) \
346 \ 349 \
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE, \ 513 V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE, \
511 ExternalTwoByteString::kShortSize, short_external_internalized_string, \ 514 ExternalTwoByteString::kShortSize, short_external_internalized_string, \
512 ShortExternalInternalizedString) \ 515 ShortExternalInternalizedString) \
513 V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, \ 516 V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, \
514 ExternalOneByteString::kShortSize, \ 517 ExternalOneByteString::kShortSize, \
515 short_external_one_byte_internalized_string, \ 518 short_external_one_byte_internalized_string, \
516 ShortExternalOneByteInternalizedString) \ 519 ShortExternalOneByteInternalizedString) \
517 V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 520 V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \
518 ExternalTwoByteString::kShortSize, \ 521 ExternalTwoByteString::kShortSize, \
519 short_external_internalized_string_with_one_byte_data, \ 522 short_external_internalized_string_with_one_byte_data, \
520 ShortExternalInternalizedStringWithOneByteData) 523 ShortExternalInternalizedStringWithOneByteData) \
524 V(THIN_STRING_TYPE, ThinString::kSize, thin_string, ThinString) \
525 V(THIN_ONE_BYTE_STRING_TYPE, ThinString::kSize, thin_one_byte_string, \
526 ThinOneByteString)
521 527
522 // A struct is a simple object a set of object-valued fields. Including an 528 // A struct is a simple object a set of object-valued fields. Including an
523 // object type in this causes the compiler to generate most of the boilerplate 529 // object type in this causes the compiler to generate most of the boilerplate
524 // code for the class including allocation and garbage collection routines, 530 // code for the class including allocation and garbage collection routines,
525 // casts and predicates. All you need to define is the class, methods and 531 // casts and predicates. All you need to define is the class, methods and
526 // object verification routines. Easy, no? 532 // object verification routines. Easy, no?
527 // 533 //
528 // Note that for subtle reasons related to the ordering or numerical values of 534 // Note that for subtle reasons related to the ordering or numerical values of
529 // type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST 535 // type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST
530 // manually. 536 // manually.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 const uint32_t kIsNotStringMask = 0x80; 568 const uint32_t kIsNotStringMask = 0x80;
563 const uint32_t kStringTag = 0x0; 569 const uint32_t kStringTag = 0x0;
564 const uint32_t kNotStringTag = 0x80; 570 const uint32_t kNotStringTag = 0x80;
565 571
566 // Bit 6 indicates that the object is an internalized string (if set) or not. 572 // Bit 6 indicates that the object is an internalized string (if set) or not.
567 // Bit 7 has to be clear as well. 573 // Bit 7 has to be clear as well.
568 const uint32_t kIsNotInternalizedMask = 0x40; 574 const uint32_t kIsNotInternalizedMask = 0x40;
569 const uint32_t kNotInternalizedTag = 0x40; 575 const uint32_t kNotInternalizedTag = 0x40;
570 const uint32_t kInternalizedTag = 0x0; 576 const uint32_t kInternalizedTag = 0x0;
571 577
572 // If bit 7 is clear then bit 2 indicates whether the string consists of 578 // If bit 7 is clear then bit 3 indicates whether the string consists of
573 // two-byte characters or one-byte characters. 579 // two-byte characters or one-byte characters.
574 const uint32_t kStringEncodingMask = 0x4; 580 const uint32_t kStringEncodingMask = 0x8;
575 const uint32_t kTwoByteStringTag = 0x0; 581 const uint32_t kTwoByteStringTag = 0x0;
576 const uint32_t kOneByteStringTag = 0x4; 582 const uint32_t kOneByteStringTag = 0x8;
577 583
578 // If bit 7 is clear, the low-order 2 bits indicate the representation 584 // If bit 7 is clear, the low-order 3 bits indicate the representation
579 // of the string. 585 // of the string.
580 const uint32_t kStringRepresentationMask = 0x03; 586 const uint32_t kStringRepresentationMask = 0x07;
581 enum StringRepresentationTag { 587 enum StringRepresentationTag {
582 kSeqStringTag = 0x0, 588 kSeqStringTag = 0x0,
583 kConsStringTag = 0x1, 589 kConsStringTag = 0x1,
584 kExternalStringTag = 0x2, 590 kExternalStringTag = 0x2,
585 kSlicedStringTag = 0x3 591 kSlicedStringTag = 0x3,
592 kThinStringTag = 0x5
586 }; 593 };
587 const uint32_t kIsIndirectStringMask = 0x1; 594 const uint32_t kIsIndirectStringMask = 0x1;
588 const uint32_t kIsIndirectStringTag = 0x1; 595 const uint32_t kIsIndirectStringTag = 0x1;
589 STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0); // NOLINT 596 STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0); // NOLINT
590 STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0); // NOLINT 597 STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0); // NOLINT
591 STATIC_ASSERT((kConsStringTag & 598 STATIC_ASSERT((kConsStringTag &
592 kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 599 kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT
593 STATIC_ASSERT((kSlicedStringTag & 600 STATIC_ASSERT((kSlicedStringTag &
594 kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 601 kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT
602 STATIC_ASSERT((kThinStringTag & kIsIndirectStringMask) == kIsIndirectStringTag);
595 603
596 // Use this mask to distinguish between cons and slice only after making 604 // If bit 7 is clear, then bit 4 indicates whether this two-byte
597 // sure that the string is one of the two (an indirect string).
598 const uint32_t kSlicedNotConsMask = kSlicedStringTag & ~kConsStringTag;
599 STATIC_ASSERT(IS_POWER_OF_TWO(kSlicedNotConsMask));
600
601 // If bit 7 is clear, then bit 3 indicates whether this two-byte
602 // string actually contains one byte data. 605 // string actually contains one byte data.
603 const uint32_t kOneByteDataHintMask = 0x08; 606 const uint32_t kOneByteDataHintMask = 0x10;
604 const uint32_t kOneByteDataHintTag = 0x08; 607 const uint32_t kOneByteDataHintTag = 0x10;
605 608
606 // If bit 7 is clear and string representation indicates an external string, 609 // If bit 7 is clear and string representation indicates an external string,
607 // then bit 4 indicates whether the data pointer is cached. 610 // then bit 5 indicates whether the data pointer is cached.
608 const uint32_t kShortExternalStringMask = 0x10; 611 const uint32_t kShortExternalStringMask = 0x20;
609 const uint32_t kShortExternalStringTag = 0x10; 612 const uint32_t kShortExternalStringTag = 0x20;
610 613
611 // A ConsString with an empty string as the right side is a candidate 614 // A ConsString with an empty string as the right side is a candidate
612 // for being shortcut by the garbage collector. We don't allocate any 615 // for being shortcut by the garbage collector. We don't allocate any
613 // non-flat internalized strings, so we do not shortcut them thereby 616 // non-flat internalized strings, so we do not shortcut them thereby
614 // avoiding turning internalized strings into strings. The bit-masks 617 // avoiding turning internalized strings into strings. The bit-masks
615 // below contain the internalized bit as additional safety. 618 // below contain the internalized bit as additional safety.
616 // See heap.cc, mark-compact.cc and objects-visiting.cc. 619 // See heap.cc, mark-compact.cc and objects-visiting.cc.
617 const uint32_t kShortcutTypeMask = 620 const uint32_t kShortcutTypeMask =
618 kIsNotStringMask | 621 kIsNotStringMask |
619 kIsNotInternalizedMask | 622 kIsNotInternalizedMask |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 666 EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE =
664 EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 667 EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
665 kNotInternalizedTag, 668 kNotInternalizedTag,
666 SHORT_EXTERNAL_STRING_TYPE = 669 SHORT_EXTERNAL_STRING_TYPE =
667 SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 670 SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
668 SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE = 671 SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE =
669 SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 672 SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag,
670 SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 673 SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE =
671 SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 674 SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE |
672 kNotInternalizedTag, 675 kNotInternalizedTag,
676 THIN_STRING_TYPE = kTwoByteStringTag | kThinStringTag | kNotInternalizedTag,
677 THIN_ONE_BYTE_STRING_TYPE =
678 kOneByteStringTag | kThinStringTag | kNotInternalizedTag,
673 679
674 // Non-string names 680 // Non-string names
675 SYMBOL_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE 681 SYMBOL_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE
676 682
677 // Other primitives (cannot contain non-map-word pointers to heap objects). 683 // Other primitives (cannot contain non-map-word pointers to heap objects).
678 HEAP_NUMBER_TYPE, 684 HEAP_NUMBER_TYPE,
679 SIMD128_VALUE_TYPE, 685 SIMD128_VALUE_TYPE,
680 ODDBALL_TYPE, // LAST_PRIMITIVE_TYPE 686 ODDBALL_TYPE, // LAST_PRIMITIVE_TYPE
681 687
682 // Objects allocated in their own spaces (never in new space). 688 // Objects allocated in their own spaces (never in new space).
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 V(String) \ 1017 V(String) \
1012 V(SeqString) \ 1018 V(SeqString) \
1013 V(ExternalString) \ 1019 V(ExternalString) \
1014 V(ConsString) \ 1020 V(ConsString) \
1015 V(SlicedString) \ 1021 V(SlicedString) \
1016 V(ExternalTwoByteString) \ 1022 V(ExternalTwoByteString) \
1017 V(ExternalOneByteString) \ 1023 V(ExternalOneByteString) \
1018 V(SeqTwoByteString) \ 1024 V(SeqTwoByteString) \
1019 V(SeqOneByteString) \ 1025 V(SeqOneByteString) \
1020 V(InternalizedString) \ 1026 V(InternalizedString) \
1027 V(ThinString) \
1021 V(Symbol) \ 1028 V(Symbol) \
1022 \ 1029 \
1023 V(FixedTypedArrayBase) \ 1030 V(FixedTypedArrayBase) \
1024 V(FixedUint8Array) \ 1031 V(FixedUint8Array) \
1025 V(FixedInt8Array) \ 1032 V(FixedInt8Array) \
1026 V(FixedUint16Array) \ 1033 V(FixedUint16Array) \
1027 V(FixedInt16Array) \ 1034 V(FixedInt16Array) \
1028 V(FixedUint32Array) \ 1035 V(FixedUint32Array) \
1029 V(FixedInt32Array) \ 1036 V(FixedInt32Array) \
1030 V(FixedFloat32Array) \ 1037 V(FixedFloat32Array) \
(...skipping 8180 matching lines...) Expand 10 before | Expand all | Expand 10 after
9211 // concrete performance benefit at that particular point in the code. 9218 // concrete performance benefit at that particular point in the code.
9212 class StringShape BASE_EMBEDDED { 9219 class StringShape BASE_EMBEDDED {
9213 public: 9220 public:
9214 inline explicit StringShape(const String* s); 9221 inline explicit StringShape(const String* s);
9215 inline explicit StringShape(Map* s); 9222 inline explicit StringShape(Map* s);
9216 inline explicit StringShape(InstanceType t); 9223 inline explicit StringShape(InstanceType t);
9217 inline bool IsSequential(); 9224 inline bool IsSequential();
9218 inline bool IsExternal(); 9225 inline bool IsExternal();
9219 inline bool IsCons(); 9226 inline bool IsCons();
9220 inline bool IsSliced(); 9227 inline bool IsSliced();
9228 inline bool IsThin();
9221 inline bool IsIndirect(); 9229 inline bool IsIndirect();
9222 inline bool IsExternalOneByte(); 9230 inline bool IsExternalOneByte();
9223 inline bool IsExternalTwoByte(); 9231 inline bool IsExternalTwoByte();
9224 inline bool IsSequentialOneByte(); 9232 inline bool IsSequentialOneByte();
9225 inline bool IsSequentialTwoByte(); 9233 inline bool IsSequentialTwoByte();
9226 inline bool IsInternalized(); 9234 inline bool IsInternalized();
9227 inline StringRepresentationTag representation_tag(); 9235 inline StringRepresentationTag representation_tag();
9228 inline uint32_t encoding_tag(); 9236 inline uint32_t encoding_tag();
9229 inline uint32_t full_representation_tag(); 9237 inline uint32_t full_representation_tag();
9230 inline uint32_t size_tag(); 9238 inline uint32_t size_tag();
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
9923 9931
9924 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> 9932 typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize>
9925 BodyDescriptor; 9933 BodyDescriptor;
9926 9934
9927 DECLARE_VERIFIER(ConsString) 9935 DECLARE_VERIFIER(ConsString)
9928 9936
9929 private: 9937 private:
9930 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); 9938 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString);
9931 }; 9939 };
9932 9940
9941 // The ThinString class describes string objects that are just references
9942 // to another string object. They are used for in-place internalization when
9943 // the original string cannot actually be internalized in-place: in these
9944 // cases, the original string is converted to a ThinString pointing at its
9945 // internalized version (which is allocated as a new object).
9946 // In terms of memory layout and most algorithms operating on strings,
9947 // ThinStrings can be thought of as "one-part cons strings".
9948 class ThinString : public String {
9949 public:
9950 // Actual string that this ThinString refers to.
9951 inline String* actual() const;
9952 inline void set_actual(String* s,
9953 WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
9954
9955 V8_EXPORT_PRIVATE uint16_t ThinStringGet(int index);
9956
9957 DECLARE_CAST(ThinString)
9958 DECLARE_VERIFIER(ThinString)
9959
9960 // Layout description.
9961 static const int kActualOffset = String::kSize;
9962 static const int kSize = kActualOffset + kPointerSize;
9963
9964 typedef FixedBodyDescriptor<kActualOffset, kSize, kSize> BodyDescriptor;
9965
9966 private:
9967 DISALLOW_COPY_AND_ASSIGN(ThinString);
9968 };
9933 9969
9934 // The Sliced String class describes strings that are substrings of another 9970 // The Sliced String class describes strings that are substrings of another
9935 // sequential string. The motivation is to save time and memory when creating 9971 // sequential string. The motivation is to save time and memory when creating
9936 // a substring. A Sliced String is described as a pointer to the parent, 9972 // a substring. A Sliced String is described as a pointer to the parent,
9937 // the offset from the start of the parent string and the length. Using 9973 // the offset from the start of the parent string and the length. Using
9938 // a Sliced String therefore requires unpacking of the parent string and 9974 // a Sliced String therefore requires unpacking of the parent string and
9939 // adding the offset to the start address. A substring of a Sliced String 9975 // adding the offset to the start address. A substring of a Sliced String
9940 // are not nested since the double indirection is simplified when creating 9976 // are not nested since the double indirection is simplified when creating
9941 // such a substring. 9977 // such a substring.
9942 // Currently missing features are: 9978 // Currently missing features are:
(...skipping 1708 matching lines...) Expand 10 before | Expand all | Expand 10 after
11651 } 11687 }
11652 }; 11688 };
11653 11689
11654 11690
11655 } // NOLINT, false-positive due to second-order macros. 11691 } // NOLINT, false-positive due to second-order macros.
11656 } // NOLINT, false-positive due to second-order macros. 11692 } // NOLINT, false-positive due to second-order macros.
11657 11693
11658 #include "src/objects/object-macros-undef.h" 11694 #include "src/objects/object-macros-undef.h"
11659 11695
11660 #endif // V8_OBJECTS_H_ 11696 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/mips64/codegen-mips64.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698