Index: vm/object.cc |
=================================================================== |
--- vm/object.cc (revision 11973) |
+++ vm/object.cc (working copy) |
@@ -4788,11 +4788,22 @@ |
} |
-void TokenStream::SetLength(intptr_t value) const { |
- raw_ptr()->length_ = Smi::New(value); |
+RawExternalUint8Array* TokenStream::GetStream() const { |
+ return raw_ptr()->stream_; |
} |
+void TokenStream::SetStream(const ExternalUint8Array& value) const { |
+ StorePointer(&raw_ptr()->stream_, value.raw()); |
+} |
+ |
+ |
+void TokenStream::DataFinalizer(void *peer) { |
+ ASSERT(peer != NULL); |
+ ::free(peer); |
+} |
+ |
+ |
RawString* TokenStream::PrivateKey() const { |
return raw_ptr()->private_key_; |
} |
@@ -4805,8 +4816,9 @@ |
RawString* TokenStream::GenerateSource() const { |
Iterator iterator(*this, 0); |
+ const ExternalUint8Array& data = ExternalUint8Array::Handle(GetStream()); |
const GrowableObjectArray& literals = |
- GrowableObjectArray::Handle(GrowableObjectArray::New(Length())); |
+ GrowableObjectArray::Handle(GrowableObjectArray::New(data.Length())); |
const String& private_key = String::Handle(PrivateKey()); |
intptr_t private_len = private_key.Length(); |
@@ -4970,25 +4982,35 @@ |
} |
-RawTokenStream* TokenStream::New(intptr_t len) { |
+RawTokenStream* TokenStream::New() { |
ASSERT(Object::token_stream_class() != Class::null()); |
- if (len < 0 || len > kMaxElements) { |
- // This should be caught before we reach here. |
- FATAL1("Fatal error in TokenStream::New: invalid len %"Pd"\n", len); |
- } |
TokenStream& result = TokenStream::Handle(); |
{ |
RawObject* raw = Object::Allocate(TokenStream::kClassId, |
- TokenStream::InstanceSize(len), |
+ TokenStream::InstanceSize(), |
Heap::kOld); |
NoGCScope no_gc; |
result ^= raw; |
- result.SetLength(len); |
} |
return result.raw(); |
} |
+RawTokenStream* TokenStream::New(intptr_t len) { |
+ if (len < 0 || len > kMaxElements) { |
+ // This should be caught before we reach here. |
+ FATAL1("Fatal error in TokenStream::New: invalid len %"Pd"\n", len); |
+ } |
+ uint8_t* data = reinterpret_cast<uint8_t*>(::malloc(len)); |
+ ASSERT(data != NULL); |
+ const ExternalUint8Array& stream = ExternalUint8Array::Handle( |
+ ExternalUint8Array::New(data, len, data, DataFinalizer, Heap::kOld)); |
+ const TokenStream& result = TokenStream::Handle(TokenStream::New()); |
+ result.SetStream(stream); |
+ return result.raw(); |
+} |
+ |
+ |
// Helper class for creation of compressed token stream data. |
class CompressedTokenStreamData : public ValueObject { |
public: |
@@ -5004,7 +5026,6 @@ |
token_objects_.Add(empty_literal); |
} |
~CompressedTokenStreamData() { |
- free(buffer_); |
} |
// Add an IDENT token into the stream and the token objects array. |
@@ -5154,11 +5175,17 @@ |
data.AddSimpleToken(Token::kEOS); // End of stream. |
// Create and setup the token stream object. |
- const TokenStream& result = TokenStream::Handle(New(data.Length())); |
+ const ExternalUint8Array& stream = ExternalUint8Array::Handle( |
+ ExternalUint8Array::New(data.GetStream(), |
+ data.Length(), |
+ data.GetStream(), |
+ DataFinalizer, |
+ Heap::kOld)); |
+ const TokenStream& result = TokenStream::Handle(New()); |
result.SetPrivateKey(private_key); |
{ |
NoGCScope no_gc; |
- memmove(result.EntryAddr(0), data.GetStream(), data.Length()); |
+ result.SetStream(stream); |
const Array& tokens = Array::Handle(Array::MakeArray(data.TokenObjects())); |
result.SetTokenObjects(tokens); |
} |
@@ -5173,10 +5200,11 @@ |
TokenStream::Iterator::Iterator(const TokenStream& tokens, intptr_t token_pos) |
: tokens_(tokens), |
+ data_(ExternalUint8Array::Handle(tokens.GetStream())), |
+ stream_(data_.ByteAddr(0), data_.Length()), |
token_objects_(Array::Handle(tokens.TokenObjects())), |
obj_(Object::Handle()), |
cur_token_pos_(token_pos), |
- stream_token_pos_(token_pos), |
cur_token_kind_(Token::kILLEGAL), |
cur_token_obj_index_(-1) { |
SetCurrentPosition(token_pos); |
@@ -5189,7 +5217,7 @@ |
Token::Kind TokenStream::Iterator::LookaheadTokenKind(intptr_t num_tokens) { |
- intptr_t saved_position = stream_token_pos_; |
+ intptr_t saved_position = stream_.Position(); |
Token::Kind kind = Token::kILLEGAL; |
intptr_t value = -1; |
intptr_t count = 0; |
@@ -5210,7 +5238,7 @@ |
kind = Token::kIDENT; |
} |
} |
- stream_token_pos_ = saved_position; |
+ stream_.SetPosition(saved_position); |
return kind; |
} |
@@ -5221,13 +5249,13 @@ |
void TokenStream::Iterator::SetCurrentPosition(intptr_t value) { |
- stream_token_pos_ = value; |
+ stream_.SetPosition(value); |
Advance(); |
} |
void TokenStream::Iterator::Advance() { |
- cur_token_pos_ = stream_token_pos_; |
+ cur_token_pos_ = stream_.Position(); |
intptr_t value = ReadToken(); |
if (value < Token::kNumTokens) { |
cur_token_kind_ = static_cast<Token::Kind>(value); |
@@ -5288,30 +5316,6 @@ |
} |
-intptr_t TokenStream::Iterator::ReadToken() { |
- uint8_t b = ReadByte(); |
- if (b > kMaxUnsignedDataPerByte) { |
- return static_cast<intptr_t>(b) - kEndUnsignedByteMarker; |
- } |
- intptr_t value = 0; |
- uint8_t s = 0; |
- do { |
- value |= static_cast<intptr_t>(b) << s; |
- s += kDataBitsPerByte; |
- b = ReadByte(); |
- } while (b <= kMaxUnsignedDataPerByte); |
- value |= ((static_cast<intptr_t>(b) - kEndUnsignedByteMarker) << s); |
- ASSERT((value >= 0) && (value <= kIntptrMax)); |
- return value; |
-} |
- |
- |
-uint8_t TokenStream::Iterator::ReadByte() { |
- ASSERT(stream_token_pos_ < tokens_.Length()); |
- return *(tokens_.EntryAddr(stream_token_pos_++)); |
-} |
- |
- |
bool Script::HasSource() const { |
return raw_ptr()->source_ != String::null(); |
} |