Commit graph

8293 commits

Author SHA1 Message Date
Marius Gerbershagen
fdcf5e7eff cmp: disable inlining for global functions that are closures
For functions already compiled and loaded, we simply check if the
definition is a closure. For functions defined in the same file, we
don't store their definition in the compiler environment but instead
use *global-funs*. The advantage is that this directly allows us to
determine whether a function is a closure or not and we don't have to
run the first compiler pass again each time we inline the function.

This commit also fixes some minor issues with the inline policy,
described in detail as follows:

1. The inline policy differed subtly between `proclaim` and `declaim`.
If a file like

(eval-when (:compile-toplevel)
  (proclaim '(inline f)))
(defun f ...)

was compiled (but not loaded), subsequent compilations would inline
`f` but for

(declaim (inline f))
(defun f ...)

the function `f` would only get inlined if the file was compiled _and_
loaded. We now use the latter approach for both cases. Thus, calling
`compile-file` without `load` has no side-effects regarding whether
functions are inlined or not.

2. We did not distinguish between functions which were declared inline
at a global versus local level such that e.g. in

(locally
    (declare (inline f))
  (defun f ...))

the function f would get inlined outside the scope of the `locally`
form. This is changed now such that local inline declarations only
apply to the scope in which they are made.

3. Inline declarations were made by expanding into statements like

(eval-when (:compile-toplevel)
  (c::declare-inline ...))

during the macroexpansion of `defun`. However this only works if the
`defun` appears at the toplevel and hence in code like

(declaim (inline f))
(let (...)
  (defun f ...))

the function `f` could not get inlined later on in the same file. This
is fixed now by calling the code which should run during compilation
directly when macro expanding defun.
2022-12-30 16:14:53 +01:00
Marius Gerbershagen
4da9cc3a87 improve error message for wrong index
Use ~S instead of ~A to make the difference between e.g. "0" and 0
clear.

Fixes #687.
2022-12-27 15:32:55 +01:00
Marius Gerbershagen
7175e592bd Merge branch 'cleanup' into 'develop'
this merge request introduces various cleanup fixes

See merge request embeddable-common-lisp/ecl!278
2022-12-11 09:39:08 +00:00
Daniel Kochmański
80b74c890d cleanup: separate process managament from threads
Additionally:

- abstract platform specific functions with file-local macros
2022-12-05 00:34:25 +01:00
Daniel Kochmański
90483505bd cleanup: remove unused slot ecl_process.queue_record 2022-11-25 20:44:33 +01:00
Daniel Kochmański
bd723748d7 alloc_2: initialize the type info in a separate function
The initialization is a lengthy function with clear responsibilities separate
from the gc initialization.
2022-11-25 17:07:36 +01:00
Daniel Kochmański
95d7f4691c cleanup: refactor ecl_init_env into smaller functions 2022-11-25 17:07:34 +01:00
Daniel Kochmański
285c12a2c6 cosmetic: indentation, s/if/when/ 2022-11-25 13:49:43 +01:00
Daniel Kochmański
1d5b8fd525 bignum: move ecl_init_bignum_registers to bignum.d 2022-11-25 13:49:43 +01:00
Daniel Kochmański
f9ad8de531 cl_core: remove unused slot .default_dispatch_macro 2022-11-25 10:47:10 +01:00
Daniel Kochmański
3ada3e96f7 stacks: initialize the lisp stack in init_stacks 2022-11-25 10:14:15 +01:00
Daniel Kochmański
9e10e9115e cosmetic: introduce define ecl_thread_exit() 2022-11-25 10:13:49 +01:00
Daniel Kochmański
6ad85b259f ecl_symbol: remove unused field
symbol.dynamic was only assigned, because we already encode this information
in a bitfield using the enum ecl_stype.
2022-11-24 19:47:27 +01:00
Daniel Kochmański
a886b04a9a cosmetic: remove +x flag from source files 2022-11-24 19:47:26 +01:00
Daniel Kochmański
6c2cca684a cleanup: remove lingering references to the old garbage collector 2022-11-24 19:47:26 +01:00
Daniel Kochmański
e53b3d14bd ecl_list1: redefine as a preprocessor macro
This is the same as ecl_cons for all practical purposes so we simply put a
define `#define ecl_list1(x) ecl_cons(x, ECL_NIL)`.
2022-11-24 19:47:26 +01:00
Daniel Kochmański
93fabac00a cosmetic: use ECL_NIL instead of a deprecated constant Cnil 2022-11-24 18:55:25 +01:00
Daniel Kochmański
2100549860 stacks.d: move the lisp stack from interpreter.d 2022-11-24 18:55:25 +01:00
Daniel Kochmański
c591cfdb47 stacks.d: always use explicit ecl_return1 2022-11-24 18:55:25 +01:00
Daniel Kochmański
2bbf490071 alloc_2.d: remove unused code paths
- GBC_BOEHM_OWN_ALLOCATOR is dead for a long time
- undef alloc_object was used the function rename to ecl_alloc_object
- remove mark phase ignored by the preprocessor
2022-11-24 18:54:39 +01:00
Daniel Kochmański
67f9d6af27 file.d: file_listen: refactor the function
- instead of a magic number -3 define a constant ECL_LISTEN_FALLBACK
- provide a separate definition for windows and not-windows
2022-11-24 18:46:16 +01:00
Daniel Kochmański
2b52fe3ecb pathname_translations: use ecl_assqlp instead of @assoc
ecl_assqlp is sufficient and does not require argument parsing at runtime. host
is always checked to be a string, so the ecl_assoc test EQUAL will have the same
effect as the previously checked STRING-EQUAL.
2022-11-24 18:32:58 +01:00
Daniel Kochmański
f948001dee reader: ensure the correct function arity
We've used void_reader as an implementation for sharp_{plus,minus}_reader -
sharp readers accept three arguments while void_reader accepted two.

- introduce void_reader3
- change sharp_{plus,minus}_reader to use void_reader3
- remove unused defines (leftovers from the past)
- remove unused void_reader (with two arguments)
2022-11-24 18:32:53 +01:00
Daniel Kochmański
4366fac6ad portability: repair builds for --enable-threads=no
A few blocks were not guarded with

 #ifdef ECL_THREADS
 ...
 #endif
2022-11-24 18:32:45 +01:00
Marius Gerbershagen
b9ea8ac6ac rename-file: fix error message
Don't use the filename encoded in utf8/utf16/whatever in the error
message.
2022-11-19 20:38:12 +01:00
Marius Gerbershagen
220faae167 fix encoding for standard input/output/error streams that are not Windows console streams
In commit 892a34e66d, I forgot to set
the encoding to the default value after we start when we are not on a
Windows console.
2022-11-19 20:34:32 +01:00
Marius Gerbershagen
fea8a9dde4 Merge branch 'fix-log-small-ratio' into 'develop'
log: add a separate path for ratios

See merge request embeddable-common-lisp/ecl!276
2022-11-18 15:59:57 +00:00
Daniel Kochmański
06e553157c tests: add a regression test for (log small-ratio) 2022-11-16 00:31:26 +01:00
Daniel Kochmański
b45dec9c32 log: add a separate path for ratios
While not necessarily a bug, it is convenient to not overflow on very small
ratios. When feasible instead of converting to float, we compute log of the
number and the denominator and then return their difference.

c.f https://mailman.common-lisp.net/pipermail/ecl-devel/2022-July/011628.html
2022-11-16 00:31:19 +01:00
Marius Gerbershagen
4d7ee7a301 fix typo introduced in commit de15a8542 2022-10-22 20:02:07 +02:00
Marius Gerbershagen
de15a85420 cosmetic: fix some compiler warnings 2022-10-22 19:58:24 +02:00
Marius Gerbershagen
509a77335a Merge branch 'fix-decode-float' into 'develop'
decode-float: fix the implementation

See merge request embeddable-common-lisp/ecl!275
2022-10-22 17:57:15 +00:00
Daniel Kochmański
3b4c4f3c98 tests: add a regression test for decode-float
Cases are hand picked.
2022-10-22 19:31:55 +02:00
Daniel Kochmański
4861e02c1f decode-float: fix the implementation
The previous code returned 0 for negative floats. Moreover it did not honor
the signed negative zero wrt third returned value.
2022-10-22 19:22:51 +02:00
Daniel Kochmański
e760e9182b Merge branch 'format-e-issues' into 'develop'
Fix several issues with the format ~e directive

Closes #499 and #632

See merge request embeddable-common-lisp/ecl!274
2022-10-02 19:28:00 +00:00
Marius Gerbershagen
482d09ed10 format.lsp: fix incorrect roundings for ~e directive
Due to rounding issues the exponent can be different than what we
guessed. For example in the following only one digit should appear
before the decimal point such that

(format nil "~,1e" 9.9) => 9.9e+0

is correct but

(format nil "~,1e" 9.9) => 10.0e+0

is incorrect, has to be 1.0e+1.
2022-09-24 21:04:43 +02:00
Marius Gerbershagen
0506ce34a3 format.lsp: fix format ~e with width argument
Fixes #632.
2022-09-18 16:33:00 +02:00
Marius Gerbershagen
763369ee84 float_to_digits.d: add some comments 2022-09-18 16:02:47 +02:00
Daniel Kochmański
4252012a2e Merge branch 'cmp-libs-ld-flags-non-backwards-compatible' into develop 2022-09-08 09:03:46 +02:00
Daniel Kochmański
6d191760b3 cosmetic: cmp: rename a function guess-ld-flags to guess-ld-libs
... to better reflect what it returns.
2022-09-08 09:02:42 +02:00
Marius Gerbershagen
d55d31df3b format: print 0 after decimal point with ~e for integer input
Example: (format t "~e" 1.0) used to print 1.e+0, now prints 1.0e+0

Code adapted from SBCL.
2022-09-03 19:38:51 +02:00
Marius Gerbershagen
826cc92983 cmp: introduce new variables for linker flags
Split up the options into additional flags for the linker and
additional libraries.

Quoting from issue #636:

> Here's an example, attempting to link one object file named
  example.o into an executable named example. Libcrypto here is
  superfluous and should be removed by --as-needed:

```
LDFLAGS="-Wl,--as-needed"
LIBS="-lcrypto"
gcc ${LDFLAGS} ${LIBS} example.o -o example # doesn't link libcrypto!
gcc example.o ${LDFLAGS} ${LIBS} -o example # doesn't honor --as-needed!
gcc ${LDFLAGS} example.o ${LIBS} -o example # works great!
```

> In short, the placement of your -l<foo> flags differs from that of
  all the other linker flags. Since ECL is only providing one big
  variable ld-flags for all of the linker flags, there's no correct
  way to pass in options like --as-needed and -l<foo> at the same
  time.

Fixes #636.
2022-08-24 16:38:20 +02:00
Daniel Kochmański
d0a24fe283 Merge branch 'cmp-infinite-loop-circular-structure' into 'develop'
Fix #630

Closes #630

See merge request embeddable-common-lisp/ecl!273
2022-08-16 09:10:24 +00:00
Marius Gerbershagen
3db6ad91ff cmp: fix infinite loop for files containing lists with the same circular structure
Closes #630.
2022-08-14 17:17:57 +02:00
Marius Gerbershagen
3bf98a96e0 tests: fix typo in trap-fpe smoke test
Due to the typo, all floating point exceptions were enabled after the
test had run. This leads to failures in other tests for instance due
to floating-point-inexact errors. Now, the exception flags are
correctly restored again after the test is finished.
2022-08-13 20:58:23 +02:00
Daniel Kochmański
b3d1a3e343 trap-fpe: signal an error when invalid condition is supplied
We've allowed any symbol to be supplied as a condition, when it was not
recognized then we've not changed bits (they remained 0). From now on we signal
an error if the condition can't be signaled.

Since user reported the error with keywords used instead of cl symbols, we also
make the manual more clear regarding the package of condition symbols.
Appropriate smoke tests are added too.

Fixes #681.
2022-07-28 21:08:31 +02:00
Daniel Kochmański
1ce4713804 floats: add operators to convert between floats and bits (integers)
The interface is in the system package (that is - not part of the official api).
2022-07-07 13:24:38 +02:00
Daniel Kochmański
4b83ceb1b6 Merge branch 'ext-program-path-with-environ' into 'develop'
RUN-PROGRAM: Try to use execvp even if :ENVIRON is specified

See merge request embeddable-common-lisp/ecl!272
2022-05-23 07:28:34 +00:00
Eric Timmons
e6b17033b7
RUN-PROGRAM: Try to use execvp even if :ENVIRON is specified
Unfortunately, execvpe is not standard. However, we can replicate its behavior
by pointing **environ to a new array of environment variable assignments before
execvp.

On Darwin, shared libraries do not have direct access to **environ. Instead, we
use the return value of _NSGetEnviron().

Rename all existing uses of environ (as a variable name) to my_environ as
environ now names a macro on both Darwin and Mingw.

If the target does not HAVE_ENVIRON, fall back to execve as before.
2022-05-20 14:38:41 -04:00
Eric Timmons
bad77f4915
Improve PROCESS-ENVIRON tests
(ext:run-program "env" nil :environ '("foo=bar")) actually exits with non-zero
status because 1) PATH is not specified in the child process and even if it
were 2) the use of :ENVIRON prevents ECL from searching the PATH for child
programs.

Rewrite the tests to actually highlight the failure.
2022-05-20 14:11:10 -04:00