Done by pairing up incomplete blame objects with the missing blame party
before attaching it to the continuation mark. Other approaches were
explored (having a separate mark for each, imperatively updating blame
objects to add missing blame parties, etc.), but pairing had the least
overhead.
parts of a contract (field, method, init, absent clauses)
Still to do:
- delay the creation of the class that checks internal contracts
until a new derived class is created from a contracted class.
- extend the new implementation so it handles interface contracts
(currently the old version of the external contracts is still there,
just to handle this case)
The first of those is what (I hope) will bring down the memory
footprint for class/c contracts.
that is, instead of (class/c [m (->m integer? integer?)] n) turning
into a call to a constructor that has calls to coerce-contract for
the 'm' method, it instead expands the 'n' method contract into an
identifier reference (that isnt' bound to #f, since #f is coercable to
a contract) and the 'm' contract argument just sits there in the expansion
The main change in this commit is to refactor the class/c projection
such that it actually build two classes internally when only a single
class/c is applied to a single class. The goal is to further adjust
class/c so that the projection corresponding to the external method
contracts goes away (to be replaced by a new strategy) and the
projection corresponding to the internal method contracts gets delayed
using some as-yet-underminded strategy that avoids creating the new
class until someone actually creates a subclass.
This commit, but itself, however is a performance lose to the tune of
about 2 megabytes in DrRacket's startup footprint. Hopefully this
doesn't last too long.
For example, if a package is installed in user scope where no
user-scope documentation is already built, CSS files need to be
in place for the main page of user-specific documentation.