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

Unified Diff: runtime/vm/class_finalizer.cc

Issue 2498863002: Map deleted enum values to a sentinel value. (Closed)
Patch Set: Created 4 years, 1 month 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
Index: runtime/vm/class_finalizer.cc
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 98d74ff073efddae795a4921b18cbceedb87f616..d5f3d5688f56e0e38af6d1c195a53448e1e20ba1 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -2478,16 +2478,34 @@ void ClassFinalizer::AllocateEnumValues(const Class& enum_cls) {
ASSERT(Instance::Handle(zone, values_field.StaticValue()).IsArray());
Array& values_list =
Array::Handle(zone, Array::RawCast(values_field.StaticValue()));
+ const String& enum_name = String::Handle(enum_cls.ScrubbedName());
+ const String& name_prefix =
+ String::Handle(String::Concat(enum_name, Symbols::Dot()));
+
+ const String& deleted_enum_senintel_name = String::Handle(
+ zone,
+ Symbols::FromConcat(thread, Symbols::_DeletedEnumPrefix(), enum_name));
+ Instance& deleted_enum_sentinel_value =
+ Instance::Handle(zone, Instance::New(enum_cls, Heap::kOld));
+ deleted_enum_sentinel_value.SetField(index_field,
+ Smi::Handle(zone, Smi::New(-1)));
+ deleted_enum_sentinel_value.SetField(name_field, deleted_enum_senintel_name);
+ const char* error_msg = NULL;
+ deleted_enum_sentinel_value =
+ deleted_enum_sentinel_value.CheckAndCanonicalize(thread, &error_msg);
+ ASSERT(!deleted_enum_sentinel_value.IsNull());
+ ASSERT(deleted_enum_sentinel_value.IsCanonical());
+ const Field& deleted_enum_field = Field::Handle(
+ zone, enum_cls.LookupStaticField(Symbols::_DeletedEnumSentinel()));
+ ASSERT(!deleted_enum_field.IsNull());
+ deleted_enum_field.SetStaticValue(deleted_enum_sentinel_value, true);
+ deleted_enum_field.RecordStore(deleted_enum_sentinel_value);
const Array& fields = Array::Handle(zone, enum_cls.fields());
Field& field = Field::Handle(zone);
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();
siva 2016/11/14 22:18:23 A samll nit, the same handles created here field,
Cutch 2016/11/15 22:13:55 Done.
for (intptr_t i = 0; i < fields.Length(); i++) {
field = Field::RawCast(fields.At(i));
@@ -2509,7 +2527,6 @@ void ClassFinalizer::AllocateEnumValues(const Class& enum_cls) {
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());
ASSERT(enum_value.IsCanonical());
@@ -2520,7 +2537,6 @@ void ClassFinalizer::AllocateEnumValues(const Class& enum_cls) {
values_list.SetAt(ord, enum_value);
}
values_list.MakeImmutable();
- const char* error_msg = NULL;
values_list ^= values_list.CheckAndCanonicalize(thread, &error_msg);
ASSERT(!values_list.IsNull());
}

Powered by Google App Engine
This is Rietveld 408576698