This commit replaces capturing whole LEX with an explicit vector of closed
variables. We introduce a set of additional opcodes that deal with closed
entities. Locals are referred as lcl and closed variables as lex.
This commit causes an intentional regression in the bytecodes compiler - we
don't carry over macros and symbol macros, so we can't recompile bytecompiled
function with the native compiler if they reference them.
That will be fixed in a more organized manner after flat closures are in place.
- split c_tag_ref into three functions c_{tag,blk,fun}_ref, clean c_var_ref
small differences between functions made the former harder to read
also update comments about the compiler environment
functions are refactored to have a similar shape and return the
same (internal) structure that denotes the object scope and purpose
- don't push special variables as locations in the environment
that was (an irrelevant) bug, because special variables are not in the en
- rename asm_c to asm_arg_data
This name better resembles the purpose of the operator
When we were compiling bytecodes with LABELS, the function SET-CLOSURE-ENV
exhibited infinite recursion by adding the record as FLET. C.f test "cmp.0100".
The function ecl_fdefinition checks also for lamdbas and whatnot, while all we
need is a lookup in the global namespace for the function name.
This commit also changes how we store SETF function definition -- instead of
maintaining them in a global environment, it is stored along with the symbol.
That saves us from taking a global lock repeatedly.
Previously we've registered the finalizer when a symbol was dynamically bound
for the first time; this commit changes that to remove a dependency on GC when
binding special variables.
Constant arguments for the dimensions were not handled correctly. The
valid-array-index function was lost in a refactor some time ago.
Moreover, we need to check all of the conditions on the
dimensions (limits on rank, dimension and total size) using an AND
statement instead of checking only the first condition using OR.
Simply call mkdir and ignore EEXIST errors to prevent race conditions
when two processes try to create a directory at the same time. Also
avoids a redundant syscall since by not calling si::file-kind, so this
should be slightly faster.
After this commit DESCRIBE prints two additional pieces of information below the
docstring. To avoid duplication, corresponding arg piece in doc/help.lsp has
been removed. Fixes#711.
We've made an implicit cast from bclosure to bytecodes, so instead of a name
we've printed bytecodes itself.
Except from thsi fix we also write the closure address to make it possible to
distinguish two different closures over the same function.
If we call stat in order to find out if a filename points to a
directory or an ordinary file, the emscripten stdlib may need to do a
network request to find out the size of the file even though we don't
care about that. This happens for files created with
FS.createLazyFile() by emscripten. By using readlink/opendir when
possible we avoid that.
Having *PRINT-LENGTH* at 3 is not satisfactory, especially in the early handler
where there are no other means to introspect errors. Change it to 8.
Before:
;;; Message:
|TYPE-ERROR|
;;; Arguments:
(:|EXPECTED-TYPE| |FUNCTION| :|DATUM| ...)
After:
;;; Message:
|TYPE-ERROR|
;;; Arguments:
(:|EXPECTED-TYPE| |FUNCTION| :|DATUM| (|QUOTE| |WHILE|))
The config script as it is now fails on gcc version 14.2.1 20240912 (Red Hat 14.2.1-3) (GCC)
This is because one test did not include string.h before memcpy, and two other tests relied
on implicit function definitions -- in one test definitions are moved before the first use
and the second test is removed wholesale as it relies on undefined behavior and tests some
obscure (and ancient) gcc flavor segfault.
1. We don't normalize garbage collected entries.
Doing that created a false free bucket, so GETHASH and SETHASH stopped searching
for entry too early. Fixes#761.
2. MAPHASH does not map over garbate collected entries.
Previously MAPHASH did not call copy_entry, so it was always accessing key/val
even if they were recently garbage collected, effectively mapping over NIL in
the place of the collected value
3. HASH-TABLE-CONTENT had a similar issue to MAPHASH.
4. REMHASH did fill the hole, but didn't replace the moved entry with a free
bucket, moreover we've used the value to comptue the hash when computing the
distance function.
Moreover we introduce an optimization, where SETHASH first tries to fill a
garbage collected entry in the bucket before it tries to extend the table.