[VM] - Fix for issue 36484 exposed when ExperimentalFlag.constantUpdate2018 is turned on in CFE

When ExperimentalFlag.constantUpdate2018 is turned on the static const
fields of _LocalMethodMirror are not yet set when VerifyMethodKindShifts
is invoked, ensure these fields are initialized before verifying the
values against the C++ values.

Fixes https://github.com/dart-lang/sdk/issues/36484

Change-Id: Ia144ee88c0a946e2d8824a6ee0d32bf96b2c163f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/98962
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
This commit is contained in:
asiva 2019-04-09 18:12:27 +00:00 committed by commit-bot@chromium.org
parent a7175938c3
commit 78c55022b1

View file

@ -553,15 +553,22 @@ static void VerifyMethodKindShifts() {
const Library& lib = Library::Handle(zone, Library::MirrorsLibrary());
const Class& cls = Class::Handle(
zone, lib.LookupClassAllowPrivate(Symbols::_LocalMethodMirror()));
const Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread));
Error& error = Error::Handle(zone);
error ^= cls.EnsureIsFinalized(thread);
ASSERT(error.IsNull());
Field& field = Field::Handle();
Smi& value = Smi::Handle();
Field& field = Field::Handle(zone);
Smi& value = Smi::Handle(zone);
String& fname = String::Handle(zone);
#define CHECK_KIND_SHIFT(name) \
field = cls.LookupField(String::Handle(String::New(#name))); \
fname ^= String::New(#name); \
field = cls.LookupField(fname); \
ASSERT(!field.IsNull()); \
if (field.IsUninitialized()) { \
error ^= field.Initialize(); \
ASSERT(error.IsNull()); \
} \
value ^= field.StaticValue(); \
ASSERT(value.Value() == Mirrors::name);
MIRRORS_KIND_SHIFT_LIST(CHECK_KIND_SHIFT)