Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index 0af87671be370026a6a1c18eee55e597e8b9011d..146371844db2ed5c38f33a6eca464aff326248dc 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -4732,6 +4732,10 @@ void Parser::ParseEnumDefinition(const Class& cls) { |
TRACE_PARSER("ParseEnumDefinition"); |
INC_STAT(thread(), num_classes_parsed, 1); |
+ const Class& helper_class = |
+ Class::Handle(Z, Library::LookupCoreClass(Symbols::_EnumHelper())); |
+ ASSERT(!helper_class.IsNull()); |
+ |
SkipMetadata(); |
ExpectToken(Token::kENUM); |
@@ -4743,9 +4747,9 @@ void Parser::ParseEnumDefinition(const Class& cls) { |
const Type& int_type = Type::Handle(Z, Type::IntType()); |
index_field = Field::New(Symbols::Index(), |
false, // Not static. |
- true, // Field is final. |
+ true, // Field is final. |
false, // Not const. |
- true, // Is reflectable. |
+ true, // Is reflectable. |
cls, |
int_type, |
cls.token_pos()); |
@@ -4771,18 +4775,12 @@ void Parser::ParseEnumDefinition(const Class& cls) { |
AddFormalParamsToFunction(¶ms, getter); |
enum_members.AddFunction(getter); |
- GrowableObjectArray& enum_names = GrowableObjectArray::Handle(Z, |
- GrowableObjectArray::New(8, Heap::kOld)); |
- const String& name_prefix = |
- String::Handle(String::Concat(enum_name, Symbols::Dot())); |
- |
ASSERT(IsIdentifier()); |
ASSERT(CurrentLiteral()->raw() == cls.Name()); |
ConsumeToken(); // Enum type name. |
ExpectToken(Token::kLBRACE); |
Field& enum_value = Field::Handle(Z); |
- String& enum_value_name = String::Handle(Z); |
intptr_t i = 0; |
GrowableArray<String*> declared_names(8); |
@@ -4830,14 +4828,6 @@ void Parser::ParseEnumDefinition(const Class& cls) { |
enum_value.RecordStore(ordinal_value); |
i++; |
- // For the user-visible name of the enumeration value, we need to |
- // unmangle private names. |
- if (enum_ident->CharAt(0) == '_') { |
- *enum_ident = String::ScrubName(*enum_ident); |
- } |
- enum_value_name = Symbols::FromConcat(T, name_prefix, *enum_ident); |
- enum_names.Add(enum_value_name, Heap::kOld); |
- |
ConsumeToken(); // Enum value name. |
if (CurrentToken() == Token::kCOMMA) { |
ConsumeToken(); |
@@ -4845,10 +4835,6 @@ void Parser::ParseEnumDefinition(const Class& cls) { |
} |
ExpectToken(Token::kRBRACE); |
- const Class& helper_class = |
- Class::Handle(Z, Library::LookupCoreClass(Symbols::_EnumHelper())); |
- ASSERT(!helper_class.IsNull()); |
- |
// Add static field 'const List values'. |
Field& values_field = Field::ZoneHandle(Z); |
values_field = Field::New(Symbols::Values(), |
@@ -4867,16 +4853,35 @@ void Parser::ParseEnumDefinition(const Class& cls) { |
values_field.SetStaticValue(values_array, true); |
values_field.RecordStore(values_array); |
- // Create a static field that contains the list of enumeration names. |
- // Clone the _enum_names field from the helper class. |
- Field& names_field = Field::Handle(Z, |
- helper_class.LookupStaticFieldAllowPrivate(Symbols::_EnumNames())); |
- ASSERT(!names_field.IsNull()); |
- names_field = names_field.Clone(cls); |
- enum_members.AddField(names_field); |
- const Array& names_array = Array::Handle(Array::MakeArray(enum_names)); |
- names_field.SetStaticValue(names_array, true); |
- names_field.RecordStore(names_array); |
+ // Clone the _name field from the helper class. |
+ Field& _name_field = Field::Handle(Z, |
+ helper_class.LookupInstanceFieldAllowPrivate(Symbols::_name())); |
+ ASSERT(!_name_field.IsNull()); |
+ _name_field = _name_field.Clone(cls); |
+ enum_members.AddField(_name_field); |
+ |
+ // Add an implicit getter function for the _name field. We use the field's |
+ // name directly here so that the private key matches those of the other |
+ // cloned helper functions and fields. |
+ const Type& string_type = Type::Handle(Z, Type::StringType()); |
+ const String& name_getter_name = String::Handle(Z, |
+ Field::GetterSymbol(String::Handle(_name_field.name()))); |
+ Function& name_getter = Function::Handle(Z); |
+ name_getter = Function::New(name_getter_name, |
+ RawFunction::kImplicitGetter, |
+ /* is_static = */ false, |
+ /* is_const = */ true, |
+ /* is_abstract = */ false, |
+ /* is_external = */ false, |
+ /* is_native = */ false, |
+ cls, |
+ cls.token_pos()); |
+ name_getter.set_result_type(string_type); |
+ name_getter.set_is_debuggable(false); |
+ ParamList name_params; |
+ name_params.AddReceiver(&Object::dynamic_type(), cls.token_pos()); |
+ AddFormalParamsToFunction(&name_params, name_getter); |
+ enum_members.AddFunction(name_getter); |
// Clone the toString() function from the helper class. |
Function& to_string_func = Function::Handle(Z, |