[vm, reload] Allow any change to a class that hasn't yet been declaration loaded.

Change-Id: I3da7a2f156e4b2cb1a60597d66f4514c1563785c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115560
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Ryan Macnak 2019-09-05 16:51:39 +00:00 committed by commit-bot@chromium.org
parent 68ba13e4e8
commit edceedff90
3 changed files with 11 additions and 4 deletions

View file

@ -1377,8 +1377,7 @@ static void RecordChanges(const GrowableObjectArray& changed_in_last_reload,
return;
}
ASSERT(new_cls.is_finalized() == old_cls.is_finalized());
if (!new_cls.is_finalized()) {
if (!old_cls.is_finalized()) {
if (new_cls.SourceFingerprint() == old_cls.SourceFingerprint()) {
return;
}
@ -1387,6 +1386,7 @@ static void RecordChanges(const GrowableObjectArray& changed_in_last_reload,
changed_in_last_reload.Add(new_cls);
return;
}
ASSERT(new_cls.is_finalized());
Zone* zone = Thread::Current()->zone();
const Array& functions = Array::Handle(zone, new_cls.functions());

View file

@ -2151,6 +2151,7 @@ TEST_CASE(IsolateReload_EnumToNotEnum) {
" final int zero = 0;\n"
"}\n"
"main() {\n"
" return new Fruit().zero.toString();\n"
"}\n";
Dart_Handle result = TestCase::ReloadTestScript(kReloadScript);
@ -2163,12 +2164,12 @@ TEST_CASE(IsolateReload_NotEnumToEnum) {
" final int zero = 0;\n"
"}\n"
"main() {\n"
" return 'yes';\n"
" return new Fruit().zero.toString();\n"
"}\n";
Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
EXPECT_VALID(lib);
EXPECT_STREQ("yes", SimpleInvokeStr(lib, "main"));
EXPECT_STREQ("0", SimpleInvokeStr(lib, "main"));
const char* kReloadScript =
"enum Fruit {\n"

View file

@ -693,6 +693,12 @@ void Class::CheckReload(const Class& replacement,
IsolateReloadContext* context) const {
ASSERT(IsolateReloadContext::IsSameClass(*this, replacement));
if (!is_declaration_loaded()) {
// The old class hasn't been used in any meanfully way, so the VM is okay
// with any change.
return;
}
// Ensure is_enum_class etc have been set.
replacement.EnsureDeclarationLoaded();