commit | 2742d90033d0f486217b19758a1436dcbe24b27b | [log] [tgz] |
---|---|---|
author | Zach Anderson <zra@google.com> | Fri Sep 30 21:51:59 2022 +0000 |
committer | Commit Queue <dart-scoped@luci-project-accounts.iam.gserviceaccount.com> | Fri Sep 30 21:51:59 2022 +0000 |
tree | a0109ebee55753ff631673d5c9c417fbe4a57a98 | |
parent | cb45aa8a939df848b738dd176a3af7cacce65b54 [diff] |
Revert "[vm/ffi] Throw on returning `Error` in `Handle`" This reverts commit d9c442bce8d13bb4db977e738d795b753ce84168. Reason for revert: https://github.com/flutter/flutter/issues/112726 Original change's description: > [vm/ffi] Throw on returning `Error` in `Handle` > > 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: Ie8fabeb6d53bc80689541bc4470cb37ee2200581 > 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/+/261603 > Reviewed-by: Ryan Macnak <rmacnak@google.com> > Reviewed-by: Martin Kustermann <kustermann@google.com> > Commit-Queue: Daco Harkes <dacoharkes@google.com> TBR=kustermann@google.com,rmacnak@google.com,dacoharkes@google.com,dart-scoped@luci-project-accounts.iam.gserviceaccount.com Change-Id: I94cc63de16b54db2b0a4f92759c39a1e569b8e63 No-Presubmit: true No-Tree-Checks: true No-Try: true 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/+/262270 Reviewed-by: Zach Anderson <zra@google.com> Reviewed-by: Liam Appelbe <liama@google.com> Commit-Queue: Zach Anderson <zra@google.com>
Dart is:
Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.
Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents on our wiki.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.