Don't use user-homedir-namestring on the windows version of
native-namestring, since the home directory can be specified as
C:/User/user, use (native-namestring (user-homedir-pathname)), which
will get C:\\User\\user\\ instead, making (native-namestring "~/") and
(native-namestring (user-homedir-pathname)) equal.
#-win32 has all the win32 pathname code enabled, but it's not used
anywhere and not exported. Even if using pathnames of a different OS
may be a good idea, it's currently not presented in any usable way and
only wastes space.
The comparer function for COMPLEX types wasn't properly optimized
during cross-compilation because the types of REALPART and IMAGPART
weren't derived by the cross-compiler on account of
CROSS-FLOAT-INFINITY-KLUDGE, but the derivers do not actually perform
any mathematical derivation, just
(complex (double-float 10d0)) => (double-float 10d0).
Enabling them during cross-compilation allows = on complex floats be
optimized and avoids consing.
Add a comparer slot to raw-slot-data, which is defined as
(lambda (index x y)
(= (%raw-instance-ref/double x index)
(%raw-instance-ref/double y index)))
Which is both faster than calling %raw-instance-ref/double out of
line and does not cons.
The old code would first count the number of conses, and then
SUBSEQ/(RPLACD/NTHCDR). Instead traverse the list with two offset
pointers that advance in lockstep.
Based on a patch by Johan Andersson, on lp#1245697.
Expansions for TYPEP are wrapped in %typep-wrapper, a fancy identity. The
additional arguments track what value is being tested for what type, which
helps inform constraint propagation, as well as detecting redundant type
tests.
Such a wrapper is a hindrance to lower level control flow rewriting that are
essential for decent code generation. After a single pass of constraint
propagation, the wrapper evaporates and the TYPEP expansion becomes as opaque
as it is now.
CONSTRAINT-PROPAGATE optimizers can add new information about the
state of the world after/if the function has returned. Function
type declarations/propagation suffice for simple patterns (e.g.
return types, or unconditional type requirements on arguments),
but this optimizer is more general.
Such optimizers receive two arguments, the combination node and the
current set of constraints, and return a sequence of constraints.
Constraints are lists of three or four values:
1. a constraint kind (either TYPEP, <, >, or EQL);
2, 3. two arguments, either LVARs, LAMBDA-VARs or a CTYPE;
4. optionally, whether the meaning of the constraint must be
flipped.
This mimics the (defstruct (constraint ...)) in constraint.lisp.
If any of the argument is NIL, the constraint is skipped; otherwise,
it is added to current set of constraints. Optimizers have access
to that set, and can thus map LVARs to LAMBDA-VARs thanks to
OK-LVAR-LAMBDA-VAR.
CONSTRAINT-PROPAGATE-IF optimizers can instead hook into the
interpretation of functions as predicate, when their result feeds
into an IF node. They also receive the node and the current set
of constraints as arguments, and return four values. The first two
values are an LVAR and a CTYPE: if they are non-NIL, that LVAR is
of that CTYPE iff the combination returns true. The two remaining
values are sequences of constraints (see previous paragraph) for
the consequent (if-true) and alternative (if-false) branches,
respectively. These are useful for more complex tests, but also
to represent partial information, e.g., if an EQUAL test fails,
the two values are not EQL either.
(compile-or-load-defgeneric name) doesn't need the full eval-when
repertoire, only :compile-toplevel and :execute. :compile-toplevel for
subsequent forms and :execute for references within the body of
defmethod to itself. :load-toplevel is not needed since when the FASLs
are loaded no further processing is performed, this avoids the size
increase of the resulting FASLs.
When /bin/ed is not present the test failed with a confusing "unhandled
error".
* Wrap the whole run-program-ed test into with-test, renaming it to run-program-/bin/ed.
* Add before it a test named :is-/bin/ed-installed?.
Making the report more self-describing:
Failure: run-program.impure.lisp / IS-/BIN/ED-INSTALLED?
Failure: run-program.impure.lisp / RUN-PROGRAM-/BIN/ED
(defmethod gf ())
(defun f () (gf))
Produced a warning about an undefined function, even though it would
be implicitly created by defmethod.
Fixes lp#503095.
defmethod communicates to make-method-lambda using special variables,
but make-method-lambda then performs code-walking which expands
macros, and if a macro calls another make-method-lambda directly, this
make-method-lambda will receive incorrect information which may cause
problems with wrong lambda lists.
Reported and diagnosed by Attila Lendvai.
Everything has moved, which led the binary-distribution script not to
include test-passed files, and the install script to look for them in
the wrong place anyway.
Quantifiers like SOME and EVERY are implemented in terms of (MAP NIL)
of a wrapper function with early RETURN. If type information does not
enable MAP to be open coded, declarations are necessary to avoid
consing up a closure and a value cell for the return.
DX functions really shouldn't cause value cells for return blocks.
Also, revert d0f65b07a3 which is
now mostly redundant.
sb-pcl::class-has-a-forward-referenced-superclass-p, used in the
implementation of subtypep on classes, conses because SOME can't
perform the required inlining when used on the sequences of unknown
type. (See lp#1070635)
* Both FIND-RESTART and COMPUTE-RESTARTS traverse, filter and select
active restarts, potentially for a particular condition and
potentially calling restart test functions. This common behavior has
been factored into the new function MAP-RESTARTS.
* Remove *CONDITION-RESTARTS*; use new slot ASSOCIATED-CONDITIONS in
RESTART structure instead.
* As stated in bug 774410, when given a RESTART instance, FIND-RESTART
did not test whether the restart was still active and whether the
restart had been associated to a different condition in the
meantime. This behavior has been changed by calling MAP-RESTARTS which
checks activity and association to conditions (sadly, making
(find-restart RESTART-INSTANCE CONDITION-OBJECT)
a bit slower than before).
* INVOKE-RESTART is also affected by the changes for bug
774410. However, it does not respect restart test functions when
called with a RESTART instance (This is underspecified in CLHS and
other implementations behave in various ways. However, behaving
differently would make some restarts un-invokable).
* As suggested in bug 769615, (find-restart SYMBOL ...) now calls
MAP-RESTARTS instead of COMPUTE-RESTARTS, consing less and executing
faster in many cases.
* New (find-restart :recheck-conditions-and-tests :bug-774410) test from
Jean-Philippe Paradis from original bug report in
tests/condition.impure.lisp checks the new behavior.
Fixes lp#769615, lp#774410
Add and/or extend explanatory comments for the special
variables *HANDLER-CLUSTERS*, *RESTART-CLUSTERS*
and *CONDITION-RESTARTS*.
Slightly rearranged RESTART-NAME and RESTART-REPORT.
In order to get slot definition initialization right, move the
readers/writers slots to direct slot definitions, and write code to
detect all the bad cases documented in the MOP dictionary at
initialization time. Condition slots also need changing, to have
separate initform and initfunction information. Moving the slots
breaks metacircle resolution, naturally, so rewrite that to find the
relevant reader/writer information from the direct slots at runtime.
The irony of having to rewrite metacircle detection and resolution for
a bug tagged "easy" on launchpad is not lost on me.
Originally reported by Bruno Haible at some point in prehistory,
probably around December 2004, lp#309072.
IR1 translation was too eager in eliminating redundant THE forms
when the value is a constant. We now also make sure that the
asserted type accepts single values.
Reported by Nathan Trapuzzano on sbcl-help.
Since (setf aref/sbit/bit) have to work with
(setf (apply #'aref array subscripts)), they had both a setf expander
and a setf-function, but it can be implemented with just a
setf-function. All other accessors are still done using
(defsetf accessor %setaccessor), I haven't found a technical reason to
prefer one to another, other than (setf accessor) being a nicer name.
Fixes lp#1241095.
All the describy things can be pried out of a generic function only if
it's a standard-generic-function.
Also add an FNDB entry for FUNCTION-LAMBDA-EXPRESSION.
The third value of
(function-lambda-expression (defgeneric foo ()))
is now FOO, and not
(LAMBDA (&REST SB-PCL::ARGS) :IN SB-PCL::MAKE-INITIAL-DFUN)
Reported by Marco Baringer.
Also, move contrib output to obj/sbcl-home/, asdf cache to obj/asdf-cache/
Update sb-grovel and other contribs and their tests for asdf3.
Fixes lp#1132254.
Solaris' /bin/sh does not grok $(...), so use `...` instead.
Note that all recent versions of Solaris have included /bin/bash, but
I'm not sure the impact of using #!/bin/bash instead of #!/bin/sh on
some of our other platforms.