Chromium Code Reviews| Index: runtime/vm/isolate_reload_test.cc |
| diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc |
| index 7fabfe719dd568d53a927835db58e8c9541e5fa1..f5ae9f2c6c6d71c8ac45333cb4a11bfbdd46e403 100644 |
| --- a/runtime/vm/isolate_reload_test.cc |
| +++ b/runtime/vm/isolate_reload_test.cc |
| @@ -3129,6 +3129,116 @@ TEST_CASE(IsolateReload_ConstFieldUpdate) { |
| EXPECT_STREQ("value=0:00:02.000000", SimpleInvokeStr(lib, "main")); |
| } |
| + |
| +TEST_CASE(IsolateReload_RunNewFieldInitializers) { |
| + const char* kScript = |
| + "class Foo {\n" |
| + " int x = 4;\n" |
| + "}\n" |
| + "Foo value;\n" |
| + "main() {\n" |
| + " value = new Foo();\n" |
| + " return value.x;\n" |
| + "}\n"; |
| + |
| + Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| + EXPECT_VALID(lib); |
| + EXPECT_EQ(4, SimpleInvoke(lib, "main")); |
| + |
| + // Add the field y. |
| + const char* kReloadScript = |
| + "class Foo {\n" |
| + " int x = 4;\n" |
| + " int y = 7;\n" |
| + "}\n" |
| + "Foo value;\n" |
| + "main() {\n" |
| + " return value.y;\n" |
| + "}\n"; |
| + |
| + lib = TestCase::ReloadTestScript(kReloadScript); |
| + EXPECT_VALID(lib); |
| + // Verify that we ran field initializers on existing instances. |
| + EXPECT_EQ(7, SimpleInvoke(lib, "main")); |
| +} |
| + |
| + |
| +TEST_CASE(IsolateReload_RunNewFieldInitializersReferenceStaticField) { |
| + const char* kScript = |
| + "int myInitialValue = 8 * 7;\n" |
| + "class Foo {\n" |
| + " int x = 4;\n" |
| + "}\n" |
| + "Foo value;\n" |
| + "main() {\n" |
| + " value = new Foo();\n" |
| + " return value.x;\n" |
| + "}\n"; |
| + |
| + Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| + EXPECT_VALID(lib); |
| + EXPECT_EQ(4, SimpleInvoke(lib, "main")); |
| + |
| + // Add the field y. |
| + const char* kReloadScript = |
| + "int myInitialValue = 8 * 7;\n" |
| + "class Foo {\n" |
| + " int x = 4;\n" |
| + " int y = myInitialValue;\n" |
| + "}\n" |
| + "Foo value;\n" |
| + "main() {\n" |
| + " return value.y;\n" |
| + "}\n"; |
| + |
| + lib = TestCase::ReloadTestScript(kReloadScript); |
| + EXPECT_VALID(lib); |
| + // Verify that we ran field initializers on existing instances. |
| + EXPECT_EQ(56, SimpleInvoke(lib, "main")); |
| +} |
| + |
| + |
| +// The following test is expected to fail because of how we run the initializing |
| +// expression during reload compared to how it actually runs when the |
| +// constructor is invoked. |
|
rmacnak
2016/11/09 00:36:32
I don't see why this should fail. Static field acc
Cutch
2016/11/09 23:20:58
Fails because of an ordering bug in my CL. Works n
|
| +TEST_CASE(IsolateReload_RunNewFieldInitializersMutateStaticField) { |
| + const char* kScript = |
| + "int myInitialValue = 8 * 7;\n" |
| + "class Foo {\n" |
| + " int x = 4;\n" |
| + "}\n" |
| + "Foo value;\n" |
| + "Foo value1;\n" |
| + "main() {\n" |
| + " value = new Foo();\n" |
| + " value1 = new Foo();\n" |
| + " return value.x;\n" |
| + "}\n"; |
| + |
| + Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| + EXPECT_VALID(lib); |
| + EXPECT_EQ(4, SimpleInvoke(lib, "main")); |
| + |
| + // Add the field y. |
| + const char* kReloadScript = |
| + "int myInitialValue = 8 * 7;\n" |
| + "class Foo {\n" |
| + " int x = 4;\n" |
| + " int y = myInitialValue++;\n" |
| + "}\n" |
| + "Foo value;\n" |
| + "Foo value1;\n" |
| + "main() {\n" |
| + " new Foo();" |
| + " return myInitialValue;\n" |
| + "}\n"; |
| + |
| + lib = TestCase::ReloadTestScript(kReloadScript); |
| + EXPECT_VALID(lib); |
| + // Verify that we ran field initializers on existing instances and that |
| + // they affected the value of the field myInitialValue. |
| + EXPECT_EQ(59, SimpleInvoke(lib, "main")); |
| +} |
|
rmacnak
2016/11/09 00:36:32
Add a test where the new initializer throws.
Add
Cutch
2016/11/09 23:20:58
Done.
|
| #endif // !PRODUCT |
| } // namespace dart |