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

Unified Diff: runtime/vm/isolate_reload_test.cc

Issue 2489723003: Run field initializers for new instance fields after a reload (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/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

Powered by Google App Engine
This is Rietveld 408576698