…
|
||
---|---|---|
.. | ||
README.md | ||
used_names.html | ||
used_names.js |
used_names.html
To run this program, visit
pkg/compiler/tool/used_names/used_names.html
in a browser.
The page will display a list of short names that are defined as properties on
all the objects available from window
. The names are sorted by size, and then
alphabetically ignoring case, and finally by case. They are quoted for easy
copy-paste into a Dart source file.
This data is to be used for editing tables of names that the minifying namer should avoid in some circumstances. These names should be in the table, but other names might need to be in the table too.
Why these names?
There are contexts where dart2js generates a.b()
with the expectation that it
will either call an instance method in the Dart program or crash with a
JavaScript TypeError for an undefined function. The minifier code can't use
certain names for b
since it won't crash, for example toString
, or length
,
which might result in a less clear diagnostic.
An example of this use is in dynamic calls to methods that do not need the special 'interceptor' calling convention used on native objects like Arrays, Strings, numbers and @Native classes. Dynamic calls use the same selector as instance calls.
In unminified code we arrange that the selectors are descriptive of the call
site structure, e.g. toString$0
or get$length
. These generally are not
defined in the execution environment.
For minified code, we want to pick names as short as possible, so there is a
chance that the short names will conflict with one defined in the environment.
For example, minifying something to a.at()
might call String.prototype.at
.
Discussion
In retrospect the decision to use names that Dart has no control over is not the best. When this part of the compiler was written, the language was still very dynamic (Dart 1) and there were very few program that extensively used JavaScript interop.
Now that typical programs contain many fewer dynamic calls, perhaps it is time
to make the calling convention for dynamic call different to that for instance
method calls. One idea is we could start by making dynamic calls have a
different selector. This selector would eventually be a fully-checked entry
point, but initially it could just be an alias for the instance-call entry
point. The alias could be a JavaScript Symbol, or for legacy browsers, always
start with dyn$
, even when minified.