dart-sdk/tests/ffi_2
Daco Harkes b113fffb65 Reland "[vm/ffi] Throw on returning Error in Handle"
Fix: Check handle contents for Smi.
Closes: https://github.com/flutter/flutter/issues/112726

Orignal CL description:

Makes `Dart_Handle` FFI returns behave as the following snippet:

```
Dart_Handle ExampleSnippet() {
  Dart_Handle result = ...;
  if (Dart_IsError(result)) {
    Dart_PropagateError(result);
  }
  return result;
}
```

Also makes FFI consistent with Dart_NativeFunctions, which will
automatically throw upon return if Dart_SetReturnValue set the result
to an error.

`UnhandledExceptions` cannot flow out into Dart generated code. So,
the implementation needs to be in `FfiCallInstr::EmitNativeCode`.

Using `Dart_IsError` is slow compared to a machine code class id
check. So, we should do the handle unwrapping and class id check in
machine code.

Unwrapping Handles in machine code is only safe when the GC is
guaranteed to not run: Either (1) in `kThreadInGenerated`, or (2) in
`kThreadInNative`, but only when transitioned into safepoint. So, the
handle cannot be unwrapped immediately after the FFI call in machine code. We first need to transition back to generated.

This means we need to transition again to native to do the actual
`Dart_PropagateError` call. We can do so without the stub in JIT
because we never return with normal control flow.

Performance impact of this change is within benchmark noise in both
JIT and AOT.
Size impact is 42 bytes on x64, which is 10% in AOT and 12% in JIT.

For more numbers see: go/dart-ffi-handle-error

TEST=runtime/bin/ffi_test/ffi_test_functions_vmspecific.cc
TEST=tests/ffi/vmspecific_handle_test.dart

Closes: https://github.com/dart-lang/sdk/issues/49936
Change-Id: Id8edfd841a7d6246438386007d83747868a0a151
Cq-Include-Trybots: luci.dart.try:vm-canary-linux-debug-try,vm-ffi-android-debug-arm64c-try,vm-ffi-android-debug-arm-try,vm-kernel-gcc-linux-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-x64c-try,vm-kernel-msvc-windows-try,vm-kernel-optcounter-threshold-linux-release-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-tsan-linux-release-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-precomp-ffi-qemu-linux-release-riscv64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-mac-release-arm64-try,vm-kernel-precomp-win-debug-x64c-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/262342
Reviewed-by: Martin Kustermann <kustermann@google.com>
Auto-Submit: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2022-10-03 12:25:08 +00:00
..
abi_specific_int_incomplete_aot_test.dart [vm/ffi] ABI-specific integers 2021-12-16 22:07:00 +00:00
abi_specific_int_incomplete_jit_test.dart [vm/ffi] ABI-specific integers 2021-12-16 22:07:00 +00:00
abi_specific_int_test.dart Reland "[vm/ffi] Add common C types" 2022-01-27 13:09:01 +00:00
abi_test.dart [vm/ffi] Introduce Abi 2021-12-01 19:19:37 +00:00
aliasing_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
all_positive.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
allocator_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
analysis_options.yaml
bool_test.dart [vm/ffi] Add Bool 2021-10-18 10:44:11 +00:00
c_types_test.dart [vm/ffi] Add Char C type 2022-03-28 09:46:56 +00:00
callback_tests_utils.dart [VM/FFI] Adds FFI leaf calls. 2021-05-21 11:12:02 +00:00
calloc_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
coordinate.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
data_not_asan_test.dart [deps] Roll package:ffi to 2.0.1 2022-06-19 18:29:11 +00:00
data_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
dylib_isolates_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
dylib_utils.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
expando_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
extension_methods_test.dart [ffi] Add .ref= setter for pointers of structs or unions 2022-01-12 20:48:28 +00:00
external_typed_data_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
ffi_2.status [vm, compiler] Inform MSan about parameters coming from FFI. 2022-09-23 21:31:14 +00:00
ffi_test_helpers.dart [vm] Implement NativeFinalizer 2022-03-26 09:41:21 +00:00
function_callbacks_many_test.dart [vm] Removes FLAG_enable_testing_pragmas from native_api_impl 2021-05-21 07:04:37 +00:00
function_callbacks_structs_by_value_generated_test.dart Reland "[vm/ffi] Add common C types" 2022-01-27 13:09:01 +00:00
function_callbacks_structs_by_value_test.dart [test/ffi] Split generated files on isLeaf 2021-10-14 13:05:33 +00:00
function_callbacks_test.dart [vm] Support serialization of FFI callbacks in IL serialization 2022-08-26 17:37:21 +00:00
function_callbacks_very_many_test.dart [vm] Removes FLAG_enable_testing_pragmas from native_api_impl 2021-05-21 07:04:37 +00:00
function_structs_by_value_generated_compounds.dart Reland "[vm/ffi] Add common C types" 2022-01-27 13:09:01 +00:00
function_structs_by_value_generated_leaf_test.dart Reland "[vm/ffi] Add common C types" 2022-01-27 13:09:01 +00:00
function_structs_by_value_generated_test.dart Reland "[vm/ffi] Add common C types" 2022-01-27 13:09:01 +00:00
function_structs_test.dart Fixed various typos in a lot of files 2022-07-25 12:21:59 +00:00
function_test.dart [vm/ffi] Adds param number in trampoline null error 2021-09-04 07:22:03 +00:00
function_very_many_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
hardfp_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
has_symbol_test.dart [vm/ffi] Support DynamicLibrary.process() on Windows 2022-09-27 08:42:03 +00:00
inline_array_multi_dimensional_test.dart [test/ffi] Split generated files on isLeaf 2021-10-14 13:05:33 +00:00
inline_array_test.dart [test/ffi] Split generated files on isLeaf 2021-10-14 13:05:33 +00:00
native_effect_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
negative_function_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
null_regress_39068_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
null_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
prepare_flutter_bundle.dart [misc] Cleanup stale todos 2022-06-28 16:02:53 +00:00
regress_37254_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_39044_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_39063_test.dart [test/ffi] Fix errors in tests 2021-09-28 13:17:01 +00:00
regress_39885_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_40537_test.dart Fixed various typos in a lot of files 2022-07-25 12:21:59 +00:00
regress_43016_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_43693_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_44985_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_44986_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_45189_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_45198_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_45507_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_45988_test.dart [testing] Rely on language versions in the analyzer tests 2021-06-02 07:47:46 +00:00
regress_46004_test.dart [testing] Rely on language versions in the analyzer tests 2021-06-02 07:47:46 +00:00
regress_46085_test.dart [testing] Rely on language versions in the analyzer tests 2021-06-02 07:47:46 +00:00
regress_46127_test.dart [testing] Rely on language versions in the analyzer tests 2021-06-02 07:47:46 +00:00
regress_47594_test.dart [vm/ffi] Adds transition information to FFI leaf calls. 2021-11-29 10:12:36 +00:00
regress_47673_2_test.dart [cfe/ffi] Handle invalid types in Array 2021-11-19 13:38:47 +00:00
regress_47673_test.dart [cfe/ffi] Handle invalid types in Array 2021-11-19 13:38:47 +00:00
regress_49402_test.dart [vm/ffi] Fix constant Finalizables 2022-07-07 08:39:21 +00:00
regress_flutter79441_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
regress_flutter97301_test.dart [vm/test] Fix memory leak in ffi/regress_flutter97301_test 2022-02-03 00:28:55 +00:00
regress_jump_to_frame_test.dart [vm] Removes FLAG_enable_testing_pragmas from native_api_impl 2021-05-21 07:04:37 +00:00
sizeof_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
snapshot_test.dart [vm/concurrency] Remove --(no-)enable-isolate-groups flag usage in tests 2021-11-04 18:57:21 +00:00
stacktrace_regress_37910_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
structs_nested_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
structs_packed_test.dart [test/ffi] Split generated files on isLeaf 2021-10-14 13:05:33 +00:00
structs_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
unaligned_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
variance_function_test.dart Fix typos 2022-09-16 19:35:00 +00:00
very_large_struct.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_dynamic_library_test.dart [vm/ffi] Support DynamicLibrary.process() on Windows 2022-09-27 08:42:03 +00:00
vmspecific_enable_ffi_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_function_callbacks_exit_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_function_callbacks_negative_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_function_callbacks_test.dart [vm/concurrency] Remove --(no-)enable-isolate-groups flag usage in tests 2021-11-04 18:57:21 +00:00
vmspecific_function_gc_test.dart [vm] Removes FLAG_enable_testing_pragmas from native_api_impl 2021-05-21 07:04:37 +00:00
vmspecific_function_test.dart [test/ffi] Fix errors in tests 2021-09-28 13:17:01 +00:00
vmspecific_handle_dynamically_linked_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_handle_test.dart Reland "[vm/ffi] Throw on returning Error in Handle" 2022-10-03 12:25:08 +00:00
vmspecific_highmem_32bit_test.dart [test/ffi] Fix errors in tests 2021-09-28 13:17:01 +00:00
vmspecific_leaf_call_test.dart [test/ffi] Fix errors in tests 2021-09-28 13:17:01 +00:00
vmspecific_native_finalizer_2_test.dart [vm] Implement NativeFinalizer 2022-03-26 09:41:21 +00:00
vmspecific_native_finalizer_isolate_groups_test.dart [vm] Implement NativeFinalizer 2022-03-26 09:41:21 +00:00
vmspecific_native_finalizer_isolates_test.dart [vm] Implement NativeFinalizer 2022-03-26 09:41:21 +00:00
vmspecific_native_finalizer_test.dart [vm] Implement NativeFinalizer 2022-03-26 09:41:21 +00:00
vmspecific_null_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_object_gc_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_regress_37100_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_regress_37511_callbacks_test.dart [vm] Removes FLAG_enable_testing_pragmas from native_api_impl 2021-05-21 07:04:37 +00:00
vmspecific_regress_37511_test.dart [vm] Removes FLAG_enable_testing_pragmas from native_api_impl 2021-05-21 07:04:37 +00:00
vmspecific_regress_37780_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_regress_38993_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_send_port_id_test.dart Add language versions to _2 test libraries 2021-04-26 17:58:57 +00:00
vmspecific_static_checks_test.dart [misc] Cleanup stale todos 2022-06-28 16:02:53 +00:00
vmspecific_variance_function_checks_test.dart Fix typos 2022-09-16 19:35:00 +00:00