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

Side by Side Diff: src/objects.h

Issue 8011: Use direct copy and templates to speed up flattening of strings. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 2 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 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 2947 matching lines...) Expand 10 before | Expand all | Expand 10 after
2958 2958
2959 // Specialization of this function from Object that skips the 2959 // Specialization of this function from Object that skips the
2960 // string check. 2960 // string check.
2961 inline bool IsSeqAsciiString(); 2961 inline bool IsSeqAsciiString();
2962 2962
2963 // Fast testing routines that assume the receiver is a string and 2963 // Fast testing routines that assume the receiver is a string and
2964 // just check whether it is a certain kind of string. 2964 // just check whether it is a certain kind of string.
2965 inline bool StringIsSlicedString(); 2965 inline bool StringIsSlicedString();
2966 inline bool StringIsConsString(); 2966 inline bool StringIsConsString();
2967 2967
2968 Vector<const char> ToAsciiVector(); 2968 Vector<const byte> ToAsciiVector();
2969 Vector<const uc16> ToUC16Vector(); 2969 Vector<const uc16> ToUC16Vector();
2970 2970
2971 // Mark the string as an undetectable object. It only applies to 2971 // Mark the string as an undetectable object. It only applies to
2972 // ascii and two byte string types. 2972 // ascii and two byte string types.
2973 bool MarkAsUndetectable(); 2973 bool MarkAsUndetectable();
2974 2974
2975 // Slice the string and return a substring. 2975 // Slice the string and return a substring.
2976 Object* Slice(int from, int to); 2976 Object* Slice(int from, int to);
2977 2977
2978 // String equality operations. 2978 // String equality operations.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3036 // True if the string is a symbol. 3036 // True if the string is a symbol.
3037 inline bool is_symbol(); 3037 inline bool is_symbol();
3038 static inline bool is_symbol_map(Map* map); 3038 static inline bool is_symbol_map(Map* map);
3039 3039
3040 // True if the string is ASCII. 3040 // True if the string is ASCII.
3041 inline bool is_ascii_representation(); 3041 inline bool is_ascii_representation();
3042 static inline bool is_ascii_representation_map(Map* map); 3042 static inline bool is_ascii_representation_map(Map* map);
3043 3043
3044 // Get the representation tag. 3044 // Get the representation tag.
3045 inline StringRepresentationTag representation_tag(); 3045 inline StringRepresentationTag representation_tag();
3046 // Get the representation and ASCII tag.
3047 inline int full_representation_tag();
3046 static inline StringRepresentationTag map_representation_tag(Map* map); 3048 static inline StringRepresentationTag map_representation_tag(Map* map);
3047 3049
3048 // For use during stack traces. Performs rudimentary sanity check. 3050 // For use during stack traces. Performs rudimentary sanity check.
3049 bool LooksValid(); 3051 bool LooksValid();
3050 3052
3051 // Dispatched behavior. 3053 // Dispatched behavior.
3052 void StringShortPrint(StringStream* accumulator); 3054 void StringShortPrint(StringStream* accumulator);
3053 #ifdef DEBUG 3055 #ifdef DEBUG
3054 void StringPrint(); 3056 void StringPrint();
3055 void StringVerify(); 3057 void StringVerify();
3056 #endif 3058 #endif
3057 inline bool IsFlat(); 3059 inline bool IsFlat();
3058 3060
3059 // Layout description. 3061 // Layout description.
3060 static const int kLengthOffset = HeapObject::kHeaderSize; 3062 static const int kLengthOffset = HeapObject::kHeaderSize;
3061 static const int kSize = kLengthOffset + kIntSize; 3063 static const int kSize = kLengthOffset + kIntSize;
3062 3064
3063 // Limits on sizes of different types of strings. 3065 // Limits on sizes of different types of strings.
3064 static const int kMaxShortStringSize = 255; 3066 static const int kMaxShortStringSize = 255;
3065 static const int kMaxMediumStringSize = 65535; 3067 static const int kMaxMediumStringSize = 65535;
3066 3068
3067 static const int kMaxArrayIndexSize = 10; 3069 static const int kMaxArrayIndexSize = 10;
3068 3070
3069 // Max ascii char code. 3071 // Max ascii char code.
3070 static const int kMaxAsciiCharCode = 127; 3072 static const int kMaxAsciiCharCode = 127;
3071 3073
3074 // Minimum lenth for a cons or sliced string.
3075 static const int kMinNonFlatLength = 13;
3076
3072 // Mask constant for checking if a string has a computed hash code 3077 // Mask constant for checking if a string has a computed hash code
3073 // and if it is an array index. The least significant bit indicates 3078 // and if it is an array index. The least significant bit indicates
3074 // whether a hash code has been computed. If the hash code has been 3079 // whether a hash code has been computed. If the hash code has been
3075 // computed the 2nd bit tells whether the string can be used as an 3080 // computed the 2nd bit tells whether the string can be used as an
3076 // array index. 3081 // array index.
3077 static const int kHashComputedMask = 1; 3082 static const int kHashComputedMask = 1;
3078 static const int kIsArrayIndexMask = 1 << 1; 3083 static const int kIsArrayIndexMask = 1 << 1;
3079 static const int kNofLengthBitFields = 2; 3084 static const int kNofLengthBitFields = 2;
3080 3085
3081 // Shift constants for retriving length and hash code from 3086 // Shift constants for retriving length and hash code from
(...skipping 17 matching lines...) Expand all
3099 unsigned capacity, 3104 unsigned capacity,
3100 unsigned* remaining, 3105 unsigned* remaining,
3101 unsigned* offset); 3106 unsigned* offset);
3102 static const unibrow::byte* ReadBlock(String** input, 3107 static const unibrow::byte* ReadBlock(String** input,
3103 unibrow::byte* util_buffer, 3108 unibrow::byte* util_buffer,
3104 unsigned capacity, 3109 unsigned capacity,
3105 unsigned* remaining, 3110 unsigned* remaining,
3106 unsigned* offset); 3111 unsigned* offset);
3107 3112
3108 // Helper function for flattening strings. 3113 // Helper function for flattening strings.
3109 static void Flatten(String* source, 3114 template <typename sinkchar>
3110 String* sink, 3115 static void WriteToFlat(String* source,
3111 int from, 3116 sinkchar* sink,
3112 int to, 3117 int from,
3113 int sink_offset); 3118 int to);
3114 3119
3115 protected: 3120 protected:
3116 class ReadBlockBuffer { 3121 class ReadBlockBuffer {
3117 public: 3122 public:
3118 ReadBlockBuffer(unibrow::byte* util_buffer_, 3123 ReadBlockBuffer(unibrow::byte* util_buffer_,
3119 unsigned cursor_, 3124 unsigned cursor_,
3120 unsigned capacity_, 3125 unsigned capacity_,
3121 unsigned remaining_) : 3126 unsigned remaining_) :
3122 util_buffer(util_buffer_), 3127 util_buffer(util_buffer_),
3123 cursor(cursor_), 3128 cursor(cursor_),
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
3294 3299
3295 // Support for StringInputBuffer. 3300 // Support for StringInputBuffer.
3296 inline const unibrow::byte* ConsStringReadBlock(ReadBlockBuffer* buffer, 3301 inline const unibrow::byte* ConsStringReadBlock(ReadBlockBuffer* buffer,
3297 unsigned* offset_ptr, 3302 unsigned* offset_ptr,
3298 unsigned chars); 3303 unsigned chars);
3299 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, 3304 inline void ConsStringReadBlockIntoBuffer(ReadBlockBuffer* buffer,
3300 unsigned* offset_ptr, 3305 unsigned* offset_ptr,
3301 unsigned chars); 3306 unsigned chars);
3302 3307
3303 3308
3304 // Minimum lenth for a cons string.
3305 static const int kMinLength = 13;
3306 3309
3307 private: 3310 private:
3308 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); 3311 DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString);
3309 }; 3312 };
3310 3313
3311 3314
3312 // The SlicedString class describes string values that are slices of 3315 // The SlicedString class describes string values that are slices of
3313 // some other string. SlicedStrings consist of a reference to an 3316 // some other string. SlicedStrings consist of a reference to an
3314 // underlying heap-allocated string value, a start index, and the 3317 // underlying heap-allocated string value, a start index, and the
3315 // length field common to all strings. 3318 // length field common to all strings.
(...skipping 25 matching lines...) Expand all
3341 static const int kSize = kStartOffset + kIntSize; 3344 static const int kSize = kStartOffset + kIntSize;
3342 3345
3343 // Support for StringInputBuffer. 3346 // Support for StringInputBuffer.
3344 inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer, 3347 inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer,
3345 unsigned* offset_ptr, 3348 unsigned* offset_ptr,
3346 unsigned chars); 3349 unsigned chars);
3347 inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer, 3350 inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer,
3348 unsigned* offset_ptr, 3351 unsigned* offset_ptr,
3349 unsigned chars); 3352 unsigned chars);
3350 3353
3351 // Minimum lenth for a sliced string.
3352 static const int kMinLength = 13;
3353
3354 private: 3354 private:
3355 DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString); 3355 DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString);
3356 }; 3356 };
3357 3357
3358 3358
3359 // The ExternalString class describes string values that are backed by 3359 // The ExternalString class describes string values that are backed by
3360 // a string resource that lies outside the V8 heap. ExternalStrings 3360 // a string resource that lies outside the V8 heap. ExternalStrings
3361 // consist of the length field common to all strings, a pointer to the 3361 // consist of the length field common to all strings, a pointer to the
3362 // external resource. It is important to ensure (externally) that the 3362 // external resource. It is important to ensure (externally) that the
3363 // resource is not deallocated while the ExternalString is live in the 3363 // resource is not deallocated while the ExternalString is live in the
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
4020 } else { 4020 } else {
4021 value &= ~(1 << bit_position); 4021 value &= ~(1 << bit_position);
4022 } 4022 }
4023 return value; 4023 return value;
4024 } 4024 }
4025 }; 4025 };
4026 4026
4027 } } // namespace v8::internal 4027 } } // namespace v8::internal
4028 4028
4029 #endif // V8_OBJECTS_H_ 4029 #endif // V8_OBJECTS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698