* libguile/numbers.c (scm_logand): Fix a type error (comparing a SCM
against an int, when we really wanted to compare the unpacked
fixnum).
* libguile/ports.c (scm_i_set_conversion_strategy_x): Check
scm_conversion_strategy_init, not scm_conversion_strategy.
* libguile/read.c (recsexpr): Fix loops to avoid strange test of SCM
values.
* libguile/tags.h (SCM_MAKE_ITAG8_BITS): New helper, produces a
scm_t_bits instead of a SCM, because SCM_UNPACK is not a constant
expression with SCM_DEBUG_TYPING_STRICTNESS==2.
(SCM_MAKIFLAG_BITS): Remove SCM_MAKIFLAG, and replace with this, which
returns bits.
(SCM_BOOL_F_BITS, SCM_ELISP_NIL_BITS, SCM_EOL_BITS, SCM_BOOL_T_BITS):
(SCM_UNSPECIFIED_BITS, SCM_UNDEFINED_BITS, SCM_EOF_VAL_BITS):
(SCM_UNBOUND_BITS): New definitions. Defined SCM_BOOL_F, etc in terms
of them.
(SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_0):
(SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_1):
(SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_2):
(SCM_XXX_ANOTHER_LISP_FALSE_DONT_USE): Be bits instead of SCM values.
(SCM_BITS_DIFFER_IN_EXACTLY_ONE_BIT_POSITION):
(SCM_BITS_DIFFER_IN_EXACTLY_TWO_BIT_POSITIONS): Rename from
SCM_VALUES_DIFFER_..., and take unpacked bits as the args.
* libguile/boolean.c: Update verify block to use
SCM_BITS_DIFFER_IN_EXACTLY_TWO_BIT_POSITIONS et al.
* libguile/debug.c (scm_debug_opts):
* libguile/print.c (scm_print_opts):
* libguile/read.c (scm_read_opts): Use iflags bits for initializers.
* libguile/hash.c (scm_hasher): Use _BITS for iflags as case labels.
* libguile/pairs.c: Nil/null compile-time check uses
SCM_ELISP_NIL_BITS.
* libguile/tags.h (SCM): For SCM_DEBUG_TYPING_STRICTNESS==2, give the
union a tag, and use C99 compound literals to construct the value.
This allows SCM_PACK to be a constant expression.
* libguile/snarf.h: Allow SCM_SUPPORT_STATIC_ALLOCATION for
SCM_DEBUG_TYPING_STRICTNESS==2.
(SCM_IMMUTABLE_STRING): Properly parenthesize the string length.
(SCM_STATIC_PROGRAM): Fix for SCM_DEBUG_TYPING_STRICTNESS==2.
* module/ice-9/vlist.scm (vlist-fold-right): Avoid `vlist-reverse' and
instead `vlist-ref' individual elements. The result is about twice
faster. Thanks Andy for suggesting it indirectly. :-)
* libguile/foreign.c (pack): Add `return_value_p' parameter. Update
callers.
When RETURN_VALUE_P is true, assume LOC points to an `ffi_arg', and
cast its results to the relevant type. This fixes packing of integer
return values smaller than `int' on SPARC64 and PowerPC64. Reported
by Nelson H. F. Beebe <beebe@math.utah.edu>.
* module/language/glil/compile-assembly.scm: Clean up code for
subprograms (not needed, we just cache the glil) and object alists
(replaced by constants tables).
* module/language/glil/compile-assembly.scm (compile-assembly): Rework
to handle toplevel-specific code generation here, instead of in
glil->assembly. Specifically, here we build a global constant table,
and arrange for it to be the objtable of the toplevel thunk.
(compile-program): New helper, compiles a <glil-program> and returns
just the (load-program ...) form.
(compile-objtable): New helper, generates assembly to build an object
table, using some other constants table, and possibly recursing to
`compile-program' for cached GLIL programs.
(glil->assembly): Simplify, removing the toplevel? argument, and
replacing the object alist with an objtable computed in a previous
pass. Adapt to the new form of the objtable, and to use
compile-program and compile-objtable.
* module/language/glil/compile-assembly.scm (dump-constants): New
helper. Generates bytecode that will result in a vector for the
global object table being pushed on the stack. The items in the
global object table will share state as much as possible.
* module/language/glil/compile-assembly.scm (immediate?): New helper.
(build-constant-store): New helper. Walks the GLIL tree and builds up
a constant table, as a vhash.
(build-object-table): Another helper, builds a constant table for a
given GLIL program.
* module/rnrs/io/ports.scm (display): Implement as an
exception-converting wrapper around Guile's core display.
* module/rnrs/io/simple.scm: Don't export Guile's corresponding core
procedures, but use `(rnrs io ports)' instead. This way, we get the
conditions required by R6RS raised.
* doc/ref/r6rs.texi (rnrs io simple): Mention that these procedures are
supposed to raise R6RS conditions.
Thanks to Mark H. Weaver for pointing this out.
* libguile/ports.c (CONSUME_PEEKED_BYTE): New macro.
(get_utf8_codepoint): New variable `pt'. Use
`scm_peek_byte_or_eof'/`CONSUME_PEEKED_BYTE' pairs instead of
`scm_get_byte_or_eof'.
* test-suite/tests/ports.test ("string ports")[#xc2 #x41 #x42, #xe0 #xa0
#x41 #x42, #xf0 #x88 #x88 #x88]: Fix to conform to Unicode 6.0.0.
[#xe0 #x88 #x88]: Remove test.
[#xf0 #x80 #x80 #x41]: New test.
* libguile/inline.h (scm_get_byte_or_eof): Add `SCM_UNLIKELY' for EOF.
(scm_peek_byte_or_eof): New function.
* libguile/r6rs-ports.c (scm_lookahead_u8): Use `scm_peek_byte_or_eof'.
* module/srfi/srfi-1.scm (map-in-order): As we are not extending the
core `map' binding, actually make a new `map-in-order' alias here.
Fixes fresh builds.
* libguile/ports.c (update_port_lf): Handle EOF.
(get_utf8_codepoint, get_iconv_codepoint): New functions.
(get_codepoint): Use them.
(scm_i_set_port_encoding_x): Don't open conversion descriptors when
ENCODING is "UTF-8".
* libguile/print.c (display_string_as_utf8, display_string_using_iconv):
New functions.
(display_string): Use them.
* test-suite/tests/ports.test ("string ports")[#xc2 #x41 #x42]: Add a
note that this is not the wrong behavior per Unicode 6.0.0.
* libguile/__scm.h (SCM_ASYNC_TICK_WITH_CODE): Redefine to take a
scm_i_thread* as well. OK to do because it's within a
BUILDING_LIBGUILE block.
* libguile/vm-engine.c (vm_engine): Cache the scm_i_thread* instead of
the dynstate, so we can use the thread for ticks.
* libguile/vm-engine.h (VM_HANDLE_INTERRUPTS): Tick with the
scm_i_thread* local var, to avoid excessive tls calls.
* libguile/vm-i-system.c: Fix dynstate users to use
current_thread->dynamic_state.
* module/ice-9/boot-9.scm (map, for-each): Implement in Scheme instead
of C. There are boot versions before `cond' is defined.
(map-in-order): Define this alias here instead of in evalext.h.
* libguile/eval.c: Stub out the map and for-each definitions to just
call into Scheme.
* libguile/evalext.c: Remove map-in-order definition.
* module/srfi/srfi-1.scm: Replace all calls to map1 with calls to map.
(map, for-each): Define implementations here, in Scheme, instead of in
C.
* test-suite/tests/eval.test (exception:wrong-length, "map"): Update the
expected exception for mapping over lists of different lengths.
* libguile/srfi-1.h:
* libguile/srfi-1.c: Remove map and for-each definitions. Remove the
bit that extended the core `map' primitive with another method: the
right way to do that is with modules.
* libguile/list.c (scm_memq, scm_memv): Inline the tortoise/hare check
that scm_ilength does, via SCM_VALIDATE_LIST, into the memq/memv
bodies. Avoids traversing these lists twice.
* libguile/vm-engine.c (VM_CHECK_OBJECT, VM_CHECK_FREE_VARIABLES): Set
to 0 for both engines. These are really internal debugging variables,
which don't affect user-visible features, provided that the compiler
is correct of course.
(VM_CHECK_UNDERFLOW): New var, also off by default: whether to check
for stack underflow when popping values.
(vm_engine): Don't declare object_count if we are not checking object
table accesses.
* libguile/vm-engine.h (CACHE_PROGRAM): Don't muck with object_count
if we are not checking object table accesses.
(CHECK_UNDERFLOW, PRE_CHECK_UNDERFLOW): Nop out if we are not checking
underflow.
(POP2, POP3): New macros which check for underflow before popping more
than one value.
* libguile/vm-i-loader.c (load_array):
* libguile/vm-i-scheme.c (set_car, set_cdr, vector_set, slot_set)
(BV_SET_WITH_ENDIANNESS, BV_FIXABLE_INT_SET, BV_INT_SET)
(BV_FLOAT_SET):
* libguile/vm-i-system.c (partial_cont_call, fix_closure, prompt)
(fluid_set): Use POP2 / POP3.
(local_set, long_local_set): Pop to locals instead of using values on
the stack then dropping; allows for underflow to be checked before the
value is accessed.
(BR): Don't NULLSTACK or DROP after the operation.
(br_if, br_if_not, br_if_eq, br_if_not_eq, br_if_null)
(br_if_not_null): Pop to locals before doing the compare and jump.
* libguile/srfi-1.c:
* libguile/srfi-1.h (scm_srfi1_member): Move implementation to Scheme.
* module/srfi/srfi-1.scm (member): Implement here, with the inlining
cases for eq? and eqv?. Speeds up a compiled bootstrap of
psyntax.scm, because lset-adjoin inlines to the memq case.
(lset<=): Reindent.
(lset-adjoin, lset-union): If the comparator is eq? or eqv?, just pass
it through to `member', so we inline to memq / memv. Use something
closer to the reference implementations.
* module/language/assembly/compile-bytecode.scm (compile-bytecode):
Rewrite to fill a bytevector directly, instead of using bytevector
ports. `write-bytecode' itself is still present and almost the same
as before; it's just that `write-byte' et al now inline the effect of
writing a byte to a binary port.
* test-suite/tests/asm-to-bytecode.test (comp-test): Refactor to use
public interfaces.
* module/language/assembly.scm (byte-length): Silly, minor tweak: put
the fixed-length instruction case first. Seems to shave some 10% off
the time compiling psyntax.scm (when the whole rest of the system is
compiled, of course).
* module/statprof.scm (statprof-reset): Make full-stacks? into an
optional arg instead of doing the rest arg dance.
(statprof-display): Format gc-time-taken appropriately.
* test-suite/tests/ports.test ("string ports")[make-peek+read-checks]:
New macro.
[test-decoding-error]: Change to take a list of expected characters or
conditions. Use `make-peek+read-checks' to generate a `peek-char'
test.
[(#xc2 #x41 #x42), (#xe0 #xa0 #x41 #x42)]: New tests.
* libguile/gc.c (scm_gc_stats): Set the gc-time-taken entry to our
recorded value.
(start_gc_timer, accumulate_gc_timer, scm_init_gc): Arrange to record
a conservative estimate of time spent in GC.
* libguile/stime.h (SCM_TIME_UNITS_PER_SECOND): Redefine to point to a C
variable instead of being a pure preprocessor thing. This has the
possibility to break existing compiled C extensions' interpretation of
the internal-time-units-per-second, but hopefully there's no too much
of that code out there, and in the worst case they can just
recompile. Scheme code will get it right without the need to
recompile.
* libguile/stime.c (TIME_UNITS_PER_SECOND): New local define, and
increase to nanosecond resolution if we are on a system in which this
is useful and practical.
(time_from_seconds_and_nanoseconds): New helper.
(get_internal_real_time, get_internal_run_time): New global vars:
function pointers.
(get_internal_real_time_posix_timer):
(get_internal_run_time_posix_timer):
(get_internal_real_time_gettimeofday):
(get_internal_run_time_times):
(get_internal_real_time_fallback): Various implementations.
(scm_get_internal_real_time): Return the get_internal_real_time()
result.
(scm_c_get_internal_run_time): Likewise.
(scm_gettimeofday): No need for a critical section, and remove
obsolete ftime block.
(scm_init_stime): Init all of the new time bases, and decide on
implementations of real time and run time accessors.
* acinclude.m4 (gl_CLOCK_TIME):
* configure.ac: Locally include gl_CLOCK_TIME. To be fixed properly
when gnulib updates their license to reflect the actual BSD state of
things.
* libguile/Makefile.am (libguile_@GUILE_EFFECTIVE_VERSION@_la_LDFLAGS):
Add -lrt for clock_gettime, if needed.
* meta/guile-2.0-uninstalled.pc.in:
* meta/guile-2.0.pc.in: Likewise, in Libs.private.
* module/ice-9/r4rs.scm (call-with-input-file, call-with-output-file): Rewrite
with call-with-values.
(with-input-from-file): use call-with-input-file.
(with-output-to-file, with-error-to-file): use call-with-output-file.
Update docstrings to make clear that multiple values may be yielded.
* libguile/goops.h:
* libguile/goops.c (scm_i_define_class_for_vtable): New internal helper,
defines a class for a vtable, relying on the name slot being set
correctly.
(scm_class_of, create_struct_classes): Use the local vtable-to-class
map instead of scm_struct_table.
* libguile/struct.h (SCM_STRUCT_TABLE_NAME, SCM_SET_STRUCT_TABLE_NAME)
(SCM_STRUCT_TABLE_CLASS, SCM_SET_STRUCT_TABLE_CLASS, scm_struct_table)
(scm_struct_create_handle): Deprecate these internals of the map
between structs and classes.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_struct_create_handle): Deprecated code over
here now.
* libguile/hashtab.c (scm_hashq_get_handle, scm_hashq_create_handle_x)
(scm_hashv_get_handle, scm_hashv_create_handle_x)
(scm_hash_get_handle, scm_hash_create_handle_x)
(scm_hashx_get_handle, scm_hashx_create_handle_x): Don't allow these
functions to be called on weak hash tables, as we have no idea when
the GC will null out fields of the handle, and set-cdr! won't register
disappearing links, and set-car! would never work of course.
* libguile/objprop.c (scm_object_property_set_x): Use ref and set!
instead of create-handle and set-cdr!, as it is a weak hash table.
(scm_set_object_properties_x): Likewise.
* libguile/deprecated.c (scm_primitive_property_ref)
(scm_primitive_property_set_x): Avoid getting handles to elements in a
weak hash table, as that's not going to work very well.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_whash_get_handle, SCM_WHASHFOUNDP)
(SCM_WHASHREF, SCM_WHASHSET, scm_whash_create_handle)
(scm_whash_lookup, scm_whash_insert): Deprecate this API.
* libguile/srcprop.c:
* libguile/srcprop.h:
* libguile/read.c (scm_read_sexp): Use the hashq API instead of the
whash API.
* libguile/hashtab.c (set_weak_cdr, scm_hash_fn_set_x): If we have a
weak-value hash table with a previous non-immediate value for a given
key, and we are setting an immediate as the new value, we were not
unregistering the disappearing link. Fixed.