| Index: runtime/vm/dart_api_impl_test.cc
|
| diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
|
| index 34c5cb50e931f85b5964948e688e68997014f51c..162fdf6befa54593b6742cb6a62e62b915d726ce 100644
|
| --- a/runtime/vm/dart_api_impl_test.cc
|
| +++ b/runtime/vm/dart_api_impl_test.cc
|
| @@ -21,6 +21,7 @@ namespace dart {
|
|
|
| DECLARE_FLAG(int, optimization_counter_threshold);
|
| DECLARE_FLAG(bool, verify_acquired_data);
|
| +DECLARE_FLAG(bool, ignore_patch_signature_mismatch);
|
|
|
| TEST_CASE(ErrorHandleBasics) {
|
| const char* kScriptChars =
|
| @@ -6885,6 +6886,121 @@ TEST_CASE(LoadPatch) {
|
| EXPECT_EQ(42, value);
|
| }
|
|
|
| +TEST_CASE(LoadPatchSignatureMismatch) {
|
| + // This tests the sort of APIs with intentional signature mismatches we need
|
| + // for typed Dart-JavaScript interop where we emulated JavaScript semantics
|
| + // for optional arguments.
|
| + const char* kLibrary1Chars =
|
| + "library library1_name;";
|
| + const char* kSourceChars =
|
| + "part of library1_name;\n"
|
| + "external int foo([int x]);\n"
|
| + "class Foo {\n"
|
| + " external static int addDefault10([int x, int y]);\n"
|
| + "}";
|
| + const char* kPatchChars =
|
| + "const _UNDEFINED = const Object();\n"
|
| + "patch foo([x=_UNDEFINED]) => identical(x, _UNDEFINED) ? 42 : x;\n"
|
| + "patch class Foo {\n"
|
| + " static addDefault10([x=_UNDEFINED, y=_UNDEFINED]) {\n"
|
| + " if (identical(x, _UNDEFINED)) x = 10;\n"
|
| + " if (identical(y, _UNDEFINED)) y = 10;\n"
|
| + " return x + y;\n"
|
| + " }\n"
|
| + "}";
|
| +
|
| + bool old_flag_value = FLAG_ignore_patch_signature_mismatch;
|
| + FLAG_ignore_patch_signature_mismatch = true;
|
| +
|
| + // Load up a library.
|
| + Dart_Handle url = NewString("library1_url");
|
| + Dart_Handle source = NewString(kLibrary1Chars);
|
| + Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
|
| + EXPECT_VALID(lib);
|
| + EXPECT(Dart_IsLibrary(lib));
|
| +
|
| + url = NewString("source_url");
|
| + source = NewString(kSourceChars);
|
| +
|
| + Dart_Handle result = Dart_LoadSource(lib, url, source, 0, 0);
|
| + EXPECT_VALID(result);
|
| +
|
| + url = NewString("patch_url");
|
| + source = NewString(kPatchChars);
|
| +
|
| + result = Dart_LibraryLoadPatch(lib, url, source);
|
| + EXPECT_VALID(result);
|
| + result = Dart_FinalizeLoading(false);
|
| + EXPECT_VALID(result);
|
| +
|
| + // Test a top level method
|
| + {
|
| + result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
|
| + EXPECT_VALID(result);
|
| + EXPECT(Dart_IsInteger(result));
|
| + int64_t value = 0;
|
| + EXPECT_VALID(Dart_IntegerToInt64(result, &value));
|
| + EXPECT_EQ(42, value);
|
| + }
|
| +
|
| + {
|
| + Dart_Handle dart_args[1];
|
| + dart_args[0] = Dart_Null();
|
| + result = Dart_Invoke(lib, NewString("foo"), 1, dart_args);
|
| + EXPECT_VALID(result);
|
| + EXPECT(Dart_IsNull(result));
|
| + }
|
| +
|
| + {
|
| + Dart_Handle dart_args[1];
|
| + dart_args[0] = Dart_NewInteger(100);
|
| + result = Dart_Invoke(lib, NewString("foo"), 1, dart_args);
|
| + EXPECT_VALID(result);
|
| + EXPECT(Dart_IsInteger(result));
|
| + int64_t value = 0;
|
| + EXPECT_VALID(Dart_IntegerToInt64(result, &value));
|
| + EXPECT_EQ(100, value);
|
| + }
|
| +
|
| + // Test static method
|
| + Dart_Handle type = Dart_GetType(lib, NewString("Foo"), 0, NULL);
|
| + EXPECT_VALID(type);
|
| +
|
| + {
|
| + result = Dart_Invoke(type, NewString("addDefault10"), 0, NULL);
|
| + EXPECT_VALID(result);
|
| + EXPECT(Dart_IsInteger(result));
|
| + int64_t value = 0;
|
| + EXPECT_VALID(Dart_IntegerToInt64(result, &value));
|
| + EXPECT_EQ(20, value);
|
| + }
|
| +
|
| + {
|
| + Dart_Handle dart_args[1];
|
| + dart_args[0] = Dart_NewInteger(100);
|
| + result = Dart_Invoke(type, NewString("addDefault10"), 1, dart_args);
|
| + EXPECT_VALID(result);
|
| + EXPECT(Dart_IsInteger(result));
|
| + int64_t value = 0;
|
| + EXPECT_VALID(Dart_IntegerToInt64(result, &value));
|
| + EXPECT_EQ(110, value);
|
| + }
|
| +
|
| + {
|
| + Dart_Handle dart_args[2];
|
| + dart_args[0] = Dart_NewInteger(100);
|
| + dart_args[1] = Dart_NewInteger(100);
|
| + result = Dart_Invoke(type, NewString("addDefault10"), 2, dart_args);
|
| + EXPECT_VALID(result);
|
| + EXPECT(Dart_IsInteger(result));
|
| + int64_t value = 0;
|
| + EXPECT_VALID(Dart_IntegerToInt64(result, &value));
|
| + EXPECT_EQ(200, value);
|
| + }
|
| +
|
| + FLAG_ignore_patch_signature_mismatch = old_flag_value;
|
| +}
|
| +
|
|
|
| static void PatchNativeFunction(Dart_NativeArguments args) {
|
| Dart_EnterScope();
|
|
|