Commit Graph

34 Commits

Author SHA1 Message Date
Matthew Flatt
23300fd18d cs: use nongenerative records in core 2020-12-30 15:34:46 -07:00
Matthew Flatt
a8819af26a cs & schemify: further refinments to left-to-right and letrec
More cases where the code can be mostly left alone, and then cp0 and
company can make further improvements.
2020-12-30 09:23:29 -07:00
Matthew Flatt
4936977c56 cs & schemify: prevent reorder of allocation and continuation capture 2020-12-29 16:23:47 -07:00
Matthew Flatt
becf34a79b expander: fix check on syntax-local-lift-provide
Closes #3589
2020-12-28 14:07:10 -07:00
Matthew Flatt
72d278cb84 cs: take advantage of new lifting in Chez Scheme
Since Chez Scheme now performs the kind of closure conversion that
Racket does --- ensuring that a closure is not allocated if it is
bound to an identifier that is used only in application positions ---
the variant in schemify is not longer run. The hacky macro-based
lifter in the "rumble" layer can also go.

The lifting pass is still preserved in schemify, because it is still
useful to cify. It's not clear whether interpreter mode (which is used
during macro expansion for compile-time code that doesn't cross a
module boundary) is better off with or without schemify's lift, but
it's gone for now.
2020-12-20 08:18:51 -07:00
Matthew Flatt
0a28dd1064 cs: adjust result-arity error messages
Relevant to #3325
2020-12-14 16:10:14 -07:00
Matthew Flatt
0561d71e60 reader: fix imprecision reading some flonums
Reading `1.0e45` produced a different (and less precise) result than
`1e35`. The problem was in the reader's fast path for simple flonum
conversions, where it converts the mantissa and exponent separately
and then combines them. 10^44 is not represented exactly as a flonum,
so there's imprecision when multiplicy it by 10 versus multiplying
1e45 by 1.

Closes #3548
2020-12-14 13:41:11 -07:00
Matthew Flatt
1e19e660c9 expander: track core #%datum expansion in 'origin 2020-12-12 20:23:35 -07:00
Matthew Flatt
400f4fa4fb expander: 'implicit-made-explicit property on introduced #%app, etc. 2020-12-12 11:02:58 -07:00
Matthew Flatt
e7cef677ad expander: attach original property to #%app made explicit
Copy any syntax-original property from the parentheses assodictaed
with a `#%app` made explicit, so that originalness is tracked in
the 'origin property.
2020-12-12 08:50:03 -07:00
Matthew Flatt
6603fe3ad4 cs: improve single-value and no-return tracking
New `#%app/no-return` and `#%app/value` functions at the Chez Scheme
level allow schemify to communicate that function calls will not
return or will return a single value. The schmeify pass may have this
information because a Racket-level primitive is declared that way
(such as `error` or `raise-argument-error` for no-return, or most
functions for single-valued) or because single-valuedness is inferred.

There's currently no inference for no-return functions, because those
are relatively rare. An `#%app/value` is used by schemify only for
imported, non-inlined functions, since cp0 can already deal with local
functions and primitives.

There's a start here at adapting the "optimize.rktl" test suite for CS
--- and that effort triggered these improvements plus some other
low-hanging fruit. But a lot more is needed to adapt "optimize.rktl"
and to make some additional optimizations happen.
2020-12-11 13:29:35 -07:00
Matthew Flatt
e02c417de0 cs: change struct procedure representation and inlining
Avoid a global table to register structure procedures, and instead use
a wrapper procedure. At the same time, adjust schemify to more
agressively inline structure operations, which can avoid a significant
performance penalty for local structure types.

Closes #3535
2020-12-09 07:53:52 -07:00
Matthew Flatt
d7a226053e cs & schemify: repair treatment of property procedures
A procedures that is a value for a structure-type property was not
always inspected correctly. For example, if such a procedure was the
only one to mutate a module variable, then the variable might not be
detected as mutable.
2020-12-07 20:40:27 -07:00
yjqww6
20be8ffc03
RacketCS: preserve immutability when encoding structs as chez records 2020-11-30 07:29:25 -07:00
Matthew Flatt
60e9245390 cs: tweak implementation of keyword intern table 2020-11-22 16:12:17 -07:00
Matthew Flatt
3b1f457375 tweak case fixnum-only dispatch
Use `fixnum?` instead of `fixnum-for-any-platform?` when
only fixnums-on-any-platform are relevant.
2020-11-22 15:53:44 -07:00
Matthew Flatt
f07c2fea71 cs: simplify and improve handling of literals
Use data instead of code to shrink ".zo" sizes by 10-30%.

When Racket code contains a literal that cannot be serialized directly
by Chez Scheme (such as a keyword or an immutable string that should
be datum-interned), the old approach was to generate Scheme code to
construct the literal through a lifted `let` binding. To handle paths
associated with procedures, however, Chez Scheme's `fasl-write` had
been extended to allow arbitrary values to be intercepted during fasl
and passed back in to `fasl-read`. Using that strategy for all Racket
literals simplifies the implementation and reduces compiled code. It
also makes closures smaller, while increases the number of
relocations. DrRacket's foorprint shrinks by about 1%, but the main
affect is on disk space for a Racket installation.
2020-11-22 06:02:40 -07:00
Matthew Flatt
1ac6c15207 add #:unsafe option for #%declare
Finally give in and add an option to compile a module as unsafe. This
was going to be easy, since the option already exists at the linklet
level, but it turns out that a lot of plumbing was needed to propagate
the argument, and even more to preserve unsafety with cross-module
inlining.

Macros can effectively conditoinalize their expansion in unsafe mode
by generating the pattern

 (if (variable-reference-from-unsafe? (#%variable-reference))
     <unsafe variant>
     <safe variant>)

The compiler will only keep one of the two variants, because it
promises to optimize `(variable-reference-from-unsafe?
(#%variable-reference))` to a literal boolean. The expander will still
expand both variants, however, so avoid putting code in both variants
that itself can have safety variants.
2020-11-10 10:36:03 -07:00
Matthew Flatt
1149bb8b2c reader: extend error message for disabled #lang
Try to give more hints to help somone who writes `#lang` twice.
2020-11-07 07:55:20 -07:00
Matthew Flatt
18ff816358 cs: performance improvements related to string encoding
Streamline rktio byte-result copying (main improvement), use fixnum
arithmetic more consistently (minor improvement), and change
`in-bytes`, etc., to avoid some checks in unsafe mode (intermediate
improvement).
2020-11-04 11:57:52 -07:00
Matthew Flatt
fc53f2998c normal-case-path: leave bad encoding bytes alone
When bytes within a Windows path cannot be converted using
`bytes->string/locale` (i.e., when the bytes do not fit a UTF-8
encoding), then leave the bytes alone, instead of triggering a failure
from `bytes->string/locale`.

Fixing this bug uncovered others: `string-locale-downcase` did not
work on an empty byte string on a little-endian machine, and
`in-bytes` and similar reported range errors in terms of "vectors".
2020-11-04 10:27:07 -07:00
Matthew Flatt
5304ff5327 expander: fix malformed linklet
A linklet generated for deserializing syntax objects shadowed a local
variable, which is not allowed.
2020-10-21 11:02:03 -06:00
Matthew Flatt
1a1bad4e90 expander: repair literal syntax in test position of if
Fix mishandling of an expanded `if` where the test position is a
syntax object. The expander's compiler pass from expanded objects to
linkets knows that the syntax object isn't useful, but it tried to be
helpful by preserving the syntax object's content as quoted --- and
that content turns out not to be available, so the syntax object was
replaced by #f, instead.

Closes #3436
2020-10-12 17:58:37 -06:00
Matthew Flatt
59e31e700d more normalization of checked-in schemified code
Rename definitions that are not exported and that are not used as
inferred function names. The rename is based on a hash of the
right-hand side, instead of being just the position of the definition
in the module, and that should help further reduce diffs in schemified
output after small changes to the source.
2020-10-11 10:57:31 -06:00
Matthew Flatt
da6fd94fe1 expander: fix module cache when current-load-relative-directory is #f
Corrects a problem with 4525c231a7.
2020-10-05 14:15:52 -06:00
Matthew Flatt
4525c231a7 expander: make cache accomodate optional directory path terminator
The cache is sensitive to `current-load-relative-directory`, but
normalize with `path->directory-path`.
2020-10-03 16:29:53 -06:00
Matthew Flatt
46a191df03 expander: fix srcloc tracking for set! on rename transformer 2020-09-29 14:08:17 -06:00
Matthew Flatt
bf1d99d9e0 expander: repair prompt that should be a barrier 2020-09-02 07:54:38 -06:00
Matthew Flatt
d280462250 reader: treat BOM like whitespace in places where comments are allowed
Some text-editing tools on Windows include a BOM character (encoded)
at the start of a file that is intended as UTF-8. The general
recommendation for UTF-8 is to *not* include a BOM --- but, well,
Windows. When a BOM is there, meanwhile, the recommendation is to
preserve it in the stream, so always discarding an initial BOM at the
file-port level is not a good idea. A new file mode would make sense,
but distinctions like 'text and 'binary mode have turned out to be
best avoided.

Although I'm not sure it's really a good idea, treating a BOM
character as whitespace in the reader (at least in comment positions)
is an easy way around the problem for text files that are intended as
programs.

Closes #1114
2020-08-27 16:59:08 -06:00
Matthew Flatt
45a84dcb97 schemify: drop variable names that are unused for errors
Using just a number makes the code smaller, and it makes the
checked-in ".scm" vary less going forward.
2020-08-13 16:04:20 -06:00
Matthew Flatt
4f0290186b cs: fix optimizer bug
An optimization pass used mostly for inlining did not reqcognize
`quote`, and it could replace a quoted name with a constant-propagated
value.

Closes #3339
2020-08-08 13:03:40 -06:00
Matthew Flatt
581f02d6f8 expander: fix make for generating BC source
Also, update "README.txt" to explain both CS and BC setup.
2020-08-06 14:09:53 -06:00
Matthew Flatt
093fcd1bc7 makefile: make Racket CS the default
The top-level makefile now builds Racket CS as `racket` by default.

Use `racket bc` to build Racket BC as `racket`. Use `make both` to
build both CS and BC (the latter with the `bc` suffix) overlayed in a
single build. By using `make both` insted of `make cs` plus `make bc`,
you can avoid redundant package downloads and documentation rendering.

To build Racket BC as `racket`, use `racket bc RACKETBC_SUFFIX=`, but
you must consistently use `RACKETBC_SUFFIX=` with `make` every time.
2020-08-01 17:33:53 -06:00
Matthew Flatt
62a3f6ec91 change CS build to use a subtree Chez Scheme and a bootstrapped pb
Also, schemified "thread", "io", "regexp", "schemify", and "expander"
layers are checked in. Overall, building Racket CS no longer requires
first building Racket BC.
2020-07-28 12:56:42 -06:00