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

Unified Diff: runtime/vm/parser.cc

Issue 12207137: Reduce allocation of ArrayNode-s where a GrowableArray could be used instead. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 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/parser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
===================================================================
--- runtime/vm/parser.cc (revision 18405)
+++ runtime/vm/parser.cc (working copy)
@@ -8594,8 +8594,7 @@
Type::New(array_class, type_arguments, type_pos));
type ^= ClassFinalizer::FinalizeType(
current_class(), type, ClassFinalizer::kCanonicalize);
- ArrayNode* list = new ArrayNode(TokenPos(), type);
-
+ GrowableArray<AstNode*> element_list;
// Parse the list elements. Note: there may be an optional extra
// comma after the last element.
if (!is_empty_literal) {
@@ -8611,7 +8610,7 @@
element_type,
Symbols::ListLiteralElement());
}
- list->AddElement(element);
+ element_list.Add(element);
if (CurrentToken() == Token::kCOMMA) {
ConsumeToken();
} else if (CurrentToken() != Token::kRBRACK) {
@@ -8625,12 +8624,12 @@
if (is_const) {
// Allocate and initialize the const list at compile time.
Array& const_list =
- Array::ZoneHandle(Array::New(list->length(), Heap::kOld));
+ Array::ZoneHandle(Array::New(element_list.length(), Heap::kOld));
const_list.SetTypeArguments(
AbstractTypeArguments::Handle(type_arguments.Canonicalize()));
Error& malformed_error = Error::Handle();
- for (int i = 0; i < list->length(); i++) {
- AstNode* elem = list->ElementAt(i);
+ for (int i = 0; i < element_list.length(); i++) {
+ AstNode* elem = element_list[i];
// Arguments have been evaluated to a literal value already.
ASSERT(elem->IsLiteralNode());
if (FLAG_enable_type_checks &&
@@ -8684,6 +8683,7 @@
}
factory_type_args = factory_type_args.Canonicalize();
ArgumentListNode* factory_param = new ArgumentListNode(literal_pos);
+ ArrayNode* list = new ArrayNode(TokenPos(), type, element_list);
factory_param->Add(list);
return CreateConstructorCallNode(literal_pos,
factory_type_args,
@@ -8711,7 +8711,7 @@
}
-static void AddKeyValuePair(ArrayNode* pairs,
+static void AddKeyValuePair(GrowableArray<AstNode*>* pairs,
bool is_const,
AstNode* key,
AstNode* value) {
@@ -8721,18 +8721,18 @@
const Instance& new_key = key->AsLiteralNode()->literal();
for (int i = 0; i < pairs->length(); i += 2) {
const Instance& key_i =
- pairs->ElementAt(i)->AsLiteralNode()->literal();
+ (*pairs)[i]->AsLiteralNode()->literal();
ASSERT(key_i.IsString());
if (new_key.Equals(key_i)) {
// Duplicate key found. The new value replaces the previously
// defined value.
- pairs->SetElementAt(i + 1, value);
+ (*pairs)[i + 1] = value;
return;
}
}
}
- pairs->AddElement(key);
- pairs->AddElement(value);
+ pairs->Add(key);
+ pairs->Add(value);
}
@@ -8775,9 +8775,7 @@
// The kv_pair array is temporary and of element type dynamic. It is passed
// to the factory to initialize a properly typed map.
- ArrayNode* kv_pairs = new ArrayNode(
- TokenPos(), Type::ZoneHandle(Type::ArrayType()));
-
+ GrowableArray<AstNode*> kv_pairs_list;
// Parse the map entries. Note: there may be an optional extra
// comma after the last entry.
while (CurrentToken() != Token::kRBRACE) {
@@ -8803,7 +8801,7 @@
value_type,
Symbols::ListLiteralElement());
}
- AddKeyValuePair(kv_pairs, is_const, key, value);
+ AddKeyValuePair(&kv_pairs_list, is_const, key, value);
if (CurrentToken() == Token::kCOMMA) {
ConsumeToken();
@@ -8811,7 +8809,7 @@
ErrorMsg("comma or '}' expected");
}
}
- ASSERT(kv_pairs->length() % 2 == 0);
+ ASSERT(kv_pairs_list.length() % 2 == 0);
ExpectToken(Token::kRBRACE);
if (is_const) {
@@ -8821,10 +8819,10 @@
// First, create the canonicalized key-value pair array.
Array& key_value_array =
- Array::ZoneHandle(Array::New(kv_pairs->length(), Heap::kOld));
+ Array::ZoneHandle(Array::New(kv_pairs_list.length(), Heap::kOld));
Error& malformed_error = Error::Handle();
- for (int i = 0; i < kv_pairs->length(); i++) {
- AstNode* arg = kv_pairs->ElementAt(i);
+ for (int i = 0; i < kv_pairs_list.length(); i++) {
+ AstNode* arg = kv_pairs_list[i];
// Arguments have been evaluated to a literal value already.
ASSERT(arg->IsLiteralNode());
if (FLAG_enable_type_checks &&
@@ -8904,6 +8902,8 @@
}
factory_type_args = factory_type_args.Canonicalize();
ArgumentListNode* factory_param = new ArgumentListNode(literal_pos);
+ ArrayNode* kv_pairs = new ArrayNode(
+ TokenPos(), Type::ZoneHandle(Type::ArrayType()), kv_pairs_list);
factory_param->Add(kv_pairs);
return CreateConstructorCallNode(literal_pos,
factory_type_args,
@@ -9185,7 +9185,7 @@
}
-String& Parser::Interpolate(ArrayNode* values) {
+String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
const Class& cls = Class::Handle(LookupCoreClass(Symbols::StringBase()));
ASSERT(!cls.IsNull());
const Function& func =
@@ -9194,10 +9194,10 @@
ASSERT(!func.IsNull());
// Build the array of literal values to interpolate.
- const Array& value_arr = Array::Handle(Array::New(values->length()));
- for (int i = 0; i < values->length(); i++) {
- ASSERT(values->ElementAt(i)->IsLiteralNode());
- value_arr.SetAt(i, values->ElementAt(i)->AsLiteralNode()->literal());
+ const Array& value_arr = Array::Handle(Array::New(values.length()));
+ for (int i = 0; i < values.length(); i++) {
+ ASSERT(values[i]->IsLiteralNode());
+ value_arr.SetAt(i, values[i]->AsLiteralNode()->literal());
}
// Build argument array to pass to the interpolation function.
@@ -9237,10 +9237,9 @@
}
// String interpolation needed.
bool is_compiletime_const = true;
- ArrayNode* values = new ArrayNode(
- TokenPos(), Type::ZoneHandle(Type::ArrayType()));
+ GrowableArray<AstNode*> values_list;
while (CurrentToken() == Token::kSTRING) {
- values->AddElement(new LiteralNode(TokenPos(), *CurrentLiteral()));
+ values_list.Add(new LiteralNode(TokenPos(), *CurrentLiteral()));
ConsumeToken();
while ((CurrentToken() == Token::kINTERPOL_VAR) ||
(CurrentToken() == Token::kINTERPOL_START)) {
@@ -9272,14 +9271,15 @@
is_compiletime_const = false;
}
}
- values->AddElement(expr);
+ values_list.Add(expr);
}
}
if (is_compiletime_const) {
- primary = new LiteralNode(literal_start, Interpolate(values));
+ primary = new LiteralNode(literal_start, Interpolate(values_list));
} else {
- ArgumentListNode* interpolate_arg =
- new ArgumentListNode(values->token_pos());
+ ArgumentListNode* interpolate_arg = new ArgumentListNode(TokenPos());
+ ArrayNode* values = new ArrayNode(
+ TokenPos(), Type::ZoneHandle(Type::ArrayType()), values_list);
interpolate_arg->Add(values);
primary = MakeStaticCall(Symbols::StringBase(),
PrivateCoreLibName(Symbols::Interpolate()),
« no previous file with comments | « runtime/vm/parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698