Commit graph

1645 commits

Author SHA1 Message Date
Marius Gerbershagen
cdeea489cb cmp: fix typo to make constant folding work again 2021-04-01 16:19:14 +02:00
Marius Gerbershagen
62d1bb1203 cmp: fix evaluation order of sequence compiler macros
Minor improvements to define-compiler-macro* (bail out if we detect
:allow-other-keys arguments, define a named block such that
return-from works as expected).

Major refactor of sequence compiler-macros: use define-compiler-macro*
which handles correct evaluation order, define new macro to handle
common stuff for all sequences compiler-macros (e.g. inline policy
checking, check that test and test-not are not both given). The main
expansion logic in the compiler macros is unchanged although the code
had to be slightly rewritten to accomodate the new macros.

Remove the now superfluous seq-opt-parse-args function.
2021-03-31 21:09:18 +02:00
Marius Gerbershagen
dd5c372ff8 cmp: fix let bindings with initforms which are lists with QUOTE symbol as first element
Example:

(let ((x '(quote ...))) ...)

We really have to quote the value in all cases, si::maybe-quote would
strip away one level of quotation leaving only the equivalent
of (let ((x (quote ...))) ...) which of course is incorrect.
2021-03-31 19:57:01 +02:00
Marius Gerbershagen
23dde9625d cmp: fix compiler macro for make-array
The previous version had several problems: argument evaluation order
was not handled correctly and the compiler-macro produced an error for
valid code like

(let ((etype :element-type))
  (make-array 10 etype 'character))

Introduce a new generally applicable macro define-compiler-macro*
which fixes these issues.
2021-03-29 22:07:06 +02:00
Marius Gerbershagen
d54c110361 cmp: fix bad warnings for type declarations inside locally
Also search lexical environment for variables instead of only the
list of variables being established by the current form (which is nil
anyway in the case of locally; only let or multiple-value-bind
statements create new variables).

The declaration is still ignored, but fixing that would require a much
larger refactor because currently variable types are associated to the
variable itself. Thus the type can only be set for the full scope in
which the variable is active and not locally in some subscope.
2021-03-25 22:06:00 +01:00
Marius Gerbershagen
977e2fab34 cmp: fix inlining of functions with &key and &aux arguments
&aux arguments come after &key ones.

Fixes #633.
2021-03-25 22:06:00 +01:00
Marius Gerbershagen
83ed2e1722 cmp: checked-value: don't omit type checks if we detect a type-error at compile time
We now warn at compile time and create a type assertion which errors
at runtime.
2021-03-21 17:33:06 +01:00
Marius Gerbershagen
1f57d7e20a cmp: add type checks to boole compiler macro 2021-03-21 17:33:06 +01:00
Marius Gerbershagen
9391a2bf67 cmp: fix inline expressions for elt
We can't use aref since aref ignores fill-pointers and ecl_fixnum can
be used only in unsafe code.
2021-03-21 17:33:06 +01:00
Marius Gerbershagen
eedbbc08c2 cmp: add type checks in mapl/maplist/mapcon compiler-macros
We are transforming these functions into (loop :on ...). This simply
stops when the objects which we are looping on is not a list, but we
need to signal a type-error because the mapping functions are
specified to take only lists.
2021-03-21 17:33:06 +01:00
Marius Gerbershagen
e0813bf42e cmp: fix typos 2021-03-21 17:33:06 +01:00
Marius Gerbershagen
59cc1f2df8 cmp: fix compiler macro for nth and nthcdr
We were doing no error checking that we got the right number of
arguments. Also remove the manual creation of forms with a backquote
for better readability.
2021-03-20 20:48:50 +01:00
Marius Gerbershagen
78ec5a2d92 cmp: fix type declarations for package functions
All of these functions take either a list of symbols or a single
symbol (except for shadow which uses string designators or lists
thereof).
2021-03-20 20:26:57 +01:00
Marius Gerbershagen
56a914b261 cmp: give more precise types for constant values
Improves error messages.
2021-03-20 20:01:40 +01:00
Marius Gerbershagen
b1ea49e1a0 cmp: fix evaluation order of multiple-value-setq with symbol-macrolet
If a variable which is set with multiple-value-setq is bound to a
symbol-macro, we need to handle the order of side-effects as in setf.

Previously, we were first evaluating the value generating form
of the multiple-value-setq before setting the places from the
symbol-macro. The correct order is to first evaluate the forms from
the symbol macro giving the places to set, then evaluate the value
generating form from the multiple-value-setq and then set the places
to the generated values.
2021-03-18 21:57:14 +01:00
Marius Gerbershagen
80c53f0e2b cmp: fix (values (values))
This must return nil as a single value while we were returning no
values.
2021-03-18 20:20:35 +01:00
Marius Gerbershagen
e466823ac6 cmp: be more strict with symbol-macrolet
The ansi standard specifies that declaring symbols bound with
symbol-macrolet to be special or binding symbols that are defined as
global variables must signal a program-error. Previously, we simply
ignored this issues.

Also fix an issue with cmp-env-search-variables which would wrongly
return variables when searching for symbol macros. This allows us to
remove another check in symbol-macro-declaration-p.
2021-03-11 20:51:17 +01:00
Marius Gerbershagen
69e9e1d46c cmp: fix inlining of functions with mutually dependent keyword arguments
If we inline a function which contains keyword arguments whose default
value depends on the presence of other keyword arguments as for
example in

(funcall (lambda (&key (a nil a-p) (b a-p)) ...))

where `b` depends on the presence of `a`, we need to set the
key-flag `a-p` immediately after scanning for the keyword and not at
the end after we have finished scanning all keywords as we did previously.
2021-03-04 20:19:36 +01:00
Marius Gerbershagen
e5f6606ba7 cmp: fix type propagation for atan function 2021-03-04 19:54:20 +01:00
Marius Gerbershagen
4826398d36 cmp: improve type propagation for complex numbers 2021-02-23 21:04:04 +01:00
Marius Gerbershagen
a937a038a9 cmp: store all objects created with make-load-form in the permanent storage
See test cmp.0076.make-load-form-non-eq and removed FIXME comment for
why this change was made.
2021-02-14 19:23:12 +01:00
Marius Gerbershagen
8df76e9a60 Revert "cmp: fix typo" and "cmp: don't store the same object both in VV and VVtemp"
This reverts commit c5cb09f3cb and
84acbebd7f.

The solution as implemented does not work because we there is no clear
separation between assigning vv locations and later on writing them to
the created C file; we may have already written a vv location before
trying to add the same object again, resulting in miscompilation.
2021-02-14 18:51:54 +01:00
Marius Gerbershagen
c5cb09f3cb cmp: fix typo 2021-02-13 22:22:50 +01:00
Marius Gerbershagen
84acbebd7f cmp: don't store the same object both in VV and VVtemp
See test cmp.0076.make-load-form-non-eq and removed FIXME comment for
why this change was made.
2021-02-13 20:22:52 +01:00
Marius Gerbershagen
a8cbe5842c cmp: remove redundant information in *{permanent/temporary}-objects*
vv records already contain index and object, no need to save this twice
2021-02-13 20:22:46 +01:00
Marius Gerbershagen
194a9e0eab cmp: fix bug in inlining local functions which are closures
See added test case for explanations.
2021-01-16 16:12:13 +01:00
Marius Gerbershagen
ecb4ed10ea cmp: fix progv for return during evaluation of symbol and value arguments
Closes #620.
2021-01-02 16:38:21 +01:00
Marius Gerbershagen
ca6297ddc8 cmp: disable precompiled headers by default
Precompiled headers may not work in every scenario (for example
compilation currently fails for the --with-cxx=yes configure option
due to precompiled headers). If we disable them by default, we are on
the safe side.
2020-12-29 20:43:04 +01:00
Marius Gerbershagen
4e1847f775 clos: don't call make-load-form in the code walker for defmethod
Fixes #594.
2020-09-18 21:22:32 +02:00
Daniel Kochmański
57f58eaeee Merge branch 'wcon-stream-fixes' into 'develop'
Fix encoding issues for msvc

Closes #580, #582, and #581

See merge request embeddable-common-lisp/ecl!220
2020-08-14 07:01:38 +00:00
Marius Gerbershagen
2e94a6ac29 cmp: read msvc output in using the correct encoding
Fixes #581.
2020-08-02 10:55:25 +02:00
Marius Gerbershagen
c7d6ddbf38 cmp: fix inlining of local closures (2nd try)
We need to compile the function body in the same environment in which
the function was defined. However the function arguments need to be
compiled in the current argument.

Fixes #577.
2020-07-18 15:07:04 +02:00
Marius Gerbershagen
a9a63b1d50 cmp: small refactor of (funcall/apply (lambda ...) ...) handling
Unify handling of LAMBDA and LAMBDA-BLOCK in c1funcall and c1apply,
split off computation of let bindings and body in
optimize-funcall/apply-lambda into a separate function.

Preliminary work to fix inlining of local closures.
2020-07-18 15:07:04 +02:00
Marius Gerbershagen
a5671dcdab cmp: refactor c1let/let* into two stages
First stages handles the bindings, second stage the body, needed to
get inlining of local closures right.
2020-07-18 15:07:04 +02:00
Daniel Kochmański
f9db80dcbf cmp: for LAMBDA use an associated function-block-name
That makes lambda with a declaration si:function-block-name behave
consistently with ext:lambda-block (and in eval-macros
ext:lambda-block expands to have this declaration too to behave in
turn consistently with how the compiler treats ext:lambda-block).
2020-06-15 12:34:10 +02:00
Daniel Kochmański
0bd6bd6573 cosmetic: cmp: proclamations: add missing periods 2020-06-15 12:34:10 +02:00
Marius Gerbershagen
d6b422fe39 cmp: fix C compiler invocation for cygwin 2020-06-13 11:25:20 +02:00
Marius Gerbershagen
e89dce9631 cmp: fix multiple-value-setq for special variables
We need to save env->nvalues before calling cl_set on any variable
because cl_set overwrites env->nvalues. Otherwise, we only get nil for
any variable after the first special one.

Fixes #591.
2020-05-28 21:23:54 +02:00
Marius Gerbershagen
636cb4cf60 cmp: add support for precompiled header files
Improves compilation speed for single functions by about 40-50
percent. Precompiled headers are specific to the compiler version and
options in use. Due to this, we regenerate the header whenever the
compiler configuration changes.
2020-05-16 18:53:57 +02:00
Daniel Kochmański
a2a12e2531 Revert "cmp: fix inlining of local closures"
This reverts commit 58f17f6c66.
2020-05-08 13:10:13 +02:00
Marius Gerbershagen
58f17f6c66 cmp: fix inlining of local closures
We have to compile the function expression in the environment in which
it was defined. Fixes #577.
2020-05-01 20:47:47 +02:00
Marius Gerbershagen
c6b4296bb8 cosmetic: fix some compiler warnings 2020-04-29 20:35:37 +02:00
Daniel Kochmański
b9d54d6be7 internals: rename instance.sig to instance.slotds
Slot definitions are no longer a signature, but they are still needed
to update obsolete instances. Reader function name is also changed to
SI:INSTANCE-SLOTDS. SI:INSTANCE-SIG-SET name does not change, because
it sets both SLOTDS and the STAMP.
2020-04-19 17:04:42 +02:00
Daniel Kochmański
aa34ab7119 compiler: rewrite clos::need-to-make-load-form-p
Function is rewritten in C in compiler.d to remove a dependency
between the bytecodes compiler and the clos module. It may be more
performant thanks to more precise type handing, however we use a list
instead of a hashtable, so it may be slower with lookup. To assess
that we should run some benchmarks against real code -- rewriting C
code to work with a hash table should be trivial.

clos::need-to-make-load-form-p is now si::need-to-make-load-form-p and
may be called from C code as si_need_to_make_load_form_p.
2020-04-08 22:01:16 +02:00
Daniel Kochmański
379254456e cmp: make-load-form: detect circular dependencies
Init forms are deferred when possible. This change solves two problems:

- init forms using uninitialized constant boxes
- make forms not signaling an error when circular

Partial fix for #562 (we need to fix bytecodes compiler too).
2020-03-27 11:33:53 +01:00
Daniel Kochmański
dade0b4688 cosmetic: cmp: refactor function add-object
Function is hopefully more readable now.
2020-03-27 11:33:51 +01:00
Marius Gerbershagen
91d251a7ba cmp: correctly handle unused special &rest variables
Even when the variable is not used, we still have to do the binding.
2020-03-21 13:05:23 +01:00
Marius Gerbershagen
14d46da134 cmp: fix evaluation order bugs in compiler macros 2020-03-21 11:44:01 +01:00
Marius Gerbershagen
dda466dd0e cmp: allow :allow-other-keys for functions with &key but zero keywords
Functions such as
(defun f (&key) ...)
would give an error when called like (f :allow-other-keys ...).
2020-03-20 21:29:18 +01:00
Marius Gerbershagen
a9065d1d8e cmp: fix closure type for local functions calling closures
When a local function calls a closure it has to be a closure too. Thus
when updating the closure type for a function f, we have to possibly
update also all functions referencing f.

Fixes #545.
2020-03-18 22:00:57 +01:00