blob: 4ab2356ccc66963ae8d3fd77e836e99c14e82685 [file] [log] [blame] [view]
# Entry points file format
Dart VM precompiler (AOT compiler) performs whole-program optimizations such as
tree shaking in order to decrease size of the resulting compiled apps and
improve their performance. Such optimizations assume that compiler can see
the whole Dart program, and is able to discover and analyze all Dart functions
and members which can be potentially executed at run time. While the Dart code
is fully available for precompiler, native code of the embedder and native
methods are out of reach of the compiler. Such native code can call back to
Dart via native Dart API.
In order to aid precompiler, programmer can explicitly list entry
points (roots) - Dart classes and members which are accessed from native code.
Note that listing entry points is not optional: as long as program defines
native methods which call into Dart, the entry points are required for the
correctness of compilation.
This memo describes _new_ format of entry points file, which is intended to
replace old comma-separated lists of entry points. At the time of writing,
new format is not fully adopted yet.
The native entry points are described in a JSON text file. The descriptor has the form
```json
{
"roots": [
<root1>,
...
<rootN>
],
“native-methods”: {
“<native1_name>” : [
<native1_root1>,
...
<native1_rootM1>,
],
...
“<nativeK_name>” : [
<nativeK_root1>,
...
<nativeK_rootMK>,
]
}
```
## "roots" element
The roots element describes entry points which can be accessed by arbitrary native code.
Each root has the following elements:
```json
{
"library": "<library URI>",
"class": "<class name>",
"name": "<member name>",
"action": "<action>"
}
```
| Element | Meaning | Can be omitted |
| ------- | ----------------------------------------- | ---------------------------------- |
| library | Library URI of the entry point. | No. |
| class | Dart class name. | Omitted for top-level functions. |
| name | Dart function name or member name. | Omitted for class-related actions. |
| action | Specifies kind of the entry point access. | Depends on the entry point. |
The following actions are supported:
* _"create-instance"_ - native code creates an instance of given Dart class.
* _"call"_ - native code calls given Dart function or member.
* _"get"_ - native code calls given getter or retrieves value of a given field.
* _set_ - native code calls given setter or sets value to a given field.
If action element is omitted, the following actions are assumed by default:
* For classes - create-instance”.
* For fields - both get and set (only get if a field is final).
* For others - call”.
If needed, the description of an entry point can be extended by supporting
more elements or actions.
## “native-methods” element
The native-methods section contains description of entry points accessed from
specific native methods. It can be used to declare behavior of a native method
more accurately.
Each element in native-methods section is identified by the native name - the
name specified after the native clause in the Dart method or function declaration.
Native method descriptor may contain arbitrary number of entry points.
In addition to the declaration of entry points described above, native methods
may contain the root with the action return”, which describes the specific
concrete type of a Dart instance returned from the native method:
```json
{
"action": "return",
"library": "<library URI>",
"class": "<class name>",
"nullable": "false|true"
}
```
nullable attribute may be omitted defaulting to true”.
If nullable is true (or omitted), then native method can return an instance
of the given class or null.