* libguile/ports.c (scm_putc, scm_puts):
* libguile/ports.h (scm_putc_unlocked, scm_puts_unlocked): Separate into
_unlocked and locked variants. Change all callers to use the
_unlocked versions.
* libguile/ports.c (scm_c_read_unlocked, scm_c_read, scm_getc_unlocked)
(scm_getc): Split getc and read operations into locked and unlocked
variants. Change most uses to use the _unlocked version.
* libguile/ports.h (scm_get_byte_or_eof_unlocked):
(scm_peek_byte_or_eof_unlocked): Rename, adding _unlocked.
* libguile/ports.c (scm_get_byte_or_eof, scm_peek_byte_or_eof): Add
locking implementations. Adapt callers to use _unlocked variants;
they will do locking.
* libguile/read.c (read_token, scm_read_semicolon_comment)
(scm_read_shebang): Use unlocked variants. We will add locking
later.
* libguile/ports.h:
* libguile/ports.c (scm_revealed_count, scm_set_port_revealed_x): Make
threadsafe.
(scm_adjust_port_revealed_x): New function, to adjust a port's
revealed count in a threadsafe way.
* libguile/ports.h: Slight reorder.
* libguile/ports.c: Reorder ports implementation to match the header
file. This will make it easier to add locking and _unlocked
variants.
* libguile/ports.h (SCM_PORT_DESCRIPTOR): New macro, to get at a port
descriptor in the third word of a port instead of looking it up in a
table.
(scm_c_port_type_ref, scm_c_port_type_add_x): New API for working with
numbered ptob descriptors.
(SCM_PTOBNAME): Implement in terms of scm_c_port_type_ref.
(scm_get_byte_or_eof, scm_peek_byte_or_eof): Use SCM_PORT_DESCRIPTOR.
* libguile/ports.c (scm_c_num_port_types, scm_c_port_type_ref)
(scm_c_port_type_add_x, scm_make_port_type): Protect scm_ptobs access
with a mutex. Have it be an array of pointers instead of an array of
structures. Adapt users to the new APIs.
(scm_c_make_port_with_encoding): Allocate ports with three words. The
third word is the ptob descriptor.
* libguile/backtrace.c:
* libguile/goops.c:
* libguile/ioext.c:
* libguile/print.c: Adapt to use scm_c_port_type_ref and
SCM_PORT_DESCRIPTOR.
* libguile/ports.h (scm_grow_port_cbuf, scm_pt_size, scm_pt_member):
Remove declarations of unimplemented functions. Move a couple of
other definitions around.
* libguile/ports.h (scm_c_lock_port, scm_c_try_lock_port)
(scm_c_unlock_port): New inline functions.
(scm_t_port): Add a lock field, if threads are enabled. This is a
first step towards threadsafe ports.
* libguile/ports.c (scm_c_make_port_with_encoding): Init the port's
lock.
* libguile/inline.c: Residualize the inline functions from ports.h.
* module/ice-9/psyntax.scm (chi-top-sequence): Detect bindings to
identifiers introduced by macros. In that case, in order to preserve
hygiene, uniquify the variable's name, but in a way that is
reproduceable (i.e., yields the same uniquified name after a
recompile).
* module/ice-9/psyntax.scm (id-var-name): For mapping identifiers to
toplevel definitions, also compare against the module.
(resolve-identifier): Pass the module to id-var-name when looking up
identifiers.
(free-id=?): Adapt to id-var-name change.
(chi-top-sequence): When adding a mapping from the given identifier
to a toplevel definition, make the name be a pair.
* module/ice-9/psyntax.scm (resolve-identifier): Take an additional
argument, indicating whether syntax parameters should be resolved or
not. Just return three values: the binding type and value, and the
module for resolving toplevels.
(chi-install-global): Take an extra arg, the type. If we are defining
a syntax parameter, construct a pair for the binding.
(chi-body): Syntax parameters now use a per-parameter unique value (a
pair) as a key in the expansion-time environment `r'.
(syntax-parameterize): Don't allow parameterization of
non-parameters. This is an incompatible change, but it is for the
better; you don't want to allow users to parameterize `lambda', after
all.
* module/ice-9/psyntax.scm (define-syntax-parameter): New toplevel form.
Will be used to implement syntax parameters, following Barzilay,
Culpepper, and Flatt's 2011 SFP workshop paper, "Keeping it Clean with
syntax-parameterize". Adds a new binding type and definition form.
* module/ice-9/psyntax.scm (id-var-name): Add a nice long comment.
(lookup): Remove, as it is no longer used.
(resolve-identifier): New helper, replaces most uses of id-var-name
then `lookup'.
(syntax-type, syntax, set!, fluid-let-syntax): Adapt to use
resolve-identifier.
(free-id=?): Adapt to id-var-name returning syntax objects.
* module/ice-9/psyntax.scm (chi-top-sequence): Reimplement, more like
chi-body. Instead of adding empty definitions to the toplevel, add
toplevel definitions to the wrap shared by all forms in the sequence.
* module/language/tree-il/primitives.scm (resolve-primitives!): Don't
resolve toplevels defined in the same compilation unit to primitives,
as it could be that the module doesn't have those bindings yet.
* libguile/throw.c (scm_exit_status): In one of my bogus patches, I
managed to make #<unspecified> reach this function, causing a segfault
on SCM_CAR. Refactor to be more robust.
* libguile/_scm.h (SCM_OBJCODE_MAJOR_VERSION): Bump the major version,
indicating the first incompatibility between 2.0 and 2.2.
* libguile/vm-i-scheme.c (string-length, string-ref, vector-length): New
instructions.
* module/language/tree-il/compile-glil.scm (*primcall-ops*): Add
primcall ops for the new instructions.
* module/language/tree-il/primitives.scm
(*interesting-primitive-names*, *effect-free-primitives*): Recognize
vector-length as an effect-free primitive.
* module/language/tree-il/primitives.scm (*primitive-expand-table*):
Remove a hack to compensate for the lack of a good inliner, now that
we do have a good inliner.
* module/language/tree-il/peval.scm (peval): Accessor primitives applied
to constants are pure if the call type-checks. Also, fold constants
in accessor primcalls.
* test-suite/tests/tree-il.test ("partial evaluation"): Fix the "yo"
test.
* libguile/hash.c (scm_raw_ihash): Rename from `hasher'. Remove the
modulo argument; we expect the caller to deal with that. Use
scm_i_hashq for immediates and non-immediate integers. Use
scm_raw_ihashq on pointers too. Update the vector and pairs hashing
code. There is still some work to do here.
(scm_ihashv, scm_ihash): Adapt.
* libguile/hash.c (JENKINS_LOOKUP3_HASHWORD2, narrow_string_hash)
(wide_string_hash, scm_string_hash, scm_i_string_hash)
(scm_i_latin1_string_hash): Replace our lame string hash with Bob
Jenkins' hash, treating each codepoint as a word, for the purposes of
the algorithm. There are probably more optimal hashes for our use
cases.
(scm_i_locale_string_hash): Remove optimization, as it wasn't used.
(scm_i_utf8_string_hash): Add a specialized implementation for utf8.
It's tricky but mostly just cut-and-paste.