Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 // - HeapObject (superclass for everything allocated in the heap) | 43 // - HeapObject (superclass for everything allocated in the heap) |
| 44 // - JSObject | 44 // - JSObject |
| 45 // - JSArray | 45 // - JSArray |
| 46 // - JSRegExp | 46 // - JSRegExp |
| 47 // - JSFunction | 47 // - JSFunction |
| 48 // - GlobalObject | 48 // - GlobalObject |
| 49 // - JSGlobalObject | 49 // - JSGlobalObject |
| 50 // - JSBuiltinsObject | 50 // - JSBuiltinsObject |
| 51 // - JSGlobalProxy | 51 // - JSGlobalProxy |
| 52 // - JSValue | 52 // - JSValue |
| 53 // - Script | |
| 54 // - Array | 53 // - Array |
| 55 // - ByteArray | 54 // - ByteArray |
| 56 // - FixedArray | 55 // - FixedArray |
| 57 // - DescriptorArray | 56 // - DescriptorArray |
| 58 // - HashTable | 57 // - HashTable |
| 59 // - Dictionary | 58 // - Dictionary |
| 60 // - SymbolTable | 59 // - SymbolTable |
| 61 // - CompilationCacheTable | 60 // - CompilationCacheTable |
| 62 // - MapCache | 61 // - MapCache |
| 63 // - LookupCache | 62 // - LookupCache |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 76 // - Code | 75 // - Code |
| 77 // - Map | 76 // - Map |
| 78 // - Oddball | 77 // - Oddball |
| 79 // - Proxy | 78 // - Proxy |
| 80 // - SharedFunctionInfo | 79 // - SharedFunctionInfo |
| 81 // - Struct | 80 // - Struct |
| 82 // - AccessorInfo | 81 // - AccessorInfo |
| 83 // - AccessCheckInfo | 82 // - AccessCheckInfo |
| 84 // - InterceptorInfo | 83 // - InterceptorInfo |
| 85 // - CallHandlerInfo | 84 // - CallHandlerInfo |
| 86 // - FunctionTemplateInfo | 85 // - TemplateInfo |
| 87 // - ObjectTemplateInfo | 86 // - FunctionTemplateInfo |
| 87 // - ObjectTemplateInfo | |
| 88 // - Script | |
| 88 // - SignatureInfo | 89 // - SignatureInfo |
| 89 // - TypeSwitchInfo | 90 // - TypeSwitchInfo |
| 90 // - DebugInfo | 91 // - DebugInfo |
| 91 // - BreakPointInfo | 92 // - BreakPointInfo |
| 92 // | 93 // |
| 93 // Formats of Object*: | 94 // Formats of Object*: |
| 94 // Smi: [31 bit signed int] 0 | 95 // Smi: [31 bit signed int] 0 |
| 95 // HeapObject: [32 bit direct pointer] (4 byte aligned) | 01 | 96 // HeapObject: [32 bit direct pointer] (4 byte aligned) | 01 |
| 96 // Failure: [30 bit signed int] 11 | 97 // Failure: [30 bit signed int] 11 |
| 97 | 98 |
| (...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 764 | 765 |
| 765 // Layout description. | 766 // Layout description. |
| 766 static const int kHeaderSize = 0; // Object does not take up any space. | 767 static const int kHeaderSize = 0; // Object does not take up any space. |
| 767 | 768 |
| 768 private: | 769 private: |
| 769 DISALLOW_IMPLICIT_CONSTRUCTORS(Object); | 770 DISALLOW_IMPLICIT_CONSTRUCTORS(Object); |
| 770 }; | 771 }; |
| 771 | 772 |
| 772 | 773 |
| 773 // Smi represents integer Numbers that can be stored in 31 bits. | 774 // Smi represents integer Numbers that can be stored in 31 bits. |
| 775 // TODO(X64) Increase to 53 bits? | |
| 774 // Smis are immediate which means they are NOT allocated in the heap. | 776 // Smis are immediate which means they are NOT allocated in the heap. |
| 775 // The this pointer has the following format: [31 bit signed int] 0 | 777 // The this pointer has the following format: [31 bit signed int] 0 |
| 778 // TODO(X64): 31 bits signed int sign-extended to 63 bits. | |
| 776 // Smi stands for small integer. | 779 // Smi stands for small integer. |
| 777 class Smi: public Object { | 780 class Smi: public Object { |
| 778 public: | 781 public: |
| 779 // Returns the integer value. | 782 // Returns the integer value. |
| 780 inline int value(); | 783 inline int value(); |
| 781 | 784 |
| 782 // Convert a value to a Smi object. | 785 // Convert a value to a Smi object. |
| 783 static inline Smi* FromInt(int value); | 786 static inline Smi* FromInt(int value); |
| 784 | 787 |
| 785 static inline Smi* FromIntptr(intptr_t value); | 788 static inline Smi* FromIntptr(intptr_t value); |
| (...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1589 | 1592 |
| 1590 // Copy a sub array from the receiver to dest. | 1593 // Copy a sub array from the receiver to dest. |
| 1591 void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); | 1594 void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); |
| 1592 | 1595 |
| 1593 // Garbage collection support. | 1596 // Garbage collection support. |
| 1594 static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } | 1597 static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } |
| 1595 | 1598 |
| 1596 // Casting. | 1599 // Casting. |
| 1597 static inline FixedArray* cast(Object* obj); | 1600 static inline FixedArray* cast(Object* obj); |
| 1598 | 1601 |
| 1602 // Align data at kPointerSize, even if Array.kHeaderSize isn't aligned. | |
| 1603 static const int kHeaderSize = OBJECT_SIZE_ALIGN(Array::kHeaderSize); | |
| 1604 | |
| 1599 // Dispatched behavior. | 1605 // Dispatched behavior. |
| 1600 int FixedArraySize() { return SizeFor(length()); } | 1606 int FixedArraySize() { return SizeFor(length()); } |
| 1601 void FixedArrayIterateBody(ObjectVisitor* v); | 1607 void FixedArrayIterateBody(ObjectVisitor* v); |
| 1602 #ifdef DEBUG | 1608 #ifdef DEBUG |
| 1603 void FixedArrayPrint(); | 1609 void FixedArrayPrint(); |
| 1604 void FixedArrayVerify(); | 1610 void FixedArrayVerify(); |
| 1605 // Checks if two FixedArrays have identical contents. | 1611 // Checks if two FixedArrays have identical contents. |
| 1606 bool IsEqualTo(FixedArray* other); | 1612 bool IsEqualTo(FixedArray* other); |
| 1607 #endif | 1613 #endif |
| 1608 | 1614 |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2140 class ByteArray: public Array { | 2146 class ByteArray: public Array { |
| 2141 public: | 2147 public: |
| 2142 // Setter and getter. | 2148 // Setter and getter. |
| 2143 inline byte get(int index); | 2149 inline byte get(int index); |
| 2144 inline void set(int index, byte value); | 2150 inline void set(int index, byte value); |
| 2145 | 2151 |
| 2146 // Treat contents as an int array. | 2152 // Treat contents as an int array. |
| 2147 inline int get_int(int index); | 2153 inline int get_int(int index); |
| 2148 | 2154 |
| 2149 static int SizeFor(int length) { | 2155 static int SizeFor(int length) { |
| 2150 return kHeaderSize + OBJECT_SIZE_ALIGN(length); | 2156 return OBJECT_SIZE_ALIGN(kHeaderSize + length); |
| 2151 } | 2157 } |
| 2152 // We use byte arrays for free blocks in the heap. Given a desired size in | 2158 // We use byte arrays for free blocks in the heap. Given a desired size in |
| 2153 // bytes that is a multiple of the word size and big enough to hold a byte | 2159 // bytes that is a multiple of the word size and big enough to hold a byte |
| 2154 // array, this function returns the number of elements a byte array should | 2160 // array, this function returns the number of elements a byte array should |
| 2155 // have. | 2161 // have. |
| 2156 static int LengthFor(int size_in_bytes) { | 2162 static int LengthFor(int size_in_bytes) { |
| 2157 ASSERT(IsAligned(size_in_bytes, kPointerSize)); | 2163 ASSERT(IsAligned(size_in_bytes, kPointerSize)); |
| 2158 ASSERT(size_in_bytes >= kHeaderSize); | 2164 ASSERT(size_in_bytes >= kHeaderSize); |
| 2159 return size_in_bytes - kHeaderSize; | 2165 return size_in_bytes - kHeaderSize; |
| 2160 } | 2166 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2337 // Casting. | 2343 // Casting. |
| 2338 static inline Code* cast(Object* obj); | 2344 static inline Code* cast(Object* obj); |
| 2339 | 2345 |
| 2340 // Dispatched behavior. | 2346 // Dispatched behavior. |
| 2341 int CodeSize() { return SizeFor(body_size(), sinfo_size()); } | 2347 int CodeSize() { return SizeFor(body_size(), sinfo_size()); } |
| 2342 void CodeIterateBody(ObjectVisitor* v); | 2348 void CodeIterateBody(ObjectVisitor* v); |
| 2343 #ifdef DEBUG | 2349 #ifdef DEBUG |
| 2344 void CodePrint(); | 2350 void CodePrint(); |
| 2345 void CodeVerify(); | 2351 void CodeVerify(); |
| 2346 #endif | 2352 #endif |
| 2353 // Code entry points are aligned to 32 bytes. | |
| 2354 static const int kCodeAlignment = 32; | |
| 2355 static const int kCodeAlignmentMask = kCodeAlignment - 1; | |
| 2347 | 2356 |
| 2348 // Layout description. | 2357 // Layout description. |
| 2349 static const int kInstructionSizeOffset = HeapObject::kHeaderSize; | 2358 static const int kInstructionSizeOffset = HeapObject::kHeaderSize; |
| 2350 static const int kRelocationSizeOffset = kInstructionSizeOffset + kIntSize; | 2359 static const int kRelocationSizeOffset = kInstructionSizeOffset + kIntSize; |
| 2351 static const int kSInfoSizeOffset = kRelocationSizeOffset + kIntSize; | 2360 static const int kSInfoSizeOffset = kRelocationSizeOffset + kIntSize; |
| 2352 static const int kFlagsOffset = kSInfoSizeOffset + kIntSize; | 2361 static const int kFlagsOffset = kSInfoSizeOffset + kIntSize; |
| 2353 static const int kKindSpecificFlagsOffset = kFlagsOffset + kIntSize; | 2362 static const int kKindSpecificFlagsOffset = kFlagsOffset + kIntSize; |
| 2354 // Add filler objects to align the instruction start following right after | 2363 // Add padding to align the instruction start following right after |
| 2355 // the Code object header. | 2364 // the Code object header. |
| 2356 static const int kFiller6Offset = kKindSpecificFlagsOffset + kIntSize; | 2365 static const int kHeaderSize = |
| 2357 static const int kFiller7Offset = kFiller6Offset + kIntSize; | 2366 (kKindSpecificFlagsOffset + kIntSize + kCodeAlignmentMask) & |
| 2358 static const int kHeaderSize = kFiller7Offset + kIntSize; | 2367 ~kCodeAlignmentMask; |
| 2359 | |
| 2360 // Code entry points are aligned to 32 bytes. | |
| 2361 static const int kCodeAlignment = 32; | |
| 2362 | 2368 |
| 2363 // Byte offsets within kKindSpecificFlagsOffset. | 2369 // Byte offsets within kKindSpecificFlagsOffset. |
| 2364 static const int kICFlagOffset = kKindSpecificFlagsOffset + 0; | 2370 static const int kICFlagOffset = kKindSpecificFlagsOffset + 0; |
| 2365 static const int kStubMajorKeyOffset = kKindSpecificFlagsOffset + 1; | 2371 static const int kStubMajorKeyOffset = kKindSpecificFlagsOffset + 1; |
| 2366 | 2372 |
| 2367 // Flags layout. | 2373 // Flags layout. |
| 2368 static const int kFlagsICStateShift = 0; | 2374 static const int kFlagsICStateShift = 0; |
| 2369 static const int kFlagsKindShift = 3; | 2375 static const int kFlagsKindShift = 3; |
| 2370 static const int kFlagsTypeShift = 6; | 2376 static const int kFlagsTypeShift = 6; |
| 2371 static const int kFlagsArgumentsCountShift = 9; | 2377 static const int kFlagsArgumentsCountShift = 9; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2560 #endif | 2566 #endif |
| 2561 | 2567 |
| 2562 // Layout description. | 2568 // Layout description. |
| 2563 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; | 2569 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; |
| 2564 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; | 2570 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; |
| 2565 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; | 2571 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; |
| 2566 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; | 2572 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; |
| 2567 static const int kInstanceDescriptorsOffset = | 2573 static const int kInstanceDescriptorsOffset = |
| 2568 kConstructorOffset + kPointerSize; | 2574 kConstructorOffset + kPointerSize; |
| 2569 static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize; | 2575 static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize; |
| 2570 static const int kSize = kCodeCacheOffset + kIntSize; | 2576 static const int kSize = kCodeCacheOffset + kPointerSize; |
| 2571 | 2577 |
| 2572 // Byte offsets within kInstanceSizesOffset. | 2578 // Byte offsets within kInstanceSizesOffset. |
| 2573 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; | 2579 static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; |
| 2574 static const int kInObjectPropertiesOffset = kInstanceSizesOffset + 1; | 2580 static const int kInObjectPropertiesOffset = kInstanceSizesOffset + 1; |
| 2575 // The bytes at positions 2 and 3 are not in use at the moment. | 2581 // The bytes at positions 2 and 3 are not in use at the moment. |
| 2576 | 2582 |
| 2577 // Byte offsets within kInstanceAttributesOffset attributes. | 2583 // Byte offsets within kInstanceAttributesOffset attributes. |
| 2578 static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0; | 2584 static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0; |
| 2579 static const int kUnusedPropertyFieldsOffset = kInstanceAttributesOffset + 1; | 2585 static const int kUnusedPropertyFieldsOffset = kInstanceAttributesOffset + 1; |
| 2580 static const int kBitFieldOffset = kInstanceAttributesOffset + 2; | 2586 static const int kBitFieldOffset = kInstanceAttributesOffset + 2; |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2775 // Constants. | 2781 // Constants. |
| 2776 static const int kDontAdaptArgumentsSentinel = -1; | 2782 static const int kDontAdaptArgumentsSentinel = -1; |
| 2777 | 2783 |
| 2778 // Layout description. | 2784 // Layout description. |
| 2779 static const int kNameOffset = HeapObject::kHeaderSize; | 2785 static const int kNameOffset = HeapObject::kHeaderSize; |
| 2780 static const int kCodeOffset = kNameOffset + kPointerSize; | 2786 static const int kCodeOffset = kNameOffset + kPointerSize; |
| 2781 static const int kLengthOffset = kCodeOffset + kPointerSize; | 2787 static const int kLengthOffset = kCodeOffset + kPointerSize; |
| 2782 static const int kFormalParameterCountOffset = kLengthOffset + kIntSize; | 2788 static const int kFormalParameterCountOffset = kLengthOffset + kIntSize; |
| 2783 static const int kExpectedNofPropertiesOffset = | 2789 static const int kExpectedNofPropertiesOffset = |
| 2784 kFormalParameterCountOffset + kIntSize; | 2790 kFormalParameterCountOffset + kIntSize; |
| 2791 static const int kStartPositionAndTypeOffset = | |
| 2792 kExpectedNofPropertiesOffset + kIntSize; | |
| 2793 static const int kEndPositionOffset = kStartPositionAndTypeOffset + kIntSize; | |
| 2794 static const int kFunctionTokenPositionOffset = kEndPositionOffset + kIntSize; | |
| 2785 static const int kInstanceClassNameOffset = | 2795 static const int kInstanceClassNameOffset = |
|
William Hesse
2009/05/18 11:41:30
Are you depending on the fact that you have an eve
Lasse Reichstein
2009/05/18 12:08:23
I am relying on that, but I think documentation sh
| |
| 2786 kExpectedNofPropertiesOffset + kIntSize; | 2796 kFunctionTokenPositionOffset + kIntSize; |
| 2787 static const int kExternalReferenceDataOffset = | 2797 static const int kExternalReferenceDataOffset = |
| 2788 kInstanceClassNameOffset + kPointerSize; | 2798 kInstanceClassNameOffset + kPointerSize; |
| 2789 static const int kScriptOffset = kExternalReferenceDataOffset + kPointerSize; | 2799 static const int kScriptOffset = kExternalReferenceDataOffset + kPointerSize; |
| 2790 static const int kStartPositionAndTypeOffset = kScriptOffset + kPointerSize; | 2800 static const int kDebugInfoOffset = kScriptOffset + kPointerSize; |
| 2791 static const int kEndPositionOffset = kStartPositionAndTypeOffset + kIntSize; | |
| 2792 static const int kFunctionTokenPositionOffset = kEndPositionOffset + kIntSize; | |
| 2793 static const int kDebugInfoOffset = kFunctionTokenPositionOffset + kIntSize; | |
| 2794 static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize; | 2801 static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize; |
| 2795 static const int kSize = kInferredNameOffset + kPointerSize; | 2802 static const int kSize = kInferredNameOffset + kPointerSize; |
| 2796 | 2803 |
| 2797 private: | 2804 private: |
| 2798 // Bit positions in length_and_flg. | 2805 // Bit positions in length_and_flg. |
| 2799 // The least significant bit is used as the flag. | 2806 // The least significant bit is used as the flag. |
| 2800 static const int kFlagBit = 0; | 2807 static const int kFlagBit = 0; |
| 2801 static const int kLengthShift = 1; | 2808 static const int kLengthShift = 1; |
| 2802 static const int kLengthMask = ~((1 << kLengthShift) - 1); | 2809 static const int kLengthMask = ~((1 << kLengthShift) - 1); |
| 2803 | 2810 |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3093 inline void SetDataAt(int index, Object* value); | 3100 inline void SetDataAt(int index, Object* value); |
| 3094 | 3101 |
| 3095 static inline JSRegExp* cast(Object* obj); | 3102 static inline JSRegExp* cast(Object* obj); |
| 3096 | 3103 |
| 3097 // Dispatched behavior. | 3104 // Dispatched behavior. |
| 3098 #ifdef DEBUG | 3105 #ifdef DEBUG |
| 3099 void JSRegExpVerify(); | 3106 void JSRegExpVerify(); |
| 3100 #endif | 3107 #endif |
| 3101 | 3108 |
| 3102 static const int kDataOffset = JSObject::kHeaderSize; | 3109 static const int kDataOffset = JSObject::kHeaderSize; |
| 3103 static const int kSize = kDataOffset + kIntSize; | 3110 static const int kSize = kDataOffset + kPointerSize; |
| 3104 | 3111 |
| 3105 // Indices in the data array. | 3112 // Indices in the data array. |
| 3106 static const int kTagIndex = 0; | 3113 static const int kTagIndex = 0; |
| 3107 static const int kSourceIndex = kTagIndex + 1; | 3114 static const int kSourceIndex = kTagIndex + 1; |
| 3108 static const int kFlagsIndex = kSourceIndex + 1; | 3115 static const int kFlagsIndex = kSourceIndex + 1; |
| 3109 static const int kDataIndex = kFlagsIndex + 1; | 3116 static const int kDataIndex = kFlagsIndex + 1; |
| 3110 // The data fields are used in different ways depending on the | 3117 // The data fields are used in different ways depending on the |
| 3111 // value of the tag. | 3118 // value of the tag. |
| 3112 // Atom regexps (literal strings). | 3119 // Atom regexps (literal strings). |
| 3113 static const int kAtomPatternIndex = kDataIndex; | 3120 static const int kAtomPatternIndex = kDataIndex; |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3506 // Casting | 3513 // Casting |
| 3507 static inline SeqAsciiString* cast(Object* obj); | 3514 static inline SeqAsciiString* cast(Object* obj); |
| 3508 | 3515 |
| 3509 // Garbage collection support. This method is called by the | 3516 // Garbage collection support. This method is called by the |
| 3510 // garbage collector to compute the actual size of an AsciiString | 3517 // garbage collector to compute the actual size of an AsciiString |
| 3511 // instance. | 3518 // instance. |
| 3512 inline int SeqAsciiStringSize(InstanceType instance_type); | 3519 inline int SeqAsciiStringSize(InstanceType instance_type); |
| 3513 | 3520 |
| 3514 // Computes the size for an AsciiString instance of a given length. | 3521 // Computes the size for an AsciiString instance of a given length. |
| 3515 static int SizeFor(int length) { | 3522 static int SizeFor(int length) { |
| 3516 return kHeaderSize + OBJECT_SIZE_ALIGN(length * kCharSize); | 3523 return OBJECT_SIZE_ALIGN(kHeaderSize + length * kCharSize); |
| 3517 } | 3524 } |
| 3518 | 3525 |
| 3519 // Layout description. | 3526 // Layout description. |
| 3520 static const int kHeaderSize = String::kSize; | 3527 static const int kHeaderSize = String::kSize; |
| 3521 | 3528 |
| 3522 // Support for StringInputBuffer. | 3529 // Support for StringInputBuffer. |
| 3523 inline void SeqAsciiStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | 3530 inline void SeqAsciiStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, |
| 3524 unsigned* offset, | 3531 unsigned* offset, |
| 3525 unsigned chars); | 3532 unsigned chars); |
| 3526 inline const unibrow::byte* SeqAsciiStringReadBlock(unsigned* remaining, | 3533 inline const unibrow::byte* SeqAsciiStringReadBlock(unsigned* remaining, |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 3551 // Casting | 3558 // Casting |
| 3552 static inline SeqTwoByteString* cast(Object* obj); | 3559 static inline SeqTwoByteString* cast(Object* obj); |
| 3553 | 3560 |
| 3554 // Garbage collection support. This method is called by the | 3561 // Garbage collection support. This method is called by the |
| 3555 // garbage collector to compute the actual size of a TwoByteString | 3562 // garbage collector to compute the actual size of a TwoByteString |
| 3556 // instance. | 3563 // instance. |
| 3557 inline int SeqTwoByteStringSize(InstanceType instance_type); | 3564 inline int SeqTwoByteStringSize(InstanceType instance_type); |
| 3558 | 3565 |
| 3559 // Computes the size for a TwoByteString instance of a given length. | 3566 // Computes the size for a TwoByteString instance of a given length. |
| 3560 static int SizeFor(int length) { | 3567 static int SizeFor(int length) { |
| 3561 return kHeaderSize + OBJECT_SIZE_ALIGN(length * kShortSize); | 3568 return OBJECT_SIZE_ALIGN(kHeaderSize + length * kShortSize); |
| 3562 } | 3569 } |
| 3563 | 3570 |
| 3564 // Layout description. | 3571 // Layout description. |
| 3565 static const int kHeaderSize = String::kSize; | 3572 static const int kHeaderSize = String::kSize; |
| 3566 | 3573 |
| 3567 // Support for StringInputBuffer. | 3574 // Support for StringInputBuffer. |
| 3568 inline void SeqTwoByteStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | 3575 inline void SeqTwoByteStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, |
| 3569 unsigned* offset_ptr, | 3576 unsigned* offset_ptr, |
| 3570 unsigned chars); | 3577 unsigned chars); |
| 3571 | 3578 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3605 | 3612 |
| 3606 // Casting. | 3613 // Casting. |
| 3607 static inline ConsString* cast(Object* obj); | 3614 static inline ConsString* cast(Object* obj); |
| 3608 | 3615 |
| 3609 // Garbage collection support. This method is called during garbage | 3616 // Garbage collection support. This method is called during garbage |
| 3610 // collection to iterate through the heap pointers in the body of | 3617 // collection to iterate through the heap pointers in the body of |
| 3611 // the ConsString. | 3618 // the ConsString. |
| 3612 void ConsStringIterateBody(ObjectVisitor* v); | 3619 void ConsStringIterateBody(ObjectVisitor* v); |
| 3613 | 3620 |
| 3614 // Layout description. | 3621 // Layout description. |
| 3615 static const int kFirstOffset = String::kSize; | 3622 static const int kFirstOffset = OBJECT_SIZE_ALIGN(String::kSize); |
| 3616 static const int kSecondOffset = kFirstOffset + kPointerSize; | 3623 static const int kSecondOffset = kFirstOffset + kPointerSize; |
| 3617 static const int kSize = kSecondOffset + kPointerSize; | 3624 static const int kSize = kSecondOffset + kPointerSize; |
| 3618 | 3625 |
| 3619 // Support for StringInputBuffer. | 3626 // Support for StringInputBuffer. |
| 3620 inline const unibrow::byte* ConsStringReadBlock(ReadBlockBuffer* buffer, | 3627 inline const unibrow::byte* ConsStringReadBlock(ReadBlockBuffer* buffer, |
| 3621 unsigned* offset_ptr, | 3628 unsigned* offset_ptr, |
| 3622 unsigned chars); | 3629 unsigned chars); |
| 3623 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | 3630 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, |
| 3624 unsigned* offset_ptr, | 3631 unsigned* offset_ptr, |
| 3625 unsigned chars); | 3632 unsigned chars); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 3649 // Dispatched behavior. | 3656 // Dispatched behavior. |
| 3650 uint16_t SlicedStringGet(int index); | 3657 uint16_t SlicedStringGet(int index); |
| 3651 | 3658 |
| 3652 // Casting. | 3659 // Casting. |
| 3653 static inline SlicedString* cast(Object* obj); | 3660 static inline SlicedString* cast(Object* obj); |
| 3654 | 3661 |
| 3655 // Garbage collection support. | 3662 // Garbage collection support. |
| 3656 void SlicedStringIterateBody(ObjectVisitor* v); | 3663 void SlicedStringIterateBody(ObjectVisitor* v); |
| 3657 | 3664 |
| 3658 // Layout description | 3665 // Layout description |
| 3666 #if V8_HOST_ARCH_64_BIT | |
| 3667 // Optimizations expect buffer to be located at same offset as a ConsString's | |
| 3668 // first substring. In 64 bit mode we have room for the size before the | |
| 3669 // buffer. | |
|
Erik Corry
2009/05/18 11:52:11
Clever. I suggest the following comment:
Each cha
Lasse Reichstein
2009/05/18 12:08:23
Done.
| |
| 3670 static const int kStartOffset = String::kSize; | |
| 3671 static const int kBufferOffset = kStartOffset + kIntSize; | |
| 3672 static const int kSize = kBufferOffset + kPointerSize; | |
| 3673 #else | |
| 3659 static const int kBufferOffset = String::kSize; | 3674 static const int kBufferOffset = String::kSize; |
| 3660 static const int kStartOffset = kBufferOffset + kPointerSize; | 3675 static const int kStartOffset = kBufferOffset + kPointerSize; |
| 3661 static const int kSize = kStartOffset + kIntSize; | 3676 static const int kSize = kStartOffset + kIntSize; |
| 3677 #endif | |
| 3662 | 3678 |
| 3663 // Support for StringInputBuffer. | 3679 // Support for StringInputBuffer. |
| 3664 inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer, | 3680 inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer, |
| 3665 unsigned* offset_ptr, | 3681 unsigned* offset_ptr, |
| 3666 unsigned chars); | 3682 unsigned chars); |
| 3667 inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, | 3683 inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, |
| 3668 unsigned* offset_ptr, | 3684 unsigned* offset_ptr, |
| 3669 unsigned chars); | 3685 unsigned chars); |
| 3670 | 3686 |
| 3671 private: | 3687 private: |
| 3672 DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString); | 3688 DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString); |
| 3673 }; | 3689 }; |
| 3674 | 3690 |
| 3675 | 3691 |
| 3676 // The ExternalString class describes string values that are backed by | 3692 // The ExternalString class describes string values that are backed by |
| 3677 // a string resource that lies outside the V8 heap. ExternalStrings | 3693 // a string resource that lies outside the V8 heap. ExternalStrings |
| 3678 // consist of the length field common to all strings, a pointer to the | 3694 // consist of the length field common to all strings, a pointer to the |
| 3679 // external resource. It is important to ensure (externally) that the | 3695 // external resource. It is important to ensure (externally) that the |
| 3680 // resource is not deallocated while the ExternalString is live in the | 3696 // resource is not deallocated while the ExternalString is live in the |
| 3681 // V8 heap. | 3697 // V8 heap. |
| 3682 // | 3698 // |
| 3683 // The API expects that all ExternalStrings are created through the | 3699 // The API expects that all ExternalStrings are created through the |
| 3684 // API. Therefore, ExternalStrings should not be used internally. | 3700 // API. Therefore, ExternalStrings should not be used internally. |
| 3685 class ExternalString: public String { | 3701 class ExternalString: public String { |
| 3686 public: | 3702 public: |
| 3687 // Casting | 3703 // Casting |
| 3688 static inline ExternalString* cast(Object* obj); | 3704 static inline ExternalString* cast(Object* obj); |
| 3689 | 3705 |
| 3690 // Layout description. | 3706 // Layout description. |
| 3691 static const int kResourceOffset = String::kSize; | 3707 static const int kResourceOffset = OBJECT_SIZE_ALIGN(String::kSize); |
| 3692 static const int kSize = kResourceOffset + kPointerSize; | 3708 static const int kSize = kResourceOffset + kPointerSize; |
| 3693 | 3709 |
| 3694 private: | 3710 private: |
| 3695 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalString); | 3711 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalString); |
| 3696 }; | 3712 }; |
| 3697 | 3713 |
| 3698 | 3714 |
| 3699 // The ExternalAsciiString class is an external string backed by an | 3715 // The ExternalAsciiString class is an external string backed by an |
| 3700 // ASCII string. | 3716 // ASCII string. |
| 3701 class ExternalAsciiString: public ExternalString { | 3717 class ExternalAsciiString: public ExternalString { |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4141 static inline ObjectTemplateInfo* cast(Object* obj); | 4157 static inline ObjectTemplateInfo* cast(Object* obj); |
| 4142 | 4158 |
| 4143 #ifdef DEBUG | 4159 #ifdef DEBUG |
| 4144 void ObjectTemplateInfoPrint(); | 4160 void ObjectTemplateInfoPrint(); |
| 4145 void ObjectTemplateInfoVerify(); | 4161 void ObjectTemplateInfoVerify(); |
| 4146 #endif | 4162 #endif |
| 4147 | 4163 |
| 4148 static const int kConstructorOffset = TemplateInfo::kHeaderSize; | 4164 static const int kConstructorOffset = TemplateInfo::kHeaderSize; |
| 4149 static const int kInternalFieldCountOffset = | 4165 static const int kInternalFieldCountOffset = |
| 4150 kConstructorOffset + kPointerSize; | 4166 kConstructorOffset + kPointerSize; |
| 4151 static const int kSize = kInternalFieldCountOffset + kHeaderSize; | 4167 static const int kSize = kInternalFieldCountOffset + kPointerSize; |
|
Erik Corry
2009/05/18 11:52:11
Good catch.
| |
| 4152 }; | 4168 }; |
| 4153 | 4169 |
| 4154 | 4170 |
| 4155 class SignatureInfo: public Struct { | 4171 class SignatureInfo: public Struct { |
| 4156 public: | 4172 public: |
| 4157 DECL_ACCESSORS(receiver, Object) | 4173 DECL_ACCESSORS(receiver, Object) |
| 4158 DECL_ACCESSORS(args, Object) | 4174 DECL_ACCESSORS(args, Object) |
| 4159 | 4175 |
| 4160 static inline SignatureInfo* cast(Object* obj); | 4176 static inline SignatureInfo* cast(Object* obj); |
| 4161 | 4177 |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4372 } else { | 4388 } else { |
| 4373 value &= ~(1 << bit_position); | 4389 value &= ~(1 << bit_position); |
| 4374 } | 4390 } |
| 4375 return value; | 4391 return value; |
| 4376 } | 4392 } |
| 4377 }; | 4393 }; |
| 4378 | 4394 |
| 4379 } } // namespace v8::internal | 4395 } } // namespace v8::internal |
| 4380 | 4396 |
| 4381 #endif // V8_OBJECTS_H_ | 4397 #endif // V8_OBJECTS_H_ |
| OLD | NEW |