Index: runtime/vm/isolate_reload_test.cc |
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc |
index 070897e498c5f13bf166782064c8cb10430ae70e..b6a6c98ac0bb108fa48ecb9fbc435f427653e890 100644 |
--- a/runtime/vm/isolate_reload_test.cc |
+++ b/runtime/vm/isolate_reload_test.cc |
@@ -1487,6 +1487,354 @@ TEST_CASE(IsolateReload_TearOff_List_Set) { |
} |
+TEST_CASE(IsolateReload_DanglingGetter_Instance) { |
+ const char* kScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " var x = 3;\n" |
+ " var y = 4;\n" |
+ "}\n" |
+ "invoke(f) {\n" |
+ " try {\n" |
+ " return f();\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " var c = new C();\n" |
+ " var f = c#y;\n" |
+ " var r1 = invoke(f);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
+ EXPECT_VALID(lib); |
+ |
+ const char* kReloadScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " var x = 3;\n" |
+ "}\n" |
+ "invoke(f) {\n" |
+ " try {\n" |
+ " return f();\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " var c = new C();\n" |
+ " var f = c#y;\n" |
+ " var r1 = invoke(f);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ TestCase::SetReloadTestScript(kReloadScript); |
+ |
+ EXPECT_STREQ("4 Class 'C' has no instance getter 'y'.", |
+ SimpleInvokeStr(lib, "main")); |
+ |
+ lib = TestCase::GetReloadErrorOrRootLibrary(); |
+ EXPECT_VALID(lib); |
+} |
+ |
+ |
+TEST_CASE(IsolateReload_DanglingGetter_Class) { |
+ const char* kScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " static var x;\n" |
+ " static var y;\n" |
+ "}\n" |
+ "invoke(f) {\n" |
+ " try {\n" |
+ " return f();\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " C.x = 3;\n" |
+ " C.y = 4;\n" |
+ " var f = C#y;\n" |
+ " var r1 = invoke(f);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
+ EXPECT_VALID(lib); |
+ |
+ const char* kReloadScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " static var x;\n" |
+ "}\n" |
+ "invoke(f) {\n" |
+ " try {\n" |
+ " return f();\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " C.x = 3;\n" |
+ " C.y = 4;\n" |
+ " var f = C#y;\n" |
+ " var r1 = invoke(f);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ TestCase::SetReloadTestScript(kReloadScript); |
+ |
+ EXPECT_STREQ("4 No static getter 'y' declared in class 'C'.", |
+ SimpleInvokeStr(lib, "main")); |
+ |
+ lib = TestCase::GetReloadErrorOrRootLibrary(); |
+ EXPECT_VALID(lib); |
+} |
+ |
+ |
+static void IsolateReload_DanlingGetter_LibraryReload( |
+ Dart_NativeArguments native_args) { |
+ const char* kImportScript2 = |
+ "var x;\n"; |
+ TestCase::AddTestLib("test:other", kImportScript2); |
+ |
+ DART_CHECK_VALID(TestCase::TriggerReload()); |
+} |
+ |
+ |
+static Dart_NativeFunction IsolateReload_DanlingGetter_LibraryNativeResolver( |
+ Dart_Handle name, |
+ int num_of_arguments, |
+ bool* auto_setup_scope) { |
+ return IsolateReload_DanlingGetter_LibraryReload; |
+} |
+ |
+ |
+TEST_CASE(IsolateReload_DanglingGetter_Library) { |
+ const char* kImportScript = |
+ "var x;\n" |
+ "var y;\n"; |
+ TestCase::AddTestLib("test:other", kImportScript); |
+ |
+ const char* kScript = |
+ "import 'test:other' as prefix;\n" |
+ "reloadTest() native 'ReloadTest';\n" |
+ "invoke(f) {\n" |
+ " try {\n" |
+ " return f();\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " prefix.x = 3;\n" |
+ " prefix.y = 4;\n" |
+ " var f = prefix#y;\n" |
+ " var r1 = invoke(f);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript( |
+ kScript, IsolateReload_DanlingGetter_LibraryNativeResolver); |
+ EXPECT_VALID(lib); |
+ |
+ TestCase::SetReloadTestScript(kScript); // Root library does not change. |
+ |
+ EXPECT_STREQ("4 No top-level getter 'y' declared.", |
+ SimpleInvokeStr(lib, "main")); |
+ |
+ lib = TestCase::GetReloadErrorOrRootLibrary(); |
+ EXPECT_VALID(lib); |
+} |
+ |
+ |
+TEST_CASE(IsolateReload_DanglingSetter_Instance) { |
+ const char* kScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " var x = 3;\n" |
+ " var y = 4;\n" |
+ "}\n" |
+ "invoke(f, a) {\n" |
+ " try {\n" |
+ " return f(a);\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " var c = new C();\n" |
+ " var f = c#y=;\n" |
+ " var r1 = invoke(f, 5);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f, 6);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
+ EXPECT_VALID(lib); |
+ |
+ const char* kReloadScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " var x = 3;\n" |
+ "}\n" |
+ "invoke(f, a) {\n" |
+ " try {\n" |
+ " return f(a);\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " var c = new C();\n" |
+ " var f = c#y=;\n" |
+ " var r1 = invoke(f, 5);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f, 6);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ TestCase::SetReloadTestScript(kReloadScript); |
+ |
+ EXPECT_STREQ("null Class 'C' has no instance setter 'y='.", |
+ SimpleInvokeStr(lib, "main")); |
+ |
+ lib = TestCase::GetReloadErrorOrRootLibrary(); |
+ EXPECT_VALID(lib); |
+} |
+ |
+ |
+TEST_CASE(IsolateReload_DanglingSetter_Class) { |
+ const char* kScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " static var x;\n" |
+ " static var y;\n" |
+ "}\n" |
+ "invoke(f, a) {\n" |
+ " try {\n" |
+ " return f(a);\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " C.x = 3;\n" |
+ " C.y = 4;\n" |
+ " var f = C#y=;\n" |
+ " var r1 = invoke(f, 5);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f, 6);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
+ EXPECT_VALID(lib); |
+ |
+ const char* kReloadScript = |
+ "import 'test:isolate_reload_helper';\n" |
+ "class C {\n" |
+ " static var x;\n" |
+ "}\n" |
+ "invoke(f, a) {\n" |
+ " try {\n" |
+ " return f(a);\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " C.x = 3;\n" |
+ " C.y = 4;\n" |
+ " var f = C#y=;\n" |
+ " var r1 = invoke(f, 5);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f, 6);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ TestCase::SetReloadTestScript(kReloadScript); |
+ |
+ EXPECT_STREQ("5 No static setter 'y=' declared in class 'C'.", |
+ SimpleInvokeStr(lib, "main")); |
+ |
+ lib = TestCase::GetReloadErrorOrRootLibrary(); |
+ EXPECT_VALID(lib); |
+} |
+ |
+ |
+static void IsolateReload_DanlingSetter_LibraryReload( |
+ Dart_NativeArguments native_args) { |
+ const char* kImportScript2 = |
+ "var x;\n"; |
+ TestCase::AddTestLib("test:other", kImportScript2); |
+ |
+ DART_CHECK_VALID(TestCase::TriggerReload()); |
+} |
+ |
+ |
+static Dart_NativeFunction IsolateReload_DanlingSetter_LibraryNativeResolver( |
+ Dart_Handle name, |
+ int num_of_arguments, |
+ bool* auto_setup_scope) { |
+ return IsolateReload_DanlingSetter_LibraryReload; |
+} |
+ |
+ |
+TEST_CASE(IsolateReload_DanglingSetter_Library) { |
+ const char* kImportScript = |
+ "var x;\n" |
+ "var y;\n"; |
+ TestCase::AddTestLib("test:other", kImportScript); |
+ |
+ const char* kScript = |
+ "import 'test:other' as prefix;\n" |
+ "reloadTest() native 'ReloadTest';\n" |
+ "invoke(f, a) {\n" |
+ " try {\n" |
+ " return f(a);\n" |
+ " } catch (e) {\n" |
+ " return e.toString().split('\\n').first;\n" |
+ " }\n" |
+ "}\n" |
+ "main() {\n" |
+ " prefix.x = 3;\n" |
+ " prefix.y = 4;\n" |
+ " var f = prefix#y=;\n" |
+ " var r1 = invoke(f, 5);\n" |
+ " reloadTest();\n" |
+ " var r2 = invoke(f, 6);\n" |
+ " return '$r1 $r2';\n" |
+ "}\n"; |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript( |
+ kScript, IsolateReload_DanlingSetter_LibraryNativeResolver); |
+ EXPECT_VALID(lib); |
+ |
+ TestCase::SetReloadTestScript(kScript); // Root library does not change. |
+ |
+ EXPECT_STREQ("5 No top-level setter 'y=' declared.", |
+ SimpleInvokeStr(lib, "main")); |
+ |
+ lib = TestCase::GetReloadErrorOrRootLibrary(); |
+ EXPECT_VALID(lib); |
+} |
+ |
+ |
TEST_CASE(IsolateReload_EnumEquality) { |
const char* kScript = |
"enum Fruit {\n" |