| 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 0f8995254df1898bcb06d2a46c531e6ddc325103..9feeea4f995accda741e989c0e9a2aeb5380dff9 100644
|
| --- a/runtime/vm/dart_api_impl_test.cc
|
| +++ b/runtime/vm/dart_api_impl_test.cc
|
| @@ -500,15 +500,29 @@ TEST_CASE(UnhandleExceptionError) {
|
| }
|
|
|
|
|
| +// Should we propagate the error via Dart_SetReturnValue?
|
| +static bool use_set_return = false;
|
| +
|
| +// Should we propagate the error via Dart_ThrowException?
|
| +static bool use_throw_exception = false;
|
| +
|
| +
|
| void PropagateErrorNative(Dart_NativeArguments args) {
|
| - Dart_EnterScope();
|
| Dart_Handle closure = Dart_GetNativeArgument(args, 0);
|
| EXPECT(Dart_IsClosure(closure));
|
| Dart_Handle result = Dart_InvokeClosure(closure, 0, NULL);
|
| EXPECT(Dart_IsError(result));
|
| - result = Dart_PropagateError(result);
|
| - EXPECT_VALID(result); // We do not expect to reach here.
|
| - UNREACHABLE();
|
| + if (use_set_return) {
|
| + Dart_SetReturnValue(args, result);
|
| + } else if (use_throw_exception) {
|
| + result = Dart_ThrowException(result);
|
| + EXPECT_VALID(result); // We do not expect to reach here.
|
| + UNREACHABLE();
|
| + } else {
|
| + result = Dart_PropagateError(result);
|
| + EXPECT_VALID(result); // We do not expect to reach here.
|
| + UNREACHABLE();
|
| + }
|
| }
|
|
|
|
|
| @@ -543,6 +557,38 @@ TEST_CASE(Dart_PropagateError) {
|
| kScriptChars, &PropagateError_native_lookup);
|
| Dart_Handle result;
|
|
|
| + // Use Dart_PropagateError to propagate the error.
|
| + use_throw_exception = false;
|
| + use_set_return = false;
|
| +
|
| + result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(!Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
|
| +
|
| + result = Dart_Invoke(lib, NewString("Func2"), 0, NULL);
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("myException", Dart_GetError(result));
|
| +
|
| + // Use Dart_SetReturnValue to propagate the error.
|
| + use_throw_exception = false;
|
| + use_set_return = true;
|
| +
|
| + result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(!Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
|
| +
|
| + result = Dart_Invoke(lib, NewString("Func2"), 0, NULL);
|
| + EXPECT(Dart_IsError(result));
|
| + EXPECT(Dart_ErrorHasException(result));
|
| + EXPECT_SUBSTRING("myException", Dart_GetError(result));
|
| +
|
| + // Use Dart_ThrowException to propagate the error.
|
| + use_throw_exception = true;
|
| + use_set_return = false;
|
| +
|
| result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
|
| EXPECT(Dart_IsError(result));
|
| EXPECT(!Dart_ErrorHasException(result));
|
|
|