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

Unified Diff: runtime/vm/object.cc

Issue 1969563002: Eliminate GrowableTokenStream (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b80b52f5385871d7dfe70adba5fef69b5b1f8a08..186432c5b7190efe7878d362ce63b40992f1dcc3 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -8456,7 +8456,7 @@ typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap;
// Helper class for creation of compressed token stream data.
-class CompressedTokenStreamData : public ValueObject {
+class CompressedTokenStreamData : public Scanner::TokenCollector {
public:
static const intptr_t kInitialBufferSize = 16 * KB;
static const bool kPrintTokenObjects = false;
@@ -8468,9 +8468,32 @@ class CompressedTokenStreamData : public ValueObject {
token_objects_(ta),
tokens_(map),
value_(Object::Handle()),
- fresh_index_smi_(Smi::Handle()) {
+ fresh_index_smi_(Smi::Handle()),
+ num_tokens_collected_(0) {
}
+ virtual ~CompressedTokenStreamData() { }
+ virtual void AddToken(const Scanner::TokenDescriptor& token) {
+ if (token.kind == Token::kIDENT) { // Identifier token.
+ AddIdentToken(*token.literal);
+ } else if (Token::NeedsLiteralToken(token.kind)) { // Literal token.
+ AddLiteralToken(token);
+ } else { // Keyword, pseudo keyword etc.
+ ASSERT(token.kind < Token::kNumTokens);
+ AddSimpleToken(token.kind);
+ }
+ num_tokens_collected_++;
+ }
+
+ // Return the compressed token stream.
+ uint8_t* GetStream() const { return buffer_; }
+
+ // Return the compressed token stream length.
+ intptr_t Length() const { return stream_.bytes_written(); }
+
+ intptr_t NumTokens() const { return num_tokens_collected_; }
+
+ private:
// Add an IDENT token into the stream and the token hash map.
void AddIdentToken(const String& ident) {
ASSERT(ident.IsSymbol());
@@ -8521,13 +8544,6 @@ class CompressedTokenStreamData : public ValueObject {
stream_.WriteUnsigned(kind);
}
- // Return the compressed token stream.
- uint8_t* GetStream() const { return buffer_; }
-
- // Return the compressed token stream length.
- intptr_t Length() const { return stream_.bytes_written(); }
-
- private:
void WriteIndex(intptr_t value) {
stream_.WriteUnsigned(value + Token::kNumTokens);
}
@@ -8545,18 +8561,17 @@ class CompressedTokenStreamData : public ValueObject {
CompressedTokenMap* tokens_;
Object& value_;
Smi& fresh_index_smi_;
+ intptr_t num_tokens_collected_;
DISALLOW_COPY_AND_ASSIGN(CompressedTokenStreamData);
};
-RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens,
+RawTokenStream* TokenStream::New(const String& source,
const String& private_key,
bool use_shared_tokens) {
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
- // Copy the relevant data out of the scanner into a compressed stream of
- // tokens.
GrowableObjectArray& token_objects = GrowableObjectArray::Handle(zone);
Array& token_objects_map = Array::Handle(zone);
@@ -8580,20 +8595,9 @@ RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens,
}
CompressedTokenMap map(token_objects_map.raw());
CompressedTokenStreamData data(token_objects, &map);
-
- intptr_t len = tokens.length();
- for (intptr_t i = 0; i < len; i++) {
- Scanner::TokenDescriptor token = tokens[i];
- if (token.kind == Token::kIDENT) { // Identifier token.
- data.AddIdentToken(*token.literal);
- } else if (Token::NeedsLiteralToken(token.kind)) { // Literal token.
- data.AddLiteralToken(token);
- } else { // Keyword, pseudo keyword etc.
- ASSERT(token.kind < Token::kNumTokens);
- data.AddSimpleToken(token.kind);
- }
- }
- data.AddSimpleToken(Token::kEOS); // End of stream.
+ Scanner scanner(source, private_key);
+ scanner.ScanAll(&data);
+ INC_STAT(thread, num_tokens_scanned, data.NumTokens());
// Create and setup the token stream object.
const ExternalTypedData& stream = ExternalTypedData::Handle(
@@ -8941,11 +8945,9 @@ void Script::Tokenize(const String& private_key,
VMTagScope tagScope(thread, VMTag::kCompileScannerTagId);
CSTAT_TIMER_SCOPE(thread, scanner_timer);
const String& src = String::Handle(zone, Source());
- Scanner scanner(src, private_key);
- const Scanner::GrowableTokenStream& ts = scanner.GetStream();
- INC_STAT(thread, num_tokens_scanned, ts.length());
- set_tokens(TokenStream::Handle(zone,
- TokenStream::New(ts, private_key, use_shared_tokens)));
+ const TokenStream& ts = TokenStream::Handle(zone,
+ TokenStream::New(src, private_key, use_shared_tokens));
+ set_tokens(ts);
INC_STAT(thread, src_length, src.Length());
}
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698