1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-08 22:50:27 +02:00
Commit graph

18442 commits

Author SHA1 Message Date
Andy Wingo
e2fafeb901 Keywords have a tc7
* libguile/tags.h (scm_tc7_keyword): Allocate a tc7, so that the VM can
  have cheap keyword? tests.

* libguile/keywords.c:
* libguile/keywords.h: Adapt.

* libguile/goops.c (scm_class_of, scm_sys_goops_early_init): Capture
  <keyword>.

* libguile/print.c (iprin1): Inline keyword printer.

* libguile/evalext.c (scm_self_evaluating_p): Add keywords here.

* libguile/deprecated.h:
* libguile/deprecated.c (scm_tc16_keyword): Deprecate.

* module/language/cps/compile-bytecode.scm (compile-fun): Add keyword?
  case, and bitvector? case while we're at it.
* module/language/cps/effects-analysis.scm (define-primitive-effects):
  Add bytevector?, keyword?, and bitvector? cases.

* module/language/cps/primitives.scm (*branching-primcall-arities*): Add
  keyword?.

* module/language/cps/types.scm (bitvector?, keyword?, bytevector?): Add
  branch inferrers.

* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
  (*effect-free-primitives*):
  (*effect+exception-free-primitives*): Add bytevector?, keyword?, and
  bitvector?.

* module/oop/goops.scm (<keyword>): New class.

* module/system/base/types.scm (%tc7-keyword, cell->object): Add cases.

* module/system/vm/assembler.scm (br-if-keyword): New definition.
* module/system/vm/disassembler.scm (code-annotation): Add br-if-tc7
  case for keywords.

* test-suite/tests/types.test ("clonable objects"): Update now that
  keywords are cloneable.
2015-01-22 13:03:11 +01:00
Andy Wingo
27b3b5b92d Add allocate-struct, struct-ref, struct-set! instructions
* libguile/vm-engine.c (allocate-struct, struct-ref, struct-set!): New
  instructions, to complement their "immediate" variants.

* module/language/cps/compile-bytecode.scm (compile-fun):
* module/system/vm/assembler.scm (system): Wire up the new instructions.
2015-01-22 12:53:33 +01:00
Andy Wingo
678995ff79 Merge commit '5af307de43'
Conflicts:
	test-suite/tests/reader.test
2015-01-22 12:50:18 +01:00
Andy Wingo
24d4f029bf Merge commit 'b1451ad859' 2015-01-22 12:46:11 +01:00
Andy Wingo
5b7632331e Fix #:init-value on class-allocated slots
Allocating an instance of a class with a #:class or #:each-subclass slot
allocation should not re-initialize the class-allocated slot.  In Guile
1.8, this worked by effectively doing a slot-bound? within
%initialize-object.  In Guile 2.0 we instead initialize the slot when it
is allocated -- in compute-get-n-set.

* module/oop/goops.scm (compute-getters-n-setters): Don't set an
  init-thunk for class-allocated slots.
  (compute-get-n-set): Initialize class-allocated slots here, if an
  init-thunk or init-value are present.

* test-suite/tests/goops.test ("#:each-subclass"): Add test.
2015-01-22 12:40:43 +01:00
Ludovic Courtès
ed72201a79 Fix buffer overrun with unbuffered custom binary input ports.
Fixes <http://bugs.gnu.org/19621>.

Before that, in 'cbip_fill_input', BUFFERED would be set to 0 when
reading from 'scm_getc' et al, because 'shortbuf' was being used.  Thus,
we could eventually execute this line:

      /* Copy the data back to the internal buffer.  */
      memcpy ((char *) c_port->read_pos, SCM_BYTEVECTOR_CONTENTS (bv),
	      c_octets);

But 'read_pos' would quickly point to the fields beyond 'shortbuf',
thereby leading to a corruption of the 'scm_t_port' itself.

* libguile/r6rs-ports.c (cbip_setvbuf): When READ_SIZE is 0, keep using
  BV as the 'read_buf'.
  (cbip_fill_input): Adjust assertion to accept 'read_buf_size = 1'.
* test-suite/tests/r6rs-ports.test ("7.2.7 Input Ports")["custom binary
  input port unbuffered & 'get-string-all'", "custom binary input port
  unbuffered UTF-8 & 'get-string-all'"]: New tests.
2015-01-18 22:05:44 +01:00
Ludovic Courtès
e1d29ee4f7 Improve output of command-line errors.
* module/ice-9/command-line.scm (shell-usage): Add 'newline' call when
  FMT is true.
  (compile-shell-switches)[error]: Prepend "error: " and append "~%" to
  FMT.
  Use a lower-case message.
2015-01-13 09:30:08 +01:00
Ludovic Courtès
01a301d1b6 Optimize 'string-hash'.
This yields a 50% improvement on the "narrow string" benchmark of
'hash.bm', 41% on "wide string", and 76% on "long string".

* libguile/hash.c (scm_i_string_hash): Rewrite to avoid
  'scm_i_string_ref' calls.
2015-01-11 22:40:07 +01:00
Ludovic Courtès
87a8b56f8c Add 'string-hash' benchmarks.
* benchmark-suite/benchmarks/hash.bm: New file.
* benchmark-suite/Makefile.am (SCM_BENCHMARKS): Add it.
2015-01-11 22:37:00 +01:00
Ludovic Courtès
894d0b894d Deprecate 'scm_string_hash'.
This function has been unused internally for some time and is undocumented.

* libguile/hash.c (scm_string_hash): Wrap if #if SCM_ENABLE_DEPRECATED
  == 1.
* libguile/hash.h (scm_string_hash): Likewise, and replace SCM_API with
  SCM_DEPRECATED.
2015-01-11 22:11:17 +01:00
Ludovic Courtès
5943a62042 Optimize 'write' for strings.
This shows a 19% improvement on the "string without escapes"
micro-benchmark of 'write.bm', and 12% on "string with escapes".

* libguile/print.c (iprin1) <scm_tc7_string>: Replace 'scm_i_string_ref'
  loop with a call to 'write_string'.
  (display_character): Adjust description of return value in comment.
  (write_string): New function.
2015-01-11 21:57:54 +01:00
Ludovic Courtès
37b1453032 Avoid converting the 'mode' argument of 'open-file'.
* libguile/fports.c (scm_open_file_with_encoding): const-qualify 'md'
  and 'ptr'.  Add call to 'scm_i_try_narrow_string'.  Use
  'scm_i_string_chars' instead of 'scm_to_locale_string' plus '
  scm_dynwind_free'.
* test-suite/tests/ports.test ("invalid wide mode string",
  "valid wide mode string"): New tests.
2015-01-11 20:59:03 +01:00
Ludovic Courtès
cdcba5b2f6 statprof: 'statprof' and 'with-statprof' return the code's return values.
* module/statprof.scm (statprof): Return the return values of THUNK.
  (with-statprof): Adjust docstring accordingly.
* test-suite/tests/statprof.test ("return values"): New test.
* doc/ref/statprof.texi (Statprof): Adjust accordingly.
2015-01-11 20:44:44 +01:00
Ludovic Courtès
5d971db802 Improve deprecation message of 'scm_add_to_port_table'.
Reported by Thien-Thi Nguyen <ttn@gnu.org>.

* libguile/ports.c (scm_add_to_port_table): Mention
  'scm_new_port_table_entry'.
2015-01-09 15:47:15 +01:00
Mark H Weaver
015c3c08af Assembler: Cope with non-string port filenames.
Fixes <http://bugs.gnu.org/19354>.
Reported by Linas Vepstas <linasvepstas@gmail.com>.

* module/system/vm/assembler.scm (write-sources): Intern the filename
  only if it's a string.  (For sockets, the filename is a symbol).
2014-12-14 10:24:00 -05:00
Andy Wingo
95de4f52a8 Convert primitive-eval to "compile" its expressions to linked closures
* libguile/memoize.c (memoize): Fix meta on subsequent case-lambda
  clauses.

* module/ice-9/eval.scm (primitive-eval): Rewrite to compile expressions
  to thunks, to avoid runtime dispatch cost.
2014-12-10 17:32:16 +01:00
Andy Wingo
dc33a94502 Fix syntax.test
* test-suite/tests/syntax.test (exception:variable-ref): Change expected
  error.
2014-12-10 16:25:50 +01:00
Andy Wingo
5bfc0653d6 Minor evaluator tweaks
* libguile/eval.c (eval): Remove unused variable.
* libguile/memoize.c (unmemoize): Fix unmemoization.
* module/ice-9/eval.scm: Attempt to speed up common box-ref cases.
2014-12-07 19:03:19 +01:00
Andy Wingo
e6a42e6765 Simplify variable resolution in the evaluator
* libguile/expand.c (convert_assignment): Handle creation of the default
  lambda-case body here.

* libguile/eval.c (eval):
* module/ice-9/eval.scm (primitive-eval):

* libguile/memoize.h:
* libguile/memoize.c (MAKMEMO_BOX_REF, MAKMEMO_BOX_SET):
  (MAKMEMO_TOP_BOX, MAKMEMO_MOD_BOX): Refactor all global var resolution
  to go through "resolve".  Add "box-ref" and "box-set!".  Rename
  memoize-variable-access! to %resolve-variable, and don't be
  destructive.
2014-12-07 15:52:34 +01:00
Andy Wingo
a3cae847d0 Closure conversion in evaluator
* libguile/memoize.c (MAKMEMO_CAPTURE_ENV, push_nested_link)
  (push_flat_link, env_link_is_flat, env_link_vars)
  (env_link_add_flat_var, lookup, capture_flat_env, memoize): Capture
  flat environments around closures.
2014-12-07 09:34:22 +01:00
Andy Wingo
99fb07e19b Add capture-env to evaluator
* libguile/eval.c (eval):
* libguile/memoize.c (memoized_tags, unmemoize):
* libguile/memoize.h (SCM_M_CAPTURE_ENV):
* module/ice-9/eval.scm (primitive-eval): Add capture-env memoized
  expression type.
2014-12-06 19:43:24 +01:00
Ludovic Courtès
47ca15c7df build: Better handle substitutions in 'guile-2.0.pc' & co.
* meta/Makefile.am (dependency_substitutions): Use '|' as the separate
  instead of ','.  See <http://hydra.nixos.org/build/17684751>.
2014-12-06 15:57:23 +01:00
Andy Wingo
cfdc8416a2 Simplify the interpreter for trivial inits and no letrec
* libguile/memoize.c (FULL_ARITY): Serialize "ninits" and the unbound
  value instead of the init list.
  (memoize): Adapt to FULL_ARITY changes.  Remove LETREC case.
  (unmemoize): Adapt to memoized code change.

* libguile/eval.c (BOOT_CLOSURE_PARSE_FULL): Adapt to parse ninits and
  unbound instead of inits.
  (eval): Lexical-ref can no longer raise an error.
  (prepare_boot_closure_env_for_apply): Adapt to inits change.

* module/ice-9/eval.scm (primitive-eval): Adapt to ninits/unbound
  change.

* libguile/expand.c (expand_named_let): Fix lambda-case creation to make
  lists for opt and inits.
2014-12-05 16:54:35 +01:00
Andy Wingo
7974c57937 Assignment conversion in the interpreter
* libguile/expand.c (compute_assigned, convert_assignment)
  (scm_convert_assignment): New functions.

* libguile/expand.h: Declare scm_convert_assignment.

* libguile/memoize.c (scm_memoize_expression): Do assignment conversion
  before memoization.

* test-suite/tests/syntax.test ("letrec"): Detection of unbound letrec
  variables now works.
2014-12-05 11:45:36 +01:00
Ludovic Courtès
7c433cbbce build: Add missing substitutions for 'guile-2.0.pc'.
This is a followup to 5fac1a7.

* meta/Makefile.am (substitute): Add GUILE_* and LIBGUILE_* substitutions,
  and $(dependency_substitutions).
  (dependency_substitutions): New variable.
2014-12-03 23:09:12 +01:00
Ludovic Courtès
680135b6a3 doc: Clarify the unit of the 'offset' argument of 'seek'.
Reported in <http://bugs.gnu.org/18520>
by David Kastrup <dak@gnu.org>.

* doc/ref/api-io.texi (Random Access): Clarify the unit of the 'offset'
  argument to 'seek'.
2014-12-03 19:07:28 +01:00
Ludovic Courtès
5fac1a7ada Add the 'guild' and 'guile' variables to 'guile-2.0.pc'.
* configure.ac: Remove meta/guile-2.0.pc and
  meta/guile-2.0-uninstalled.pc from 'AC_CONFIG_FILES'.
* meta/Makefile.am (substitute): New variable.
  (guile-2.0.pc, guile-2.0-uninstalled.pc): New targets.
  (guile-config, guild): Use $(substitute) instead of duplicated sed
  script.
  (CLEANFILES): Add the .pc files.
* meta/guile-2.0.pc.in (bindir, guild, guile): New variables.
* doc/ref/libguile-parallel.texi (Parallel Installations): Document the
  'guild' and 'guile' pkg-config variables.
2014-12-03 18:59:36 +01:00
Ludovic Courtès
8cf2a7ba74 Update (system base lalr) from upstream.
Suggested by Jan Nieuwenhuizen <janneke@gnu.org>.

* module/system/base/lalr.upstream.scm: Update from
  <https://github.com/schemeway/lalr-scm.git>, commit 4c4f149.
2014-12-02 21:25:56 +01:00
Ludovic Courtès
7e466e0265 doc: Tell when 'GUILE_INSTALL_LOCALE' first appeared.
* doc/ref/guile-invoke.texi (Environment Variables): Add footnote about
  the Guile version where 'GUILE_INSTALL_LOCALE' appeared.
2014-12-02 21:25:56 +01:00
Chris Jester-Young
cffa9bd6a3 Implement SRFI 28: Basic Format Strings.
* module/srfi/srfi-28.scm: New module.
* module/Makefile.am (SRFI_SOURCES): Add srfi/srfi-28.scm.
* doc/ref/srfi-modules.texi (SRFI-28): New node.
2014-12-02 11:49:05 -05:00
Ludovic Courtès
d1447c717b doc: Clarify behavior of 'select' in the presence of signal interruptions.
Fixes <http://bugs.gnu.org/18988>.
Reported by Chris Vine <chris@cvine.freeserve.co.uk>.

* libguile/filesys.c (scm_select): Clarify handling of signal
  interruptions.
* doc/ref/posix.texi (Ports and File Descriptors): Adjust accordingly.
2014-11-20 21:32:44 +01:00
Rob Browning
136c3a4c4a Recognize m68k, s390x, and sh4 as compilation targets
* module/system/base/target.scm (cpu-endianness, triplet-pointer-size):
  Add cases for "m68k", "sh4", and "s390x".

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2014-11-19 14:07:10 +01:00
Mark H Weaver
ae6f77ddfa Fix bytevector-fill! to accept fill arguments greater than 127.
Fixes <http://bugs.gnu.org/19027>.

* libguile/bytevectors.c (scm_bytevector_fill_x): Accept fill arguments
  between -128 and 255.

* test-suite/tests/bytevectors.test ("2.2 General Operations"): Add
  tests.
2014-11-12 00:50:38 -05:00
Mark H Weaver
81d2c84674 Avoid signed overflow and use size_t in bytevectors.c.
* libguile/bytevectors.c (ULONG_MAX): Remove (unportable) fallback
  definition.  It is no longer used.
  (scm_make_bytevector): Use 'size_t' instead of 'unsigned' for
  indices.  Use 'scm_t_uint8' instead of 'signed char' for elements
  and c_fill.  Previously relied on GNU-C-specific behavior when
  casting integers in the range 128-255 to signed char.
  (GENERIC_INTEGER_ACCESSOR_PROLOGUE, INTEGER_LIST_TO_BYTEVECTOR)
  (scm_bytevector_eq_p, scm_bytevector_copy_x, scm_bytevector_copy)
  (scm_bytevector_to_u8_list, scm_u8_list_to_bytevector)
  (scm_bytevector_fill_x): Use 'size_t' instead of 'unsigned' for
  indices.  Use 'scm_t_uint8' for elements.
2014-11-12 00:37:00 -05:00
Mark H Weaver
fdd319e9bd Add SCM_VALIDATE_SIZE_COPY and SCM_NUM2SIZE.
* libguile/validate.h (SCM_VALIDATE_SIZE_COPY, SCM_NUM2SIZE): New
  macros.
2014-11-12 00:19:10 -05:00
Mark H Weaver
10679f4c59 Fix bytevector-copy when applied to SRFI-4 homogeneous numeric vectors.
Fixes <http://bugs.gnu.org/18866>.
Reported by tantalum <sph@posteo.eu>.

* libguile/bytevectors.c (scm_bytevector_copy): Always create a VU8
  bytevector.

* test-suite/tests/bytevectors.test: Add test.
2014-11-11 23:32:57 -05:00
Thomas Klausner
03242f398f Avoid bash-specific '==' comparison operator in guile.m4.
Fixes <http://bugs.gnu.org/18898>.

* meta/guile.m4 (GUILE_PROGS): Use '=' instead of the bash-specific '=='
  comparison operator in 'test' call.
2014-11-11 22:43:51 -05:00
Mark H Weaver
fda17c20a3 Fix strerror error handling when given a non-integer argument.
Fixes <http://bugs.gnu.org/18065>.
Reported and fixed by Glenn Michaels <gmichaels@Safe-mail.net>.

* libguile/error.c (scm_strerror): Convert the argument to a C integer
  outside of the critical section, to avoid deadlock on error.
* THANKS: Add Glenn Michaels to the fixes section.
2014-11-11 22:36:30 -05:00
Andy Wingo
3f826e3c9e texinfo: fix @url{@@} parsing
* module/texinfo.scm (texi-command-specs): The body of @url{} can have
  texinfo commands.

* test-suite/tests/texinfo.test ("test-texinfo->stexinfo"): Add tests.
2014-11-09 15:56:33 +00:00
Andy Wingo
18c44b29e4 web: Location header is URI-reference; better URI-reference support
* module/web/uri.scm (validate-uri): Add reference? keyword argument,
  for validating references.
  (build-uri): Clarify comments to indicate that the result is an
  absolute URI.
  (build-uri-reference): New interface, to build URI-references.
  (string->uri-reference): Rename from string->uri*.  Fix fragment
  parsing to not include the #.
  (string->uri): Adapt to string->uri-reference name change.

* module/web/request.scm (request-absolute-uri): Add default-scheme
  optional argument.  Use it if the request-uri has no scheme, or
  error.

* module/web/http.scm (write-uri): Reflow to use "when".  Fix writing of
  URI-reference instances.
  (declare-uri-reference-header!): Rename from
  declare-relative-uri-header!.  Use string->uri-reference.
  ("Location"): Declare as a URI-reference header, as per RFC 7231.

* module/web/client.scm (open-socket-for-uri): Handle the case in which
  there is no URI scheme.

* test-suite/tests/web-http.test:
* test-suite/tests/web-uri.test: Add tests.
2014-11-01 15:36:56 +01:00
Ludovic Courtès
a7bbba0583 Use on-stack or GC-managed memory in 'search-path'.
* libguile/load.c (stringbuf_free): Remove.
  (stringbuf_grow): Use 'scm_gc_malloc_pointerless' instead of 'scm_realloc'.
  (search_path): Use stack-allocated INITIAL_BUFFER instead of
  'scm_malloc'.  Remove use of 'stringbuf_free'.
2014-11-01 00:48:11 +01:00
Ludovic Courtès
9c5d6aa964 Reduce C heap allocations in 'search-path'.
* libguile/load.c (scm_c_string_has_an_ext): Rename to...
  (string_has_an_ext): ... this.  Add docstring.  Change
  'str' to be an SCM, and remove 'len' parameter.  Change loop body to
  use 'scm_string_suffix_p'.
  (search_path): Update accordingly.
2014-11-01 00:48:11 +01:00
Daniel Llorens
7f2c824551 Merge branch 'lloda-array-support' 2014-10-30 11:42:05 +01:00
Mark H Weaver
30c5982a95 i18n: Add HAVE_USELOCALE as a requirement for USE_GNU_LOCALE_API.
* configure.ac: Check for uselocale.
* libguile/i18n.c: Add HAVE_USELOCALE to the list of requirements
  before defining USE_GNU_LOCALE_API.
2014-10-14 20:36:19 -04:00
Mark H Weaver
b9ace68613 scm_boot_guile: Gracefully handle the case where argc == 0.
Fixes <http://bugs.gnu.org/18680>.
Reported by Nala Ginrut <nalaginrut@gmail.com>.

* libguile/init.c (scm_boot_guile): Do not canonicalize argv[0] unless
  argc > 0.
* THANKS: Add Nala Ginrut to the fixes section.
2014-10-10 23:31:55 -04:00
Mark H Weaver
6b47249a28 Thank Per Bothner.
* THANKS: Add Per Bothner to the "libraries" section (for SRFI-64).
2014-10-07 00:01:45 -04:00
Ludovic Courtès
449be2a5e5 build: Adjust autogen.sh to 'libtoolize' name on Darwin.
Reported by Daniel Llorens.

* autogen.sh: Use 'glibtoolize' on Darwin.
2014-10-06 15:23:10 +02:00
Mark H Weaver
5af307de43 read: Accept "\(" in string literals.
Suggested by David Kastrup <dak@gnu.org> in <http://bugs.gnu.org/13644>.

* libguile/read.c (scm_read_string_like_syntax): Accept "\(" as
  equivalent to "(".
* doc/ref/api-data.texi (String Syntax): Document it.
* test-suite/tests/reader.test ("reading"): Add test.
2014-10-01 21:00:23 -04:00
Mark H Weaver
b1451ad859 docs: Fix documented return type of 'scm_c_export'.
Fixes <http://bugs.gnu.org/17869>.
Reported and fixed by Alexei Matveev <alexei.matveev@gmail.com>.

* doc/ref/api-modules.texi (Accessing Modules from C): Change documented
  return type of 'scm_c_export' to 'void' to reflect reality.
* THANKS: Add Alexei Matveev to the fixes section.
2014-10-01 19:13:34 -04:00
Daniel Llorens
0f259045e1 Intern general arrays
* module/system/vm/assembler.scm (intern-constant, link-data): handle
  the array case.
2014-09-30 11:35:08 +02:00