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

Unified Diff: runtime/vm/parser.cc

Issue 1316373002: Remove more GrowableObjectArray usage in parser (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address comments Created 5 years, 4 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
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 621dee5464b8a7ce9f1234c0eb9477c812e1b04e..aa27a73b13b0348134750d225480a44e1f32a885 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -685,30 +685,32 @@ struct MemberDesc {
class ClassDesc : public ValueObject {
public:
- ClassDesc(const Class& cls,
+ ClassDesc(Zone* zone,
+ const Class& cls,
const String& cls_name,
bool is_interface,
intptr_t token_pos)
- : clazz_(cls),
+ : zone_(zone),
+ clazz_(cls),
class_name_(cls_name),
token_pos_(token_pos),
- functions_(GrowableObjectArray::Handle(GrowableObjectArray::New())),
- fields_(GrowableObjectArray::Handle(GrowableObjectArray::New())) {
+ functions_(zone, 4),
+ fields_(zone, 4) {
}
void AddFunction(const Function& function) {
- functions_.Add(function);
+ functions_.Add(&Function::ZoneHandle(zone_, function.raw()));
}
- const GrowableObjectArray& functions() const {
+ const GrowableArray<const Function*>& functions() const {
return functions_;
}
void AddField(const Field& field) {
- fields_.Add(field);
+ fields_.Add(&Field::ZoneHandle(zone_, field.raw()));
}
- const GrowableObjectArray& fields() const {
+ const GrowableArray<const Field*>& fields() const {
return fields_;
}
@@ -721,10 +723,9 @@ class ClassDesc : public ValueObject {
}
bool has_constructor() const {
- Function& func = Function::Handle();
- for (int i = 0; i < functions_.Length(); i++) {
- func ^= functions_.At(i);
- if (func.kind() == RawFunction::kConstructor) {
+ for (int i = 0; i < functions_.length(); i++) {
+ const Function* func = functions_.At(i);
+ if (func->kind() == RawFunction::kConstructor) {
return true;
}
}
@@ -752,23 +753,53 @@ class ClassDesc : public ValueObject {
return NULL;
}
+ RawArray* MakeFunctionsArray() {
+ const intptr_t len = functions_.length();
+ const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld));
+ for (intptr_t i = 0; i < len; i++) {
+ res.SetAt(i, *functions_[i]);
+ }
+ return res.raw();
+ }
+
private:
+ Zone* zone_;
const Class& clazz_;
const String& class_name_;
intptr_t token_pos_; // Token index of "class" keyword.
- GrowableObjectArray& functions_;
- GrowableObjectArray& fields_;
+ GrowableArray<const Function*> functions_;
+ GrowableArray<const Field*> fields_;
GrowableArray<MemberDesc> members_;
};
-struct TopLevel {
- TopLevel() :
- fields(GrowableObjectArray::Handle(GrowableObjectArray::New())),
- functions(GrowableObjectArray::Handle(GrowableObjectArray::New())) { }
+class TopLevel : public ValueObject {
+ public:
+ explicit TopLevel(Zone* zone) :
+ zone_(zone),
+ fields_(zone, 4),
+ functions_(zone, 4) { }
+
+ void AddField(const Field& field) {
+ fields_.Add(&Field::ZoneHandle(zone_, field.raw()));
+ }
+
+ void AddFunction(const Function& function) {
+ functions_.Add(&Function::ZoneHandle(zone_, function.raw()));
+ }
+
+ const GrowableArray<const Field*>& fields() const {
+ return fields_;
+ }
+
+ const GrowableArray<const Function*>& functions() const {
+ return functions_;
+ }
- GrowableObjectArray& fields;
- GrowableObjectArray& functions;
+ private:
+ Zone* zone_;
+ GrowableArray<const Field*> fields_;
+ GrowableArray<const Function*> functions_;
};
@@ -1179,12 +1210,15 @@ RawObject* Parser::ParseFunctionFromSource(const Class& owning_class,
parser.is_top_level_ = true;
parser.set_current_class(owning_class);
const String& class_name = String::Handle(owning_class.Name());
- ClassDesc members(owning_class, class_name, false, token_pos);
+ ClassDesc members(stack_zone.GetZone(),
+ owning_class,
+ class_name,
+ false, /* is_interface */
+ token_pos);
const intptr_t metadata_pos = parser.SkipMetadata();
parser.ParseClassMemberDefinition(&members, metadata_pos);
- ASSERT(members.functions().Length() == 1);
- const Function& func =
- Function::ZoneHandle(Function::RawCast(members.functions().At(0)));
+ ASSERT(members.functions().length() == 1);
+ const Function& func = *members.functions().At(0);
func.set_eval_script(script);
ParsedFunction* parsed_function = new ParsedFunction(thread, func);
Parser::ParseFunction(parsed_function);
@@ -4610,7 +4644,7 @@ void Parser::ParseClassDefinition(const Class& cls) {
}
ExpectToken(Token::kCLASS);
const intptr_t class_pos = TokenPos();
- ClassDesc members(cls, class_name, false, class_pos);
+ ClassDesc members(Z, cls, class_name, false, class_pos);
while (CurrentToken() != Token::kLBRACE) {
ConsumeToken();
}
@@ -4631,7 +4665,7 @@ void Parser::ParseClassDefinition(const Class& cls) {
cls.AddFields(members.fields());
// Creating a new array for functions marks the class as parsed.
- const Array& array = Array::Handle(Z, Array::MakeArray(members.functions()));
+ Array& array = Array::Handle(Z, members.MakeFunctionsArray());
cls.SetFunctions(array);
// Add an implicit constructor if no explicit constructor is present.
@@ -4662,7 +4696,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
ExpectToken(Token::kENUM);
const String& enum_name = String::Handle(Z, cls.Name());
- ClassDesc enum_members(cls, enum_name, false, cls.token_pos());
+ ClassDesc enum_members(Z, cls, enum_name, false, cls.token_pos());
// Add instance field 'final int index'.
Field& index_field = Field::ZoneHandle(Z);
@@ -4820,8 +4854,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
enum_members.AddFunction(hash_code_func);
cls.AddFields(enum_members.fields());
- const Array& functions =
- Array::Handle(Z, Array::MakeArray(enum_members.functions()));
+ const Array& functions = Array::Handle(Z, enum_members.MakeFunctionsArray());
cls.SetFunctions(functions);
}
@@ -5397,7 +5430,7 @@ void Parser::ParseTopLevelVariable(TopLevel* top_level,
current_class(), name_pos);
field.set_type(type);
field.set_value(Object::null_instance());
- top_level->fields.Add(field);
+ top_level->AddField(field);
library_.AddObject(field, var_name);
if (metadata_pos >= 0) {
library_.AddFieldMetadata(field, metadata_pos);
@@ -5430,7 +5463,7 @@ void Parser::ParseTopLevelVariable(TopLevel* top_level,
if (library_.is_dart_scheme() && library_.IsPrivate(var_name)) {
getter.set_is_reflectable(false);
}
- top_level->functions.Add(getter);
+ top_level->AddFunction(getter);
}
} else if (is_final) {
ReportError(name_pos, "missing initializer for final or const variable");
@@ -5575,7 +5608,7 @@ void Parser::ParseTopLevelFunction(TopLevel* top_level,
func.set_is_reflectable(false);
}
AddFormalParamsToFunction(&params, func);
- top_level->functions.Add(func);
+ top_level->AddFunction(func);
if (!is_patch) {
library_.AddObject(func, func_name);
} else {
@@ -5729,7 +5762,7 @@ void Parser::ParseTopLevelAccessor(TopLevel* top_level,
func.set_is_reflectable(false);
}
AddFormalParamsToFunction(&params, func);
- top_level->functions.Add(func);
+ top_level->AddFunction(func);
if (!is_patch) {
library_.AddObject(func, accessor_name);
} else {
@@ -6040,7 +6073,7 @@ void Parser::ParseTopLevel() {
GrowableObjectArray::Handle(Z, object_store->pending_classes());
SetPosition(0);
is_top_level_ = true;
- TopLevel top_level;
+ TopLevel top_level(Z);
Class& toplevel_class = Class::Handle(Z,
Class::New(Symbols::TopLevel(), script_, TokenPos()));
toplevel_class.set_library(library_);
@@ -6087,13 +6120,15 @@ void Parser::ParseTopLevel() {
}
if ((library_.num_anonymous_classes() == 0) ||
- (top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) {
- toplevel_class.AddFields(top_level.fields);
-
- const Array& array = Array::Handle(Z,
- Array::MakeArray(top_level.functions));
+ (top_level.fields().length() > 0) ||
+ (top_level.functions().length() > 0)) {
+ toplevel_class.AddFields(top_level.fields());
+ const intptr_t len = top_level.functions().length();
+ const Array& array = Array::Handle(Z, Array::New(len, Heap::kOld));
+ for (intptr_t i = 0; i < len; i++) {
+ array.SetAt(i, *top_level.functions()[i]);
+ }
toplevel_class.SetFunctions(array);
-
library_.AddAnonymousClass(toplevel_class);
pending_classes.Add(toplevel_class, Heap::kOld);
}
« 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