| 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(¶ms, 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(¶ms, 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);
|
| }
|
|
|