Index: src/scanner.h |
=================================================================== |
--- src/scanner.h (revision 2670) |
+++ src/scanner.h (working copy) |
@@ -73,27 +73,56 @@ |
class UTF16Buffer { |
public: |
UTF16Buffer(); |
+ virtual ~UTF16Buffer() {} |
- void Initialize(Handle<String> data, unibrow::CharacterStream* stream); |
- void PushBack(uc32 ch); |
- uc32 Advance(); // returns a value < 0 when the buffer end is reached |
- uint16_t CharAt(int index); |
+ virtual void PushBack(uc32 ch) = 0; |
Kasper Lund
2009/08/18 06:49:41
Ideally, these functions could be made non-virtual
Feng Qian
2009/08/18 07:14:10
Let's do it later.
On 2009/08/18 06:49:41, Kasper
|
+ // returns a value < 0 when the buffer end is reached |
+ virtual uc32 Advance() = 0; |
+ virtual void SeekForward(int pos) = 0; |
+ |
int pos() const { return pos_; } |
int size() const { return size_; } |
Handle<String> SubString(int start, int end); |
- List<uc32>* pushback_buffer() { return &pushback_buffer_; } |
- void SeekForward(int pos); |
- private: |
+ protected: |
Handle<String> data_; |
int pos_; |
int size_; |
+}; |
+ |
+ |
+class CharacterStreamUTF16Buffer: public UTF16Buffer { |
+ public: |
+ CharacterStreamUTF16Buffer(); |
+ virtual ~CharacterStreamUTF16Buffer() {} |
+ void Initialize(Handle<String> data, unibrow::CharacterStream* stream); |
+ virtual void PushBack(uc32 ch); |
+ virtual uc32 Advance(); |
+ virtual void SeekForward(int pos); |
+ |
+ private: |
List<uc32> pushback_buffer_; |
uc32 last_; |
unibrow::CharacterStream* stream_; |
+ |
+ List<uc32>* pushback_buffer() { return &pushback_buffer_; } |
}; |
+class TwoByteStringUTF16Buffer: public UTF16Buffer { |
+ public: |
+ TwoByteStringUTF16Buffer(); |
+ virtual ~TwoByteStringUTF16Buffer() {} |
+ void Initialize(Handle<ExternalTwoByteString> data); |
+ virtual void PushBack(uc32 ch); |
+ virtual uc32 Advance(); |
+ virtual void SeekForward(int pos); |
+ |
+ private: |
+ const uint16_t* raw_data_; |
+}; |
+ |
+ |
class Scanner { |
public: |
@@ -184,8 +213,11 @@ |
static unibrow::Predicate<unibrow::WhiteSpace, 128> kIsWhiteSpace; |
private: |
+ CharacterStreamUTF16Buffer char_stream_buffer_; |
+ TwoByteStringUTF16Buffer two_byte_string_buffer_; |
+ |
// Source. |
- UTF16Buffer source_; |
+ UTF16Buffer* source_; |
int position_; |
// Buffer to hold literal values (identifiers, strings, numbers) |
@@ -219,8 +251,11 @@ |
void TerminateLiteral(); |
// Low-level scanning support. |
- void Advance(); |
- void PushBack(uc32 ch); |
+ void Advance() { c0_ = source_->Advance(); } |
+ void PushBack(uc32 ch) { |
+ source_->PushBack(ch); |
+ c0_ = ch; |
+ } |
bool SkipWhiteSpace(); |
Token::Value SkipSingleLineComment(); |
@@ -243,7 +278,7 @@ |
// Return the current source position. |
int source_pos() { |
- return source_.pos() - kCharacterLookaheadBufferSize + position_; |
+ return source_->pos() - kCharacterLookaheadBufferSize + position_; |
} |
// Decodes a unicode escape-sequence which is part of an identifier. |