To support module caching, module path indexes must be cloned
for each use of the cached module, so that path resolutions
don't collide. Cloning was previously implemented at the point
of shifting the modidx based on the module instantiation name,
but now its cloned at declaration time. This result in better
sharing of module-path resolutions, which in turn speeds up
compile-time instantiation of modules, which in turn speeds up
interactions & examples in documentation (as much as 10% for the
Guide, for example).
Furthermore, the reverse cache within a modidx may have been
used improperly during cloning, and that's not a problem in
the new implementation.
Doc rendering has been occasionally crashing in Pixman/Cairo. It might
have something to do with a non-atomic callback, so let's try avoiding
that, first. (If that doesn't work, the next step is to avoid using
Cairo in a multi-threaded way, for which this is a first step, too.)
The JIT wants to detect calls to functions bound to module-level
variables that are always instantiated to a procedure of a particular
arity, in which case it can avoid some checks. The problem is that
bytecode and JITted code can be shared via the module cache across
namespaces that use different modules to implement a particular module
path or that enable the JIT differently. In particular, starting with
one that has a procedure binding and then using one (in a different
namespace) that has a non-procedure binding could lead to a crash.
Defend against this possibility by never treating imported variables
as constant in that sense. The JIT detects imported variables through
a new import map in the prefix.
This change may slow code. My guess is that it will have no
performance impact in practice, due to cross-module inlining,
although I can construct a microbenchmark that slows by 20%.
The optimizer can no longer reduce
(with-continuation-mark _id _v-expr _expr)
to just
_expr
when _v-expr and _expr are simple enough, because _id
might be bound to a continuation mark key with an
impersonator that checks the result of _v-expr.
The loss of an optimization can have a significant affect on
errortrace of microbenchmarks, such as
(for ([i (in-range 10000000)])
i)
The examples make up the majority of the front page, and it turns out
that google used some of these links in "sitelinks" in search result.
These links should be the main entry points, and we ended up having such
gems as "Printf" be there. They provide a way to "demote" URLS so they
won't show there, but doing that for one link means that another will
pop in (and there's a limit of a 100 such demotions). So add this in an
attempt to make it not consider them as things that can be used in the
sitelinks. This might be reverted if it doesn't help.
(Note that this is discouraged as a way to "sculpt pagerank", but the
purpose here is not to affect how they crawl the web pages and make page
reputation flow, but only to cover up for a missing feature that ends up
with horrible sitelinks. The pages are scanned anyway from the doc
pages.)
* The main page's title appears in search results, so use "The Racket
Language" instead of "Racket". Additional minor tweaks to a few more
titles to make them presentable as search results.
* Add a `#:description' keyword to make it easy to add it to pages. Add
such texts to the main page, downloads, community, learning, people,
and mailing list pages.
* Add a <meta name="robots" content="NOODP" /> to the front page, to
avoid getting the ODP (dmoz) blurb, hopefully the new and improved
description(s) will be used instead. (If not, this should be
reverted.)
The new names are `prompt-tag/c` and `continuation-mark-key/c`
to keep the names consistent with the values that are being
contracted. Also updated the HISTORY file.