commit | 1ac77f57ddc843de1d8fce3aaac94c72243039e9 | [log] [tgz] |
---|---|---|
author | Tess Strickland <sstrickl@google.com> | Fri Jan 24 03:21:22 2025 -0800 |
committer | Commit Queue <dart-scoped@luci-project-accounts.iam.gserviceaccount.com> | Fri Jan 24 03:21:22 2025 -0800 |
tree | 9945071f7426b84c22a88bbec344573225f88bff | |
parent | 862ca5b12e13d38362815918a9d51cfba5083b6e [diff] |
[vm] Align entry point verification and the precompiler. For entry-point pragma annotations, most of the time they are used with either no argument or with an argument that evaluates to either * false to denote the annotation should not take effect, or * null or true to denote the annotation should take effect. However, the user can also specify that only part of the operations on a member should be accessed from native code by using a string argument that is either 'call', 'set', or 'get'. The entry point verification in Invoke/InvokeGetter/InvokeSetter assumes that for getters and setters, the only valid string argument is 'get' or 'set', respectively. This is because those methods are called via `Dart_GetField`[0] and `Dart_SetField`, respectively, as if they were the getter or setter of a defined field. However, the precompiler previously assumed that the string argument 'call' was the only string argument that meant the link to a function's code object should be saved. Similarly, it assumed the string argument 'get' for functions meant that their implicit closure function should be saved, which ends up including getters. Furthermore, it did not do anything with setters annotated with the string argument 'set'. This means that the code link would not be saved for getters or setters that were annotated with the string argument expected by the entry point verifier. This CL aligns the precompiler to match the expectations of other parts of the codebase. It also changes TFA to report an error if a getter or setter is marked with the string argument 'call'. [0] `Dart_Invoke` can be called with the name of a getter that returns a closure, but doing so is semantically equivalent to calling `Dart_GetField` followed by `Dart_InvokeClosure`. TEST=vm/dart/entrypoint_verification_test Fixes: https://github.com/dart-lang/sdk/issues/59920 Change-Id: Ia2768bbaf9058bb14a1cdfb331eb85fa082a0e90 Cq-Include-Trybots: luci.dart.try:vm-aot-dwarf-linux-product-x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-product-x64-try,vm-aot-mac-product-arm64-try,vm-aot-obfuscate-linux-release-x64-try,vm-linux-debug-x64-try,vm-linux-release-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/404823 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
Dart is:
Approachable: Develop with a strongly typed programming language that is consistent, concise, and offers modern language features like null safety and patterns.
Portable: Compile to ARM, x64, or RISC-V machine code for mobile, desktop, and backend. Compile to JavaScript or WebAssembly for the web.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app. Diagnose app issues using DevTools.
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 in our repo at docs.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.
Future plans for Dart are included in the combined Dart and Flutter roadmap on the Flutter wiki.