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

Unified Diff: runtime/vm/class_finalizer.cc

Issue 2153143002: Rework how enums are implemented and reloaded (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 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/lib/core_patch.dart ('k') | runtime/vm/isolate_reload.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/class_finalizer.cc
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 6554d233b1142f4a5a12f3cc9daf6d81ddaddcda..11913010355ecc8e544f456439aec306d589e34a 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -2521,12 +2521,15 @@ void ClassFinalizer::FinalizeClass(const Class& cls) {
// getter function object for each enumeration value and for the
// values field. We also don't have to generate the code for these getters
// from thin air (no source code is available).
-void ClassFinalizer::AllocateEnumValues(const Class &enum_cls) {
+void ClassFinalizer::AllocateEnumValues(const Class& enum_cls) {
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
const Field& index_field =
Field::Handle(zone, enum_cls.LookupInstanceField(Symbols::Index()));
ASSERT(!index_field.IsNull());
+ const Field& name_field = Field::Handle(zone,
+ enum_cls.LookupInstanceFieldAllowPrivate(Symbols::_name()));
+ ASSERT(!name_field.IsNull());
const Field& values_field =
Field::Handle(zone, enum_cls.LookupStaticField(Symbols::Values()));
ASSERT(!values_field.IsNull());
@@ -2539,6 +2542,11 @@ void ClassFinalizer::AllocateEnumValues(const Class &enum_cls) {
Instance& ordinal_value = Instance::Handle(zone);
Instance& enum_value = Instance::Handle(zone);
+ const String& enum_name = String::Handle(enum_cls.ScrubbedName());
+ const String& name_prefix =
+ String::Handle(String::Concat(enum_name, Symbols::Dot()));
+
+ String& enum_ident = String::Handle();
for (intptr_t i = 0; i < fields.Length(); i++) {
field = Field::RawCast(fields.At(i));
if (!field.is_static()) continue;
@@ -2547,8 +2555,18 @@ void ClassFinalizer::AllocateEnumValues(const Class &enum_cls) {
// contain the smi value of the ordinal number, which was stored in
// the field by the parser. Other fields contain non-smi values.
if (!ordinal_value.IsSmi()) continue;
+ enum_ident = field.name();
+ // Construct the string returned by toString.
+ ASSERT(!enum_ident.IsNull());
+ // 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_ident = Symbols::FromConcat(thread, name_prefix, enum_ident);
enum_value = Instance::New(enum_cls, Heap::kOld);
enum_value.SetField(index_field, ordinal_value);
+ enum_value.SetField(name_field, enum_ident);
const char* error_msg = "";
enum_value = enum_value.CheckAndCanonicalize(thread, &error_msg);
ASSERT(!enum_value.IsNull());
« no previous file with comments | « runtime/lib/core_patch.dart ('k') | runtime/vm/isolate_reload.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698