* libguile/foreign.c (sym_null_pointer_error): New variable.
(null_pointer_error): New function.
(scm_foreign_set_x): Raise an error if attempting to modify
NULL_POINTER.
(scm_foreign_to_bytevector): Use `null_pointer_error ()' instead of
`scm_misc_error ()'.
* test-suite/tests/foreign.test: New file.
* test-suite/Makefile.am (SCM_TESTS): Add tests/foreign.test.
* test-suite/lib.scm (exception:null-pointer-error): New variable.
* libguile/foreign.c (scm_take_foreign_pointer): Allocate RET in
GC-scanned memory. This fixes a bug where the object pointed to by
SCM_CIF in the pair returned by `cif_to_procedure ()' would be
reclaimed (as a consequence of commit
087aa6aa31).
* libguile/modules.c (scm_module_reverse_lookup): Type-check VARIABLE.
Don't traverse the `uses' list when MODULE is #f.
* test-suite/tests/modules.test ("foundations")["module-reverse-lookup
[pre-module-obarray]", "module-reverse-lookup [wrong-type-arg]"]: New
tests.
char-set:ascii is the only char-set consisting of a single contiguous
range, and there was an off-by-one error for that case.
* libguile/unidata_to_charset.pl (compute): fix off-by-one
* libguile/array-map.c (array_compare, scm_array_equal_p): Rewrite as
something that operates on the generic array handle infrastructure.
Based on array->list.
(scm_i_array_equal_p): Change the docs, as array-equal? is now the same
as equal?, except that it typechecks its args.
* doc/ref/api-compound.texi (Array Procedures): Update array-equal?
docs.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_raequal): Deprecate.
* libguile/bytevectors.c (scm_bytevector_eq_p): Bugfix: bytevectors are
bytevector=? only if their element type is the same.
* libguile/eq.c (scm_equal_p): Only dispatch to scm_array_equal_p if
both args are arrays (generically).
* test-suite/tests/arrays.test ("equal?"): Add some more tests.
OK let's try again. While the thanks go to Daniel Llorens del Río for
the tip, the blame continues going to me :)
* test-suite/Makefile.am:
* test-suite/tests/arrays.test: Add a test.
* libguile/array-map.c (raeql): Handle a few 0-dimensional cases. If the
shapes of the arrays don't match, just return #f instead of raising
an error.
* libguile/eq.c (scm_equal_p): Only call scm_array_equal_p if both
arguments are generalized arrays; otherwise they are not equal. Thanks
to Daniel Llorens del Río for the tip.
* test-suite/Makefile.am:
* test-suite/tests/arrays.test: Add a test.
* libguile/load.c (scm_init_load): Initialize %load-should-autocompile
to false.
* libguile/init.c (scm_i_init_guile):
* libguile/load.h:
* libguile/load.c (scm_init_load_should_autocompile): At the end of
init, check GUILE_AUTO_COMPILE.
* libguile/script.c (scm_compile_shell_switches): Instead of making
--autocompile / --no-autocompile render into the s-expression, just
handle them immediately, so that --no-autocompile takes effect for the
expander.
* libguile/pairs.h (scm_is_null): Nil is also null.
* libguile/vm-i-scheme.c (not, not-not, null?, not-null?):
* libguile/vm-i-system.c (br-if-null, br-if-not-null): Remove some more
nil special cases.
* libguile/boolean.h (scm_is_false): Recognize nil as false, by default.
(scm_is_bool): Recognize nil as a boolean.
* libguile/boolean.c (scm_not, scm_boolean, scm_to_bool, scm_is_bool):
Adapt to treat nil as false.
* libguile/vm-i-system.c (br-if, br-if-not): Just use scm_is_false
instead of specifically mentioning nil.
* libguile/load.c (scm_init_load): Initialize %load-should-autocompile
from the environment variable here, so that apps that don't go through
scm_shell get autocompilation.
* libguile/script.c (scm_compile_shell_switches): Explicitly enable or
disable autocompilation here, if told to do so.
* libguile/gc-malloc.c: Update a comment.
(scm_must_free): Must be able to free memory allocated with
scm_must_malloc, and thus must be GC_FREE, not free.
This enables more efficient implementations of several operations,
e.g. scm_is_lisp_bool, canonicalize_boolean, fast_boolean_not,
converting SCM booleans to C booleans, etc.
* libguile/tags.h: Renumber IFLAGs.
* libguile/print.c: Renumber iflagnames to match.
* libguile/boolean.c:
* libguile/boolean.h:
SCM_XXX_ANOTHER_BOOLEAN_DONT_USE --> SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_0
* libguile/strings.c (scm_encoding_error): Change arguments to convey
more information. Raise the error with `scm_throw ()', passing all
the information to the handler.
(scm_from_stringn, scm_to_stringn): Update accordingly.
* test-suite/tests/ports.test ("string ports")["wrong encoding"]: Check
the arguments passed to the `throw' handler.
* test-suite/tests/r6rs-ports.test ("7.2.11 Binary
Output")["put-bytevector with wrong-encoding string port"]: Likewise.
* libguile/foreign.c (sym_null, null_pointer): New variables.
(scm_foreign_to_bytevector): Raise an error when PTR is NULL.
(scm_init_foreign): Define SYM_NULL.
* module/system/foreign.scm (%null-pointer): New exported binding.
* libguile/foreign.c (scm_make_foreign_function): Use
`scm_gc_malloc_pointerless ()' when allocating memory for CIF.
(pack): Likewise for the `FFI_TYPE_STRUCT' case.
* Makefile.am:
* libguile/Makefile.am (modincludedir): Install into
$pkgincludedir/$GUILE_EFFECTIVE_VERSION. This allows multiple Guile
development packages to be installed at once.
* guile-readline/Makefile.am (modincludedir):
* srfi/Makefile.am (srfiincludedir): Likewise.
* meta/guile-2.0.pc.in (Cflags): Add the appropriate -I line so that
user code picks up the new location transparently.
* libguile/Makefile.am (lib_LTLIBRARIES): Instead of just "libguile.la",
make "libguile-@EFFECTIVE_VERSION@.la". This allows multiple versions
of Guile to be installed at once. See
http://www106.pair.com/rhp/parallel.html for a rationale.
(libguile_@GUILE_EFFECTIVE_VERSION@_la_CFLAGS):
(libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES):
(EXTRA_libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES):
(libguile_@GUILE_EFFECTIVE_VERSION@_la_DEPENDENCIES):
(libguile_@GUILE_EFFECTIVE_VERSION@_la_LIBADD):
(libguile_@GUILE_EFFECTIVE_VERSION@_la_LDFLAGS): Fixup automake vars
to include the effective version.
(guile_LDADD): Fix up the spelling of libguile.
* libguile/bytevectors.c (scm_bootstrap_bytevectors):
* libguile/foreign.c (scm_register_foreign):
* libguile/i18n.c (scm_bootstrap_i18n):
* libguile/instructions.c (scm_bootstrap_instructions):
* libguile/objcodes.c (scm_bootstrap_objcodes):
* libguile/programs.c (scm_bootstrap_programs):
* libguile/vm.c (scm_bootstrap_vm): Register extensions using e.g.
"libguile-2.0" as the libname -- i.e., including the effective version
in the libname.
* module/ice-9/i18n.scm:
* module/rnrs/bytevector.scm:
* module/rnrs/io/ports.scm:
* module/system/foreign.scm:
* module/system/vm/instruction.scm:
* module/system/vm/objcode.scm:
* module/system/vm/program.scm:
* module/system/vm/vm.scm: When doing a load-extension for something in
Guile, use the effective version also.
* meta/guile-2.0-uninstalled.pc.in (Libs):
* meta/guile-2.0.pc.in (Libs): Use -lguile-@EFFECTIVE_VERSION@. This
change should mean that code built against Guile should not be
affected by the libguile rename.
* guile-readline/Makefile.am (libguilereadline_v_@LIBGUILEREADLINE_MAJOR@_la_LIBADD):
* srfi/Makefile.am
(libguile_srfi_srfi_1_v_@LIBGUILE_SRFI_SRFI_1_MAJOR@_la_LIBADD):
(libguile_srfi_srfi_4_v_@LIBGUILE_SRFI_SRFI_4_MAJOR@_la_LIBADD):
(libguile_srfi_srfi_13_14_v_@LIBGUILE_SRFI_SRFI_13_14_MAJOR@_la_LIBADD):
(libguile_srfi_srfi_60_v_@LIBGUILE_SRFI_SRFI_60_MAJOR@_la_LIBADD):
* test-suite/standalone/Makefile.am (test_num2integral_LDADD):
(test_round_LDADD):
(libtest_asmobs_la_LIBADD):
(libtest_ffi_la_LIBADD):
(test_list_LDADD):
(test_unwind_LDADD):
(test_conversion_LDADD):
(test_loose_ends_LDADD):
(test_scm_c_read_LDADD):
(test_scm_take_locale_symbol_LDADD):
(test_scm_take_u8vector_LDADD):
(libtest_extensions_la_LIBADD):
(test_with_guile_module_LDADD):
(test_scm_with_guile_LDADD): Fix up the spelling of libguile.la.
* libguile/version.c (scm_effective_version): Use SCM_EFFECTIVE_VERSION.
* libguile/version.h.in (SCM_EFFECTIVE_VERSION): Define from
GUILE_EFFECTIVE_VERSION.
* libguile/Makefile.am (version.h): Subst in GUILE_EFFECTIVE_VERSION.
* test-suite/tests/version.test ("version reporting works"): The
effective version is not necessarily MAJOR.MINOR. Remove check.
* libguile/vm-i-system.c (continuation_call): Sync before calling a
continuation. Shouldn't much matter, but it seems like a good idea.
(wind-fluids): More importantly, sync before allocating a with-fluids
object.
Thanks to Andy for noticing this.
* libguile/vm-engine.h (SYNC_REGISTER, CACHE_REGISTER): Add comment.
* libguile/vm-i-scheme.c (make_struct): Call `SYNC_REGISTER ()' in all
cases since the GC is going to run.
(struct_ref, struct_set): Call `SYNC_REGISTER ()' on the slow path.
(BV_REF_WITH_ENDIANNESS, BV_FIXABLE_INT_REF, BV_INT_REF): Likewise.
(BV_FLOAT_REF): Always `SYNC_REGISTER ()'.
* libguile/stacks.c (scm_sys_stacks): New global variable, moved here
from boot-9.scm.
(scm_init_stacks): Define scm_sys_stacks to %stacks.
(stack_depth): Remove narrowing by frame pointer.
(find_prompt): New helper.
(narrow_stack): Clean up a bit, and allow narrowing by prompt tag.
(scm_make_stack): Update docs, and use scm_stack_id to get the stack
id.
(scm_stack_id): The current stack id may be fetched as the cdar of
%stacks.
(stack_id_with_fp): Remove helper.
* module/ice-9/boot-9.scm (%start-stack): Fix indentation.
(%stacks): Remove definition, it's in stacks.c now.
(default-pre-unwind-handler): Narrow by another frame.
(save-stack): Remove special handling for certain stack ids, as it is
often possible that the function isn't on the stack -- in the
interpreter, or after a tail call. Better to narrow by prompt ids.
* module/system/vm/debug.scm (print-frames): Change to operate on a
vector of frames.
(run-debugger): Change to receive a vector of frames. The debugger
also has the full stack, so it can re-narrow (or widen) to get the
whole stack, if the user wants.
(stack->vector): New helper.
(debug-pre-unwind-handler): Narrow by more frames, and to the most
recent start-stack invocation. Adapt to run-debugger change.
* module/ice-9/control.scm (%): Add a single-argument case, which
instates a default prompt with a default handler.
* libguile/script.c (scm_compile_shell_switches): Wrap user programs in
a default prompt.
* module/system/repl/common.scm (repl-eval): REPL expressions are user
programs too; wrap each one in a default prompt.
* libguile/control.c (scm_c_abort): Change error string if a prompt
isn't found.
* test-suite/tests/control.test ("abort to unknown prompt"): New test.
* libguile/control.h (scm_sys_default_prompt_tag):
* libguile/control.c (scm_init_control): Remove the logic that defined
%default-prompt-tag.
(scm_c_abort): Remove check for default prompt tag, it wasn't useful.
* libguile/throw.c (sym_pre_init_catch_tag): Define as the pre-init
prompt tag.
(pre_init_catch, pre_init_throw): Use sym_pre_init_catch_tag.
* module/ice-9/boot-9.scm (default-prompt-tag): Define as a simple
value, not a fluid. Perhaps we can expose it as a fluid later.
* libguile/debug.h:
* libguile/debug.c (scm_sys_start_stack): Removed, we implement this in
Scheme now.
* libguile/vm.h:
* libguile/vm.c (scm_vm_call_with_new_stack): Likewise removed.
* module/ice-9/boot-9.scm (%start-stack): Implement in terms of prompts.
(%stacks): New fluid, for tracking active stacks.
(start-stack): Implement using syntax-rules.
* libguile/fluids.c: Remove outdated comment on the complexity of fluid GC.
(FLUID_GROW): Increase to 128.
(allocated_fluids): Change to `void **'.
(allocated_fluids_num): Remove.
(grow_dynamic_state): Remove race-condition checker. Grow to
ALLOCATED_FLUIDS_LEN.
(next_fluid_num): Rename to...
(new_fluid): ... this. Return a fluid instead of a fluid number.
Assume ALLOCATED_FLUIDS is sparse and search for a free number in it.
Make ALLOCATED_FLUIDS point to pointerless memory and initialize
individual elements with a pointer to the new fluid. Register a
disappearing link from there to the fluid.
(scm_make_fluid): Use `new_fluid ()'.
(scm_fluid_ref, scm_fluid_set_x, scm_i_swap_with_fluids): Remove
assertion that wasn't checked in a thread-safe way.