* libguile/mkstemp.c (mkstemp): Add O_BINARY. Since temp files are
empty at the beginning, we're not changing the behavior for reading
files. For writing files `newline' and ~% can add \r elements as
needed. So this is a reasonable thing to do, and it prevents mangling
of temp files for the compiler.
* libguile/filesys.c (scm_system_file_name_convention): New function.
Exported to Scheme only.
* module/ice-9/boot-9.scm (file-name-separator?, absolute-file-name?):
New predicates.
(file-name-separator-string): New global variable.
(in-vicinity): Use the new procedures.
(load-user-init, try-module-autoload): Use file-name-separator-string.
(load-in-vicinity): Update canonical->suffix. Consistently use the
term "file name" throughout.
* module/ice-9/psyntax.scm (include): Use global `absolute-file-name?'.
* module/ice-9/psyntax-pp.scm: Regenerate.
* libguile/array-handle.c (scm_array_handle_pos_1):
(scm_array_handle_pos_2): New functions.
* libguile/generalized-arrays.c (scm_c_array_ref_1, scm_c_array_ref_2):
(scm_c_array_set_1_x, scm_c_array_set_2_x): New functions.
(scm_i_array_ref, scm_i_array_set_x): New subr bindings for array-ref
and array-set! that avoid consing for arrays of rank 1 or 2.
* test-suite/tests/arrays.test ("array-set!"): Fix expected exception
for wrong number of indices.
* libguile/inline.h:
* libguile/array-handle.h (scm_array_handle_ref):
(scm_array_handle_set): Move definitions here from inline.h.
* libguile/inline.c: Include array-handle.h.
* libguile/hashtab.c (scm_hash_count): New function. Count the number
of elements in a hash table.
* doc/ref/api-compound.texi (Hash Tables): Update examples and
reference.
* test-suite/tests/hash.test (hash-count): New test.
* libguile/ports.h:
* libguile/ports.c (scm_consume_byte_order_mark): New procedure.
* libguile/fports.c (scm_open_file): Call consume-byte-order-mark if we
are opening a file in "r" mode.
* libguile/read.c (scm_i_scan_for_encoding): Don't do anything about
byte-order marks.
* libguile/load.c (scm_primitive_load): Add a note about the duplicate
encoding scan.
* test-suite/tests/filesys.test: Add tests for UTF-8, UTF-16BE, and
UTF-16LE BOM handling.
* libguile/vm-i-scheme.c (VM_VALIDATE_STRUCT): Fix the error message if
the value was not a struct.
* module/system/base/compile.scm (find-language-joint): Default to
joining at the target language.
(default-language-joiner): Allow sequences of one compiled expression
to pass through. Otherwise error as before.
(read-and-parse): New helper; actually parses.
(read-and-compile): Use read-and-parse, and fall back to
default-language-joiner.
Thanks to Nala Ginrut for the report.
* libguile/load.c (scm_primitive_load_path): If the second argument is a
procedure, call it like a thunk.
* doc/ref/api-evaluation.texi (Load Paths): Update docs.
* module/ice-9/boot-9.scm (resolve-interface): Use `unless'.
(try-module-autoload): Use the new primitive-load-path to detect
failure to find an appropriate file. Fixes a bug reported by Diogo
F. S. Ramos. Thanks to Noah Lavine for tracking it down.
* libguile/weak-table.c (GC_move_disappearing_link)
(move_disappearing_links): Factor out stub, as in previous weak-set
commit.
(resize_table): As in weak-set commit, finalizers do not run within
allocators.
(do_vacuum_weak_table): Add comment about need for trylock.
(scm_c_make_weak_table): Use the new scm_i_register_weak_gc_callback.
Previously this was the case because of a mistyped check for a
"HAVE_GC_TABLE_START_CALLBACK" symbol, whereas the symbol was actually
HAVE_GC_SET_START_CALLBACK. Anyway, it's better to call this after GC
anyway, as vacuuming might need to allocate weak links (on pre-7.3
libgc without GC_move_disappearing_link) or reallocate the backing
vector.
* libguile/finalizers.h:
* libguile/finalizers.c (scm_i_register_weak_gc_callback): New internal
helper, from weak-set.c.
Relative to the previous weak-set.c version, prefer the
finalizer-based implementation. Fix bug regarding confusion between
scm_before_gc_c_hook and scm_after_gc_hook. Fix bug regarding
referencing weak values outside of the alloc lock.
* libguile/weak-set.c (GC_move_disappearing_link): New stub.
GC_move_disappearing_link is only available in libgc 7.3.
(move_weak_entry): Use the new stub instead of ifdeffery.
(resize_set): Now that we run finalizers from a separate thread or
async, we can keep the lock while reallocating the set vector.
(do_vacuum_weak_set): For the same reason, always lock the set.
Remove implementation of scm_c_register_weak_gc_callback in preference
of the new copy in finalizers.c.
(scm_c_make_weak_set): Use the new scm_i_register_weak_gc_callback.
* libguile/gc.c: Remove shims for GC_get_heap_usage_safe,
GC_get_free_space_divisor, and GC_set_finalize_on_demand. Remove code
in the case in which we did not have GC_set_start_callback.
* libguile/posix.c (scm_fork): Issue a warning on a multithreaded fork.
* doc/ref/posix.texi (Processes): Add note about multithreaded fork.
* test-suite/tests/00-socket.test: Moved here, from socket.test, so as
to run before any threads are created.
* test-suite/Makefile.am: Adapt.
* libguile/posix.c (scm_fork): Issue a warning instead of an error on a
multithreaded fork.
* doc/ref/posix.texi (Processes): Add note about multithreaded fork.
* libguile/ports.c (scm_i_set_default_port_encoding): An encoding of
ASCII is not the same as ISO-8859-1, because it does not allow
characters above 128. Fix this.
* libguile/ports.c (scm_c_read_unlocked, scm_ungetc_unlocked):
* libguile/read.c (scm_read_character):
* libguile/vports.c (sf_fill_input): Port encodings cannot be NULL any
more, now that encodings are canonicalized, so simplify these.
* libguile/ports.c (ascii_toupper, encoding_matches)
(canonicalize_encoding): New helpers.
(scm_c_make_port_with_encoding):
(scm_i_set_default_port_encoding):
(scm_i_set_port_encoding_x): Use the new helpers to be
case-insensitive and also to canonicalize the internal representation
to upper-case ASCII names.
(scm_i_default_port_encoding): Never return NULL.
(scm_port_encoding): The encoding is always a string.
* libguile/read.c (scm_i_scan_for_encoding): Use a locale-independent
check instead of isalnum. Don't upcase the result: the port code will
handle that.
* test-suite/tests/web-response.test ("example-1"): Adapt test to expect
normalized (upper-case) encoding for the response port.
* libguile/strings.c (scm_from_utf8_stringn):
* libguile/symbols.c (utf8_string_equals_wide_string): The "bad UTF8"
return from u8_mbtouc is a 0xfffd character, not a negative byte
length. Fixes a bug in which invalid UTF-8 would not be caught.
* libguile/bytevectors.c (scm_utf8_to_string): Use scm_from_utf8_stringn
directly. Just a little cleanup.
* test-suite/tests/iconv.test ("narrow non-ascii string"): Add test for
parsing bad utf-8 with substitution.
There is a failing test due to a scm_from_utf8_stringn bug brought out
by the iconv test that will be fixed in the next commit.
Conflicts:
libguile/deprecated.h
module/ice-9/deprecated.scm
* doc/ref/api-procedures.texi (Case-lambda): Expand case-lambda*
documentation.
* module/ice-9/eval.scm (primitive-eval):
* libguile/eval.c (prepare_boot_closure_env_for_apply): Dispatch to the
next case-lambda clause if there are too many positionals.
* doc/ref/vm.texi (Function Prologue Instructions):
* libguile/vm-i-system.c (bind-optionals/shuffle-or-br): New
instruction, like bind-optionals/shuffle but can dispatch to the next
clause if there are too many positionals.
* module/language/assembly/disassemble.scm (code-annotation):
* module/language/assembly/decompile-bytecode.scm (decode-load-program):
* module/language/assembly/compile-bytecode.scm (compile-bytecode): Add
case for bind-optionals/shuffle-or-br.
* module/language/glil/compile-assembly.scm (glil->assembly): If there
is an alternate, use bind-optionals/shuffle-or-br instead of
bind-optionals/shuffle.
* test-suite/tests/optargs.test ("case-lambda*"): Add tests.
* libguile/__scm.h:
* libguile/deprecated.h (SCM_CHAR_CODE_LIMIT): Move declaration here
from __scm.h.
* libguile/feature.c:
* module/ice-9/deprecated.scm (char-code-limit): Move definition here.
* test-suite/tests/regexp.test: Update to not use char-code-limit.
* libguile/posix.c (scm_open_process): Return the ports as values
instead of calling out to Scheme again to make-rw-port. This
function is private to (ice-9 popen).
* module/ice-9/popen.scm (open-pipe*): Adapt to change.
Fixes <http://bugs.gnu.org/13166>.
* libguile/simpos.c (scm_system_star): In the child, call `_exit'
instead of `SCM_SYSERROR' when `execvp' fails.
* test-suite/tests/posix.test ("system*"): New test prefix.
* libguile/numbers.c (scm_product): Avoid signed integer overflow, which
modern C compilers are allowed to assume will never happen, thus
allowing them to optimize out our overflow checks.
* test-suite/tests/numbers.test (*): Add tests.
* libguile/load.c (scm_ellipsis): New Variable.
(scm_parse_path_with_ellipsis): New procedure.
(scm_init_load): Initialize 'scm_ellipsis'.
(scm_init_load_path): Use 'scm_parse_path_with_ellipsis' to
handle GUILE_LOAD_PATH and GUILE_LOAD_COMPILED_PATH.
* libguile/load.h (scm_parse_path_with_ellipsis): Add prototype.
* doc/ref/guile-invoke.texi (Environment Variables):
doc/ref/api-evaluation.texi (Load Paths): Add documentation.
Correct description of default load path to reflect reality.
Remove 'GUILE_LOAD_PATH' from the concept index; it is already
in the variable index. Add cross references between these two
sections of the manual.
Fixes <http://bugs.gnu.org/12173>.
Reported by Ian Price <ianprice90@googlemail.com>.
* libguile/memoize.c (MAKMEMO_LAMBDA): New `docstring' parameter. Add
it as the second argument of `SCM_M_LAMBDA'. Update caller.
(memoize)[SCM_M_LAMBDA]: Extract docstring from EXP; when `memoize'
returns, add the docstring to the lambda's arguments.
(unmemoize)[SCM_M_LAMBDA]: Adjust to new argument layout of
`SCM_M_LAMBDA'.
* libguile/eval.c (BOOT_CLOSURE_NUM_REQUIRED_ARGS,
BOOT_CLOSURE_HAS_REST_ARGS, BOOT_CLOSURE_IS_REST,
BOOT_CLOSURE_PARSE_FULL): Adjust to new argument layout of
`SCM_M_LAMBDA'.
* module/ice-9/eval.scm (primitive-eval)[make-general-closure]:
Likewise.
[eval]: When EXP is a lambda, match its docstring; when the docstring
is not #f, add it to the closures procedure properties.
* test-suite/tests/eval.test ("docstrings"): New test prefix.
* libguile/procs.c (sym_documentation): Rename to...
(scm_sym_documentation): ... this. Make it global.
* libguile/procs.h (scm_sym_documentation): New declaration.
* libguile/dynl.c (system_extensions_path): New static variable.
(sysdep_dynl_link): If 'lt_dlopenext' fails, manually search
in 'system_extensions_path'.
(augment_env): Remove.
(sysdep_dynl_init): Don't change LD_LIBRARY_PATH, and don't use
lt_dladdsearchdir if GUILE_SYSTEM_EXTENSIONS_PATH is set. Instead,
initialize 'system_extensions_path' from GUILE_SYSTEM_EXTENSIONS_PATH
(or if it's unset: <SCM_LIB_DIR>:<SCM_EXTENSIONS_DIR>), and rely on
sysdep_dynl_link to search those directories manually.
Fixes <http://bugs.gnu.org/12477>.
Reported by lin ray <lin.wei.ray@gmail.com>.
* configure.ac: Define the `HAVE_FORK' Automake conditional.
* module/Makefile.am (ICE_9_SOURCES): Add `ice-9/popen.scm' only when
HAVE_FORK.
* libguile/posix.c (scm_init_posix): Register `scm_init_popen' only when
HAVE_FORK.