| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_URI_H_ | 5 #ifndef V8_URI_H_ |
| 6 #define V8_URI_H_ | 6 #define V8_URI_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
| 11 #include "src/string-search.h" | 11 #include "src/string-search.h" |
| 12 #include "src/utils.h" | 12 #include "src/utils.h" |
| 13 | 13 |
| 14 namespace v8 { | 14 namespace v8 { |
| 15 namespace internal { | 15 namespace internal { |
| 16 | 16 |
| 17 | 17 |
| 18 template <typename Char> | 18 template <typename Char> |
| 19 static INLINE(Vector<const Char> GetCharVector(Handle<String> string)); | 19 static INLINE(Vector<const Char> GetCharVector(Handle<String> string)); |
| 20 | 20 |
| 21 | 21 |
| 22 template <> | 22 template <> |
| 23 Vector<const uint8_t> GetCharVector(Handle<String> string) { | 23 Vector<const uint8_t> GetCharVector(Handle<String> string) { |
| 24 String::FlatContent flat = string->GetFlatContent(); | 24 String::FlatContent flat = string->GetFlatContent(); |
| 25 ASSERT(flat.IsAscii()); | 25 DCHECK(flat.IsAscii()); |
| 26 return flat.ToOneByteVector(); | 26 return flat.ToOneByteVector(); |
| 27 } | 27 } |
| 28 | 28 |
| 29 | 29 |
| 30 template <> | 30 template <> |
| 31 Vector<const uc16> GetCharVector(Handle<String> string) { | 31 Vector<const uc16> GetCharVector(Handle<String> string) { |
| 32 String::FlatContent flat = string->GetFlatContent(); | 32 String::FlatContent flat = string->GetFlatContent(); |
| 33 ASSERT(flat.IsTwoByte()); | 33 DCHECK(flat.IsTwoByte()); |
| 34 return flat.ToUC16Vector(); | 34 return flat.ToUC16Vector(); |
| 35 } | 35 } |
| 36 | 36 |
| 37 | 37 |
| 38 class URIUnescape : public AllStatic { | 38 class URIUnescape : public AllStatic { |
| 39 public: | 39 public: |
| 40 template<typename Char> | 40 template<typename Char> |
| 41 MUST_USE_RESULT static MaybeHandle<String> Unescape(Isolate* isolate, | 41 MUST_USE_RESULT static MaybeHandle<String> Unescape(Isolate* isolate, |
| 42 Handle<String> source); | 42 Handle<String> source); |
| 43 | 43 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 for (int i = start_index; i < length; unescaped_length++) { | 93 for (int i = start_index; i < length; unescaped_length++) { |
| 94 int step; | 94 int step; |
| 95 if (UnescapeChar(vector, i, length, &step) > | 95 if (UnescapeChar(vector, i, length, &step) > |
| 96 String::kMaxOneByteCharCode) { | 96 String::kMaxOneByteCharCode) { |
| 97 one_byte = false; | 97 one_byte = false; |
| 98 } | 98 } |
| 99 i += step; | 99 i += step; |
| 100 } | 100 } |
| 101 } | 101 } |
| 102 | 102 |
| 103 ASSERT(start_index < length); | 103 DCHECK(start_index < length); |
| 104 Handle<String> first_part = | 104 Handle<String> first_part = |
| 105 isolate->factory()->NewProperSubString(string, 0, start_index); | 105 isolate->factory()->NewProperSubString(string, 0, start_index); |
| 106 | 106 |
| 107 int dest_position = 0; | 107 int dest_position = 0; |
| 108 Handle<String> second_part; | 108 Handle<String> second_part; |
| 109 ASSERT(unescaped_length <= String::kMaxLength); | 109 DCHECK(unescaped_length <= String::kMaxLength); |
| 110 if (one_byte) { | 110 if (one_byte) { |
| 111 Handle<SeqOneByteString> dest = isolate->factory()->NewRawOneByteString( | 111 Handle<SeqOneByteString> dest = isolate->factory()->NewRawOneByteString( |
| 112 unescaped_length).ToHandleChecked(); | 112 unescaped_length).ToHandleChecked(); |
| 113 DisallowHeapAllocation no_allocation; | 113 DisallowHeapAllocation no_allocation; |
| 114 Vector<const Char> vector = GetCharVector<Char>(string); | 114 Vector<const Char> vector = GetCharVector<Char>(string); |
| 115 for (int i = start_index; i < length; dest_position++) { | 115 for (int i = start_index; i < length; dest_position++) { |
| 116 int step; | 116 int step; |
| 117 dest->SeqOneByteStringSet(dest_position, | 117 dest->SeqOneByteStringSet(dest_position, |
| 118 UnescapeChar(vector, i, length, &step)); | 118 UnescapeChar(vector, i, length, &step)); |
| 119 i += step; | 119 i += step; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 221 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 221 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 222 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 222 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 223 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 223 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 224 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | 224 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
| 225 | 225 |
| 226 | 226 |
| 227 template<typename Char> | 227 template<typename Char> |
| 228 MaybeHandle<String> URIEscape::Escape(Isolate* isolate, Handle<String> string) { | 228 MaybeHandle<String> URIEscape::Escape(Isolate* isolate, Handle<String> string) { |
| 229 ASSERT(string->IsFlat()); | 229 DCHECK(string->IsFlat()); |
| 230 int escaped_length = 0; | 230 int escaped_length = 0; |
| 231 int length = string->length(); | 231 int length = string->length(); |
| 232 | 232 |
| 233 { DisallowHeapAllocation no_allocation; | 233 { DisallowHeapAllocation no_allocation; |
| 234 Vector<const Char> vector = GetCharVector<Char>(string); | 234 Vector<const Char> vector = GetCharVector<Char>(string); |
| 235 for (int i = 0; i < length; i++) { | 235 for (int i = 0; i < length; i++) { |
| 236 uint16_t c = vector[i]; | 236 uint16_t c = vector[i]; |
| 237 if (c >= 256) { | 237 if (c >= 256) { |
| 238 escaped_length += 6; | 238 escaped_length += 6; |
| 239 } else if (IsNotEscaped(c)) { | 239 } else if (IsNotEscaped(c)) { |
| 240 escaped_length++; | 240 escaped_length++; |
| 241 } else { | 241 } else { |
| 242 escaped_length += 3; | 242 escaped_length += 3; |
| 243 } | 243 } |
| 244 | 244 |
| 245 // We don't allow strings that are longer than a maximal length. | 245 // We don't allow strings that are longer than a maximal length. |
| 246 ASSERT(String::kMaxLength < 0x7fffffff - 6); // Cannot overflow. | 246 DCHECK(String::kMaxLength < 0x7fffffff - 6); // Cannot overflow. |
| 247 if (escaped_length > String::kMaxLength) break; // Provoke exception. | 247 if (escaped_length > String::kMaxLength) break; // Provoke exception. |
| 248 } | 248 } |
| 249 } | 249 } |
| 250 | 250 |
| 251 // No length change implies no change. Return original string if no change. | 251 // No length change implies no change. Return original string if no change. |
| 252 if (escaped_length == length) return string; | 252 if (escaped_length == length) return string; |
| 253 | 253 |
| 254 Handle<SeqOneByteString> dest; | 254 Handle<SeqOneByteString> dest; |
| 255 ASSIGN_RETURN_ON_EXCEPTION( | 255 ASSIGN_RETURN_ON_EXCEPTION( |
| 256 isolate, dest, | 256 isolate, dest, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 281 } | 281 } |
| 282 } | 282 } |
| 283 } | 283 } |
| 284 | 284 |
| 285 return dest; | 285 return dest; |
| 286 } | 286 } |
| 287 | 287 |
| 288 } } // namespace v8::internal | 288 } } // namespace v8::internal |
| 289 | 289 |
| 290 #endif // V8_URI_H_ | 290 #endif // V8_URI_H_ |
| OLD | NEW |