@@ -6198,6 +6198,164 @@ TEST_CASE(IsolateReload_EnumInMainLibraryModified) {
6198
6198
EXPECT_STREQ (" foo" , SimpleInvokeStr (lib, " main" ));
6199
6199
}
6200
6200
6201
+ TEST_CASE (IsolateReload_KeepPragma1) {
6202
+ // Old version of closure function bar() has a pragma.
6203
+ const char * kScript =
6204
+ " import 'file:///test:isolate_reload_helper';\n "
6205
+ " foo() {\n "
6206
+ " @pragma('vm:prefer-inline')\n "
6207
+ " void bar() {}\n "
6208
+ " return bar;\n "
6209
+ " }"
6210
+ " main() {\n "
6211
+ " reloadTest();\n "
6212
+ " }\n " ;
6213
+
6214
+ Dart_Handle lib = TestCase::LoadTestScript (kScript , nullptr );
6215
+ EXPECT_VALID (lib);
6216
+
6217
+ // New version of closure function bar() doesn't have a pragma.
6218
+ const char * kReloadScript =
6219
+ " import 'file:///test:isolate_reload_helper';\n "
6220
+ " foo() {\n "
6221
+ " void bar() {}\n "
6222
+ " return bar;\n "
6223
+ " }"
6224
+ " main() {\n "
6225
+ " reloadTest();\n "
6226
+ " }\n " ;
6227
+
6228
+ EXPECT_VALID (TestCase::SetReloadTestScript (kReloadScript ));
6229
+
6230
+ Dart_Handle foo1_result = Dart_Invoke (lib, NewString (" foo" ), 0 , nullptr );
6231
+ EXPECT_VALID (foo1_result);
6232
+
6233
+ EXPECT_VALID (Dart_Invoke (lib, NewString (" main" ), 0 , nullptr ));
6234
+
6235
+ Dart_Handle foo2_result = Dart_Invoke (lib, NewString (" foo" ), 0 , nullptr );
6236
+ EXPECT_VALID (foo2_result);
6237
+
6238
+ TransitionNativeToVM transition (thread);
6239
+ const auto & bar1 = Function::Handle (
6240
+ Closure::Handle (Closure::RawCast (Api::UnwrapHandle (foo1_result)))
6241
+ .function ());
6242
+ const auto & bar2 = Function::Handle (
6243
+ Closure::Handle (Closure::RawCast (Api::UnwrapHandle (foo2_result)))
6244
+ .function ());
6245
+ // Pragma should be retained on the old function,
6246
+ // and should not appear on the new function.
6247
+ EXPECT (Library::FindPragma (thread, /* only_core=*/ false , bar1,
6248
+ Symbols::vm_prefer_inline ()));
6249
+ EXPECT (!Library::FindPragma (thread, /* only_core=*/ false , bar2,
6250
+ Symbols::vm_prefer_inline ()));
6251
+ }
6252
+
6253
+ TEST_CASE (IsolateReload_KeepPragma2) {
6254
+ // Old version of closure function bar() has a pragma.
6255
+ const char * kScript =
6256
+ " import 'file:///test:isolate_reload_helper';\n "
6257
+ " foo() {\n "
6258
+ " @pragma('vm:prefer-inline')\n "
6259
+ " void bar() {}\n "
6260
+ " return bar;\n "
6261
+ " }"
6262
+ " main() {\n "
6263
+ " reloadTest();\n "
6264
+ " }\n " ;
6265
+
6266
+ Dart_Handle lib = TestCase::LoadTestScript (kScript , nullptr );
6267
+ EXPECT_VALID (lib);
6268
+
6269
+ // New version of closure function bar() has a different pragma.
6270
+ const char * kReloadScript =
6271
+ " import 'file:///test:isolate_reload_helper';\n "
6272
+ " foo() {\n "
6273
+ " @pragma('vm:never-inline')\n "
6274
+ " void bar() {}\n "
6275
+ " return bar;\n "
6276
+ " }"
6277
+ " main() {\n "
6278
+ " reloadTest();\n "
6279
+ " }\n " ;
6280
+
6281
+ EXPECT_VALID (TestCase::SetReloadTestScript (kReloadScript ));
6282
+
6283
+ Dart_Handle foo1_result = Dart_Invoke (lib, NewString (" foo" ), 0 , nullptr );
6284
+ EXPECT_VALID (foo1_result);
6285
+
6286
+ EXPECT_VALID (Dart_Invoke (lib, NewString (" main" ), 0 , nullptr ));
6287
+
6288
+ Dart_Handle foo2_result = Dart_Invoke (lib, NewString (" foo" ), 0 , nullptr );
6289
+ EXPECT_VALID (foo2_result);
6290
+
6291
+ TransitionNativeToVM transition (thread);
6292
+ const auto & bar1 = Function::Handle (
6293
+ Closure::Handle (Closure::RawCast (Api::UnwrapHandle (foo1_result)))
6294
+ .function ());
6295
+ const auto & bar2 = Function::Handle (
6296
+ Closure::Handle (Closure::RawCast (Api::UnwrapHandle (foo2_result)))
6297
+ .function ());
6298
+ EXPECT (Library::FindPragma (thread, /* only_core=*/ false , bar1,
6299
+ Symbols::vm_prefer_inline ()));
6300
+ EXPECT (!Library::FindPragma (thread, /* only_core=*/ false , bar1,
6301
+ Symbols::vm_never_inline ()));
6302
+ EXPECT (!Library::FindPragma (thread, /* only_core=*/ false , bar2,
6303
+ Symbols::vm_prefer_inline ()));
6304
+ EXPECT (Library::FindPragma (thread, /* only_core=*/ false , bar2,
6305
+ Symbols::vm_never_inline ()));
6306
+ }
6307
+
6308
+ TEST_CASE (IsolateReload_KeepPragma3) {
6309
+ // Old version of closure function bar() doesn't have a pragma.
6310
+ const char * kScript =
6311
+ " import 'file:///test:isolate_reload_helper';\n "
6312
+ " foo() {\n "
6313
+ " void bar() {}\n "
6314
+ " return bar;\n "
6315
+ " }"
6316
+ " main() {\n "
6317
+ " reloadTest();\n "
6318
+ " }\n " ;
6319
+
6320
+ Dart_Handle lib = TestCase::LoadTestScript (kScript , nullptr );
6321
+ EXPECT_VALID (lib);
6322
+
6323
+ // New version of closure function bar() has a pragma.
6324
+ const char * kReloadScript =
6325
+ " import 'file:///test:isolate_reload_helper';\n "
6326
+ " foo() {\n "
6327
+ " @pragma('vm:never-inline')\n "
6328
+ " void bar() {}\n "
6329
+ " return bar;\n "
6330
+ " }"
6331
+ " main() {\n "
6332
+ " reloadTest();\n "
6333
+ " }\n " ;
6334
+
6335
+ EXPECT_VALID (TestCase::SetReloadTestScript (kReloadScript ));
6336
+
6337
+ Dart_Handle foo1_result = Dart_Invoke (lib, NewString (" foo" ), 0 , nullptr );
6338
+ EXPECT_VALID (foo1_result);
6339
+
6340
+ EXPECT_VALID (Dart_Invoke (lib, NewString (" main" ), 0 , nullptr ));
6341
+
6342
+ Dart_Handle foo2_result = Dart_Invoke (lib, NewString (" foo" ), 0 , nullptr );
6343
+ EXPECT_VALID (foo2_result);
6344
+
6345
+ TransitionNativeToVM transition (thread);
6346
+ const auto & bar1 = Function::Handle (
6347
+ Closure::Handle (Closure::RawCast (Api::UnwrapHandle (foo1_result)))
6348
+ .function ());
6349
+ const auto & bar2 = Function::Handle (
6350
+ Closure::Handle (Closure::RawCast (Api::UnwrapHandle (foo2_result)))
6351
+ .function ());
6352
+ EXPECT (Library::FindPragma (thread, /* only_core=*/ false , bar2,
6353
+ Symbols::vm_never_inline ()));
6354
+ // Should not appear on previous version of bar().
6355
+ EXPECT (!Library::FindPragma (thread, /* only_core=*/ false , bar1,
6356
+ Symbols::vm_never_inline ()));
6357
+ }
6358
+
6201
6359
#endif // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
6202
6360
6203
6361
} // namespace dart
0 commit comments