mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 00:13:50 +00:00
[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:
parent
68ba13e4e8
commit
edceedff90
|
@ -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());
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in a new issue