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

Unified Diff: runtime/vm/scanner.cc

Issue 316253003: Scanner cleanups: use isolates to allocate handles and zone objects (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 6 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/scanner.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/scanner.cc
===================================================================
--- runtime/vm/scanner.cc (revision 37052)
+++ runtime/vm/scanner.cc (working copy)
@@ -19,6 +19,34 @@
DEFINE_FLAG(bool, print_tokens, false, "Print scanned tokens.");
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
+
+class ScanContext : public ZoneAllocated {
+ public:
+ explicit ScanContext(Scanner* scanner)
+ : next_(scanner->saved_context_),
+ string_delimiter_(scanner->string_delimiter_),
+ string_is_multiline_(scanner->string_is_multiline_),
+ brace_level_(scanner->brace_level_) {}
+
+ void CopyTo(Scanner* scanner) {
+ scanner->string_delimiter_ = string_delimiter_;
+ scanner->string_is_multiline_ = string_is_multiline_;
+ scanner->brace_level_ = brace_level_;
+ }
+
+ ScanContext* next() const { return next_; }
+
+ private:
hausner 2014/06/05 21:58:54 IMO it does not really make much sense to make thi
srdjan 2014/06/05 22:03:51 Discussed offline, leaving it as it is.
+ ScanContext* next_;
+ const char string_delimiter_;
+ const bool string_is_multiline_;
+ const int brace_level_;
+};
+
+
Scanner::KeywordTable Scanner::keywords_[Token::kNumKeywords];
int Scanner::keywords_char_offset_[Scanner::kNumLowercaseChars];
@@ -40,11 +68,7 @@
c0_ = '\0';
newline_seen_ = false;
prev_token_line_ = 1;
- while (saved_context_ != NULL) {
- ScanContext* ctx = saved_context_;
- saved_context_ = ctx->next;
- delete ctx;
- }
+ saved_context_ = NULL;
string_delimiter_ = '\0';
string_is_multiline_ = false;
brace_level_ = 0;
@@ -65,18 +89,12 @@
}
-Scanner::~Scanner() {
- while (saved_context_ != NULL) {
- ScanContext* ctx = saved_context_;
- saved_context_ = ctx->next;
- delete ctx;
- }
-}
+Scanner::~Scanner() {}
void Scanner::ErrorMsg(const char* msg) {
current_token_.kind = Token::kERROR;
- current_token_.literal = &String::ZoneHandle(Symbols::New(msg));
+ current_token_.literal = &String::ZoneHandle(I, Symbols::New(msg));
current_token_.position = c0_pos_;
token_start_ = lookahead_pos_;
current_token_.offset = lookahead_pos_;
@@ -84,12 +102,8 @@
void Scanner::PushContext() {
- ScanContext* ctx = new ScanContext;
- ctx->next = saved_context_;
+ ScanContext* ctx = new(I) ScanContext(this);
saved_context_ = ctx;
- ctx->string_delimiter = string_delimiter_;
- ctx->string_is_multiline = string_is_multiline_;
- ctx->brace_level = brace_level_;
string_delimiter_ = '\0';
string_is_multiline_ = false;
brace_level_ = 1; // Account for the opening ${ token.
@@ -101,12 +115,9 @@
ASSERT(brace_level_ == 0);
ASSERT(string_delimiter_ == '\0');
ScanContext* ctx = saved_context_;
- saved_context_ = ctx->next;
- string_delimiter_ = ctx->string_delimiter;
+ ctx->CopyTo(this);
+ saved_context_ = ctx->next();
ASSERT(string_delimiter_ != '\0');
- string_is_multiline_ = ctx->string_is_multiline;
- brace_level_ = ctx->brace_level;
- delete ctx;
}
@@ -318,7 +329,7 @@
// We did not read a keyword.
current_token_.kind = Token::kIDENT;
String& literal =
- String::ZoneHandle(Symbols::New(source_, ident_pos, ident_length));
+ String::ZoneHandle(I, Symbols::New(source_, ident_pos, ident_length));
if (ident_char0 == Library::kPrivateIdentifierStart) {
// Private identifiers are mangled on a per library basis.
literal = String::Concat(literal, private_key_);
@@ -376,7 +387,7 @@
}
if (current_token_.kind != Token::kILLEGAL) {
intptr_t len = lookahead_pos_ - token_start_;
- String& str = String::ZoneHandle(
+ String& str = String::ZoneHandle(I,
String::SubString(source_, token_start_, len, Heap::kOld));
str = Symbols::New(str);
current_token_.literal = &str;
@@ -531,7 +542,7 @@
// Scanned a string piece.
ASSERT(string_chars.data() != NULL);
// Strings are canonicalized: Allocate a symbol.
- current_token_.literal = &String::ZoneHandle(
+ current_token_.literal = &String::ZoneHandle(I,
Symbols::FromUTF32(string_chars.data(), string_chars.length()));
// Preserve error tokens.
if (current_token_.kind != Token::kERROR) {
@@ -554,7 +565,7 @@
Recognize(Token::kSTRING);
ASSERT(string_chars.data() != NULL);
// Strings are canonicalized: Allocate a symbol.
- current_token_.literal = &String::ZoneHandle(
+ current_token_.literal = &String::ZoneHandle(I,
Symbols::FromUTF32(string_chars.data(), string_chars.length()));
}
EndStringLiteral();
@@ -919,7 +930,7 @@
const Scanner::GrowableTokenStream& Scanner::GetStream() {
- GrowableTokenStream* ts = new GrowableTokenStream(128);
+ GrowableTokenStream* ts = new(I) GrowableTokenStream(128);
ScanAll(ts);
if (FLAG_print_tokens) {
Scanner::PrintTokens(*ts);
« no previous file with comments | « runtime/vm/scanner.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698