OLD | NEW |
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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 protected: | 113 protected: |
114 static const uc32 kEndOfInput = -1; | 114 static const uc32 kEndOfInput = -1; |
115 | 115 |
116 // Ensures that the buffer_cursor_ points to the code_unit at | 116 // Ensures that the buffer_cursor_ points to the code_unit at |
117 // position pos_ of the input, if possible. If the position | 117 // position pos_ of the input, if possible. If the position |
118 // is at or after the end of the input, return false. If there | 118 // is at or after the end of the input, return false. If there |
119 // are more code_units available, return true. | 119 // are more code_units available, return true. |
120 virtual bool ReadBlock() = 0; | 120 virtual bool ReadBlock() = 0; |
121 virtual unsigned SlowSeekForward(unsigned code_unit_count) = 0; | 121 virtual unsigned SlowSeekForward(unsigned code_unit_count) = 0; |
122 | 122 |
123 const uc16* buffer_cursor_; | 123 const uint16_t* buffer_cursor_; |
124 const uc16* buffer_end_; | 124 const uint16_t* buffer_end_; |
125 unsigned pos_; | 125 unsigned pos_; |
126 }; | 126 }; |
127 | 127 |
128 | 128 |
129 // --------------------------------------------------------------------- | 129 // --------------------------------------------------------------------- |
130 // Caching predicates used by scanners. | 130 // Caching predicates used by scanners. |
131 | 131 |
132 class UnicodeCache { | 132 class UnicodeCache { |
133 public: | 133 public: |
134 UnicodeCache() {} | 134 UnicodeCache() {} |
(...skipping 27 matching lines...) Expand all Loading... |
162 // --------------------------------------------------------------------- | 162 // --------------------------------------------------------------------- |
163 // DuplicateFinder discovers duplicate symbols. | 163 // DuplicateFinder discovers duplicate symbols. |
164 | 164 |
165 class DuplicateFinder { | 165 class DuplicateFinder { |
166 public: | 166 public: |
167 explicit DuplicateFinder(UnicodeCache* constants) | 167 explicit DuplicateFinder(UnicodeCache* constants) |
168 : unicode_constants_(constants), | 168 : unicode_constants_(constants), |
169 backing_store_(16), | 169 backing_store_(16), |
170 map_(&Match) { } | 170 map_(&Match) { } |
171 | 171 |
172 int AddAsciiSymbol(Vector<const char> key, int value); | 172 int AddOneByteSymbol(Vector<const uint8_t> key, int value); |
173 int AddUtf16Symbol(Vector<const uint16_t> key, int value); | 173 int AddTwoByteSymbol(Vector<const uint16_t> key, int value); |
174 // Add a a number literal by converting it (if necessary) | 174 // Add a a number literal by converting it (if necessary) |
175 // to the string that ToString(ToNumber(literal)) would generate. | 175 // to the string that ToString(ToNumber(literal)) would generate. |
176 // and then adding that string with AddAsciiSymbol. | 176 // and then adding that string with AddAsciiSymbol. |
177 // This string is the actual value used as key in an object literal, | 177 // This string is the actual value used as key in an object literal, |
178 // and the one that must be different from the other keys. | 178 // and the one that must be different from the other keys. |
179 int AddNumber(Vector<const char> key, int value); | 179 int AddNumber(Vector<const uint8_t> key, int value); |
180 | 180 |
181 private: | 181 private: |
182 int AddSymbol(Vector<const byte> key, bool is_one_byte, int value); | 182 int AddSymbol(Vector<const uint8_t> key, bool is_one_byte, int value); |
183 // Backs up the key and its length in the backing store. | 183 // Backs up the key and its length in the backing store. |
184 // The backup is stored with a base 127 encoding of the | 184 // The backup is stored with a base 127 encoding of the |
185 // length (plus a bit saying whether the string is ASCII), | 185 // length (plus a bit saying whether the string is one byte), |
186 // followed by the bytes of the key. | 186 // followed by the bytes of the key. |
187 byte* BackupKey(Vector<const byte> key, bool is_one_byte); | 187 uint8_t* BackupKey(Vector<const uint8_t> key, bool is_one_byte); |
188 | 188 |
189 // Compare two encoded keys (both pointing into the backing store) | 189 // Compare two encoded keys (both pointing into the backing store) |
190 // for having the same base-127 encoded lengths and ASCII-ness, | 190 // for having the same base-127 encoded lengths and ASCII-ness, |
191 // and then having the same 'length' bytes following. | 191 // and then having the same 'length' bytes following. |
192 static bool Match(void* first, void* second); | 192 static bool Match(void* first, void* second); |
193 // Creates a hash from a sequence of bytes. | 193 // Creates a hash from a sequence of bytes. |
194 static uint32_t Hash(Vector<const byte> key, bool is_one_byte); | 194 static uint32_t Hash(Vector<const uint8_t> key, bool is_one_byte); |
195 // Checks whether a string containing a JS number is its canonical | 195 // Checks whether a string containing a JS number is its canonical |
196 // form. | 196 // form. |
197 static bool IsNumberCanonical(Vector<const char> key); | 197 static bool IsNumberCanonical(Vector<const uint8_t> key); |
198 | 198 |
199 // Size of buffer. Sufficient for using it to call DoubleToCString in | 199 // Size of buffer. Sufficient for using it to call DoubleToCString in |
200 // from conversions.h. | 200 // from conversions.h. |
201 static const int kBufferSize = 100; | 201 static const int kBufferSize = 100; |
202 | 202 |
203 UnicodeCache* unicode_constants_; | 203 UnicodeCache* unicode_constants_; |
204 // Backing store used to store strings used as hashmap keys. | 204 // Backing store used to store strings used as hashmap keys. |
205 SequenceCollector<unsigned char> backing_store_; | 205 SequenceCollector<unsigned char> backing_store_; |
206 HashMap map_; | 206 HashMap map_; |
207 // Buffer used for string->number->canonical string conversions. | 207 // Buffer used for string->number->canonical string conversions. |
(...skipping 15 matching lines...) Expand all Loading... |
223 } | 223 } |
224 | 224 |
225 INLINE(void AddChar(uint32_t code_unit)) { | 225 INLINE(void AddChar(uint32_t code_unit)) { |
226 if (position_ >= backing_store_.length()) ExpandBuffer(); | 226 if (position_ >= backing_store_.length()) ExpandBuffer(); |
227 if (is_one_byte_) { | 227 if (is_one_byte_) { |
228 if (code_unit <= unibrow::Latin1::kMaxChar) { | 228 if (code_unit <= unibrow::Latin1::kMaxChar) { |
229 backing_store_[position_] = static_cast<byte>(code_unit); | 229 backing_store_[position_] = static_cast<byte>(code_unit); |
230 position_ += kOneByteSize; | 230 position_ += kOneByteSize; |
231 return; | 231 return; |
232 } | 232 } |
233 ConvertToUtf16(); | 233 ConvertToTwoByte(); |
234 } | 234 } |
235 ASSERT(code_unit < 0x10000u); | 235 ASSERT(code_unit < 0x10000u); |
236 *reinterpret_cast<uc16*>(&backing_store_[position_]) = code_unit; | 236 *reinterpret_cast<uint16_t*>(&backing_store_[position_]) = code_unit; |
237 position_ += kUC16Size; | 237 position_ += kUC16Size; |
238 } | 238 } |
239 | 239 |
240 bool is_one_byte() { return is_one_byte_; } | 240 bool is_one_byte() { return is_one_byte_; } |
241 | 241 |
242 bool is_contextual_keyword(Vector<const char> keyword) { | 242 bool is_contextual_keyword(Vector<const char> keyword) { |
243 return is_one_byte() && keyword.length() == position_ && | 243 return is_one_byte() && keyword.length() == position_ && |
244 (memcmp(keyword.start(), backing_store_.start(), position_) == 0); | 244 (memcmp(keyword.start(), backing_store_.start(), position_) == 0); |
245 } | 245 } |
246 | 246 |
247 Vector<const uc16> utf16_literal() { | 247 Vector<const uint16_t> two_byte_literal() { |
248 ASSERT(!is_one_byte_); | 248 ASSERT(!is_one_byte_); |
249 ASSERT((position_ & 0x1) == 0); | 249 ASSERT((position_ & 0x1) == 0); |
250 return Vector<const uc16>( | 250 return Vector<const uint16_t>( |
251 reinterpret_cast<const uc16*>(backing_store_.start()), | 251 reinterpret_cast<const uint16_t*>(backing_store_.start()), |
252 position_ >> 1); | 252 position_ >> 1); |
253 } | 253 } |
254 | 254 |
255 Vector<const char> one_byte_literal() { | 255 Vector<const uint8_t> one_byte_literal() { |
256 ASSERT(is_one_byte_); | 256 ASSERT(is_one_byte_); |
257 return Vector<const char>( | 257 return Vector<const uint8_t>( |
258 reinterpret_cast<const char*>(backing_store_.start()), | 258 reinterpret_cast<const uint8_t*>(backing_store_.start()), |
259 position_); | 259 position_); |
260 } | 260 } |
261 | 261 |
262 int length() { | 262 int length() { |
263 return is_one_byte_ ? position_ : (position_ >> 1); | 263 return is_one_byte_ ? position_ : (position_ >> 1); |
264 } | 264 } |
265 | 265 |
266 void Reset() { | 266 void Reset() { |
267 position_ = 0; | 267 position_ = 0; |
268 is_one_byte_ = true; | 268 is_one_byte_ = true; |
(...skipping 10 matching lines...) Expand all Loading... |
279 return new_capacity; | 279 return new_capacity; |
280 } | 280 } |
281 | 281 |
282 void ExpandBuffer() { | 282 void ExpandBuffer() { |
283 Vector<byte> new_store = Vector<byte>::New(NewCapacity(kInitialCapacity)); | 283 Vector<byte> new_store = Vector<byte>::New(NewCapacity(kInitialCapacity)); |
284 OS::MemCopy(new_store.start(), backing_store_.start(), position_); | 284 OS::MemCopy(new_store.start(), backing_store_.start(), position_); |
285 backing_store_.Dispose(); | 285 backing_store_.Dispose(); |
286 backing_store_ = new_store; | 286 backing_store_ = new_store; |
287 } | 287 } |
288 | 288 |
289 void ConvertToUtf16() { | 289 void ConvertToTwoByte() { |
290 ASSERT(is_one_byte_); | 290 ASSERT(is_one_byte_); |
291 Vector<byte> new_store; | 291 Vector<byte> new_store; |
292 int new_content_size = position_ * kUC16Size; | 292 int new_content_size = position_ * kUC16Size; |
293 if (new_content_size >= backing_store_.length()) { | 293 if (new_content_size >= backing_store_.length()) { |
294 // Ensure room for all currently read code units as UC16 as well | 294 // Ensure room for all currently read code units as UC16 as well |
295 // as the code unit about to be stored. | 295 // as the code unit about to be stored. |
296 new_store = Vector<byte>::New(NewCapacity(new_content_size)); | 296 new_store = Vector<byte>::New(NewCapacity(new_content_size)); |
297 } else { | 297 } else { |
298 new_store = backing_store_; | 298 new_store = backing_store_; |
299 } | 299 } |
300 uint8_t* src = backing_store_.start(); | 300 uint8_t* src = backing_store_.start(); |
301 uc16* dst = reinterpret_cast<uc16*>(new_store.start()); | 301 uint16_t* dst = reinterpret_cast<uint16_t*>(new_store.start()); |
302 for (int i = position_ - 1; i >= 0; i--) { | 302 for (int i = position_ - 1; i >= 0; i--) { |
303 dst[i] = src[i]; | 303 dst[i] = src[i]; |
304 } | 304 } |
305 if (new_store.start() != backing_store_.start()) { | 305 if (new_store.start() != backing_store_.start()) { |
306 backing_store_.Dispose(); | 306 backing_store_.Dispose(); |
307 backing_store_ = new_store; | 307 backing_store_ = new_store; |
308 } | 308 } |
309 position_ = new_content_size; | 309 position_ = new_content_size; |
310 is_one_byte_ = false; | 310 is_one_byte_ = false; |
311 } | 311 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 | 401 |
402 Handle<String> AllocateNextLiteralString(Isolate* isolate, | 402 Handle<String> AllocateNextLiteralString(Isolate* isolate, |
403 PretenureFlag tenured); | 403 PretenureFlag tenured); |
404 Handle<String> AllocateInternalizedString(Isolate* isolate); | 404 Handle<String> AllocateInternalizedString(Isolate* isolate); |
405 | 405 |
406 double DoubleValue(); | 406 double DoubleValue(); |
407 bool UnescapedLiteralMatches(const char* data, int length) { | 407 bool UnescapedLiteralMatches(const char* data, int length) { |
408 if (is_literal_one_byte() && | 408 if (is_literal_one_byte() && |
409 literal_length() == length && | 409 literal_length() == length && |
410 !literal_contains_escapes()) { | 410 !literal_contains_escapes()) { |
411 return !strncmp(literal_one_byte_string().start(), data, length); | 411 const char* token = |
| 412 reinterpret_cast<const char*>(literal_one_byte_string().start()); |
| 413 return !strncmp(token, data, length); |
412 } | 414 } |
413 return false; | 415 return false; |
414 } | 416 } |
415 void IsGetOrSet(bool* is_get, bool* is_set) { | 417 void IsGetOrSet(bool* is_get, bool* is_set) { |
416 if (is_literal_one_byte() && | 418 if (is_literal_one_byte() && |
417 literal_length() == 3 && | 419 literal_length() == 3 && |
418 !literal_contains_escapes()) { | 420 !literal_contains_escapes()) { |
419 const char* token = literal_one_byte_string().start(); | 421 const char* token = |
| 422 reinterpret_cast<const char*>(literal_one_byte_string().start()); |
420 *is_get = strncmp(token, "get", 3) == 0; | 423 *is_get = strncmp(token, "get", 3) == 0; |
421 *is_set = !*is_get && strncmp(token, "set", 3) == 0; | 424 *is_set = !*is_get && strncmp(token, "set", 3) == 0; |
422 } | 425 } |
423 } | 426 } |
424 | 427 |
425 int FindNumber(DuplicateFinder* finder, int value); | 428 int FindNumber(DuplicateFinder* finder, int value); |
426 int FindSymbol(DuplicateFinder* finder, int value); | 429 int FindSymbol(DuplicateFinder* finder, int value); |
427 | 430 |
428 void LogSymbol(ParserRecorder* log, int position); | 431 void LogSymbol(ParserRecorder* log, int position); |
429 | 432 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 return else_; | 547 return else_; |
545 } | 548 } |
546 } | 549 } |
547 | 550 |
548 // Returns the literal string, if any, for the current token (the | 551 // Returns the literal string, if any, for the current token (the |
549 // token last returned by Next()). The string is 0-terminated. | 552 // token last returned by Next()). The string is 0-terminated. |
550 // Literal strings are collected for identifiers, strings, and | 553 // Literal strings are collected for identifiers, strings, and |
551 // numbers. | 554 // numbers. |
552 // These functions only give the correct result if the literal | 555 // These functions only give the correct result if the literal |
553 // was scanned between calls to StartLiteral() and TerminateLiteral(). | 556 // was scanned between calls to StartLiteral() and TerminateLiteral(). |
554 Vector<const char> literal_one_byte_string() { | 557 Vector<const uint8_t> literal_one_byte_string() { |
555 ASSERT_NOT_NULL(current_.literal_chars); | 558 ASSERT_NOT_NULL(current_.literal_chars); |
556 return current_.literal_chars->one_byte_literal(); | 559 return current_.literal_chars->one_byte_literal(); |
557 } | 560 } |
558 Vector<const uc16> literal_utf16_string() { | 561 Vector<const uint16_t> literal_two_byte_string() { |
559 ASSERT_NOT_NULL(current_.literal_chars); | 562 ASSERT_NOT_NULL(current_.literal_chars); |
560 return current_.literal_chars->utf16_literal(); | 563 return current_.literal_chars->two_byte_literal(); |
561 } | 564 } |
562 bool is_literal_one_byte() { | 565 bool is_literal_one_byte() { |
563 ASSERT_NOT_NULL(current_.literal_chars); | 566 ASSERT_NOT_NULL(current_.literal_chars); |
564 return current_.literal_chars->is_one_byte(); | 567 return current_.literal_chars->is_one_byte(); |
565 } | 568 } |
566 int literal_length() const { | 569 int literal_length() const { |
567 ASSERT_NOT_NULL(current_.literal_chars); | 570 ASSERT_NOT_NULL(current_.literal_chars); |
568 return current_.literal_chars->length(); | 571 return current_.literal_chars->length(); |
569 } | 572 } |
570 // Returns the literal string for the next token (the token that | 573 // Returns the literal string for the next token (the token that |
571 // would be returned if Next() were called). | 574 // would be returned if Next() were called). |
572 Vector<const char> next_literal_one_byte_string() { | 575 Vector<const uint8_t> next_literal_one_byte_string() { |
573 ASSERT_NOT_NULL(next_.literal_chars); | 576 ASSERT_NOT_NULL(next_.literal_chars); |
574 return next_.literal_chars->one_byte_literal(); | 577 return next_.literal_chars->one_byte_literal(); |
575 } | 578 } |
576 Vector<const uc16> next_literal_utf16_string() { | 579 Vector<const uint16_t> next_literal_two_byte_string() { |
577 ASSERT_NOT_NULL(next_.literal_chars); | 580 ASSERT_NOT_NULL(next_.literal_chars); |
578 return next_.literal_chars->utf16_literal(); | 581 return next_.literal_chars->two_byte_literal(); |
579 } | 582 } |
580 bool is_next_literal_one_byte() { | 583 bool is_next_literal_one_byte() { |
581 ASSERT_NOT_NULL(next_.literal_chars); | 584 ASSERT_NOT_NULL(next_.literal_chars); |
582 return next_.literal_chars->is_one_byte(); | 585 return next_.literal_chars->is_one_byte(); |
583 } | 586 } |
584 int next_literal_length() const { | 587 int next_literal_length() const { |
585 ASSERT_NOT_NULL(next_.literal_chars); | 588 ASSERT_NOT_NULL(next_.literal_chars); |
586 return next_.literal_chars->length(); | 589 return next_.literal_chars->length(); |
587 } | 590 } |
588 | 591 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 bool harmony_scoping_; | 654 bool harmony_scoping_; |
652 // Whether we scan 'module', 'import', 'export' as keywords. | 655 // Whether we scan 'module', 'import', 'export' as keywords. |
653 bool harmony_modules_; | 656 bool harmony_modules_; |
654 // Whether we scan 0o777 and 0b111 as numbers. | 657 // Whether we scan 0o777 and 0b111 as numbers. |
655 bool harmony_numeric_literals_; | 658 bool harmony_numeric_literals_; |
656 }; | 659 }; |
657 | 660 |
658 } } // namespace v8::internal | 661 } } // namespace v8::internal |
659 | 662 |
660 #endif // V8_SCANNER_H_ | 663 #endif // V8_SCANNER_H_ |
OLD | NEW |