1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-06 04:00:26 +02:00
Commit graph

1088 commits

Author SHA1 Message Date
Andy Wingo
fd5e69d3c1 Sports refactor
* module/ice-9/sports.scm (port-advance-position!): Factor out to a
  helper.
  (read-char): Use port-advance-position!.
2016-05-22 13:42:00 +02:00
Andy Wingo
1852633a9b Add install-sports!, uninstall-sports! functions
* module/ice-9/sports.scm (install-sports!, uninstall-sports!): New
  functions.
2016-05-20 23:15:50 +02:00
Andy Wingo
534139e458 Support for non-blocking I/O
* doc/ref/api-io.texi (I/O Extensions): Document read_wait_fd /
  write_wait_fd members.
  (Non-Blocking I/O): New section.
* libguile/fports.c (fport_read, fport_write): Return -1 if the
  operation would block.
  (fport_wait_fd, scm_make_fptob): Add read/write wait-fd
  implementation.
* libguile/ports-internal.h (scm_t_port_type): Add read_wait_fd /
  write_wait_fd.
* libguile/ports.c (default_read_wait_fd, default_write_wait_fd): New
  functions.
  (scm_make_port_type): Initialize default read/write wait fd impls.
  (trampoline_to_c_read, trampoline_to_scm_read)
  (trampoline_to_c_write, trampoline_to_scm_write): To Scheme, a return
  of #f indicates EWOULDBLOCk.
  (scm_set_port_read_wait_fd, scm_set_port_write_wait_fd): New
  functions.
  (port_read_wait_fd, port_write_wait_fd, scm_port_read_wait_fd)
  (scm_port_write_wait_fd, port_poll, scm_port_poll): New functions.
  (scm_i_read_bytes, scm_i_write_bytes): Poll if the read or write would
  block.
* libguile/ports.h (scm_set_port_read_wait_fd)
  (scm_set_port_write_wait_fd): Add declarations.
* module/ice-9/ports.scm: Shunt port-poll and port-{read,write}-wait-fd
  to the internals module.
* module/ice-9/sports.scm (current-write-waiter):
  (current-read-waiter): Implement.
* test-suite/tests/ports.test: Adapt non-blocking test to new behavior.
* NEWS: Add entry.
2016-05-20 14:57:27 +02:00
Andy Wingo
e32dcf214e Test Scheme port implementation
* module/ice-9/ports.scm: Add port-decode-char to internals export
  list.
* test-suite/Makefile.am:
* test-suite/tests/sports.test: Add new test.
2016-05-16 14:04:54 +02:00
Andy Wingo
1e058add7b U+FFFD is the input substitution character
* libguile/ports.c (UNICODE_REPLACEMENT_CHARACTER):
* libguile/ports.c (peek_utf8_codepoint)
  (scm_port_decode_char, peek_iconv_codepoint):
* module/ice-9/sports.scm (peek-char-and-len/utf8):
  (peek-char-and-len/iconv): Return U+FFFD when we get a decoding error
  when reading, instead of '?', in accordance with Unicode
  recommendations.
* test-suite/tests/iconv.test:
* test-suite/tests/ports.test:
* test-suite/tests/rdelim.test: Update tests.
* NEWS: Update.
2016-05-16 10:48:35 +02:00
Andy Wingo
704c42870d Add (ice-9 sports) module
* module/ice-9/sports.scm: New module.
* module/Makefile.am (SOURCES): Add new module.
2016-05-13 09:22:36 +02:00
Andy Wingo
d1bb400c3f Beginnings of shunting ports-in-scheme off to a module
* libguile/ports.c (scm_specialize_port_encoding_x): Add some sanity
  checks.
  (scm_unget_bytes): Use scm_expand_port_read_buffer_x.
  (port_clear_stream_start_for_bom_read): Use
  scm_specialize_port_encoding_x.
  (scm_fill_input): Use scm_expand_port_read_buffer_x.
  (scm_expand_port_read_buffer_x): Rename from
  scm_set_port_read_buffer_x and actually expand the buffer.
* libguile/ports.h: Adapt to scm_expand_port_read_buffer_x change.

* module/ice-9/ports.scm: Remove ports-in-scheme stuff, and instead
  expose the ports internals via an auxiliary module.  This will let
  ports-in-scheme live in a module during Guile 2.2.
2016-05-13 09:09:42 +02:00
Andy Wingo
df0dade9b7 Implement lookahead-u8, get-u8 in Scheme
* module/ice-9/ports.scm (%lookahead-u8, %get-u8): Scheme
  implementations.
2016-05-12 08:57:01 +02:00
Andy Wingo
a8fe0f42f3 %read-char speedup
* module/ice-9/ports.scm (%read-char): Always call update-position! with
  the same continuation, so that it will contify.
2016-05-10 16:30:50 +02:00
Andy Wingo
d28d1a57bf Implement read-char in Scheme.
* module/ice-9/ports.scm (%read-char): New function.
2016-05-10 15:38:30 +02:00
Andy Wingo
ab21af544a %peek-char port argument optional.
* module/ice-9/ports.scm (%peek-char): Port argument is optional.
2016-05-10 15:38:11 +02:00
Andy Wingo
3ccfa213c1 peek-char-and-len/iconv uses both returns from fill-input
* module/ice-9/ports.scm (peek-char-and-len/iconv): Use buffered value
  from fill-input.
2016-05-10 15:37:42 +02:00
Andy Wingo
9c02ede07e Fix bad-utf8-len bug.
* module/ice-9/ports.scm (bad-utf8-len): Fix bug.
2016-05-10 15:37:11 +02:00
Andy Wingo
0dd18191bc clear-stream-start-for-bom-read refactor
* module/ice-9/ports.scm (clear-stream-start-for-bom-read): Use the
  "buffered" value that fill-input returns.
2016-05-10 15:36:31 +02:00
Andy Wingo
837a7e0810 Scheme peek-char can handle iconv encodings
* module/ice-9/ports.scm (peek-char-and-len/iconv): Fully implement.
2016-05-10 12:48:10 +02:00
Andy Wingo
d77b50476a Speed refactors to Scheme %peek-char
* module/ice-9/ports.scm (peek-bytes): New helper.
  (peek-byte): Use peek-bytes helper.
  (decoding-error): Don't inline; no need.
  (decode-utf8, bad-utf8-len): New helpers.
  (peek-char-and-len/utf8): Use new helpers.
  (peek-char-and-len): No fast paths, and not inline.  Peek-char has its
  own fast path.
  (%peek-char): Use helpers to make fast path.
2016-05-07 12:41:07 +02:00
Andy Wingo
bed7bdc19c Fix use of port-encoding
* module/ice-9/ports.scm (clear-stream-start-for-bom-read): Fix to use
  %port-encoding, which works in symbols.
2016-05-05 23:03:04 +02:00
Andy Wingo
0b4b4db9fa Speed up peek-char
* module/ice-9/ports.scm (peek-char-and-len): Only inline fast path for
  UTF-8.
2016-05-05 22:57:33 +02:00
Andy Wingo
6d15a71e8f Port to Scheme of new BOM handling
* libguile/ports.c (scm_specialize_port_encoding_x)
  (scm_port_clear_stream_start_for_bom_read): New functions exported
  to (ice-9 ports).
* module/ice-9/ports.scm (clear-stream-start-for-bom-read):
  (fill-input, peek-char-and-len): Rework to handle BOM in fill-input
  instead of once per peek-char.
2016-05-05 22:54:58 +02:00
Andy Wingo
d7a111b0ec Spead tweaks to Scheme peek-char
* module/ice-9/ports.scm: Speed tweaks to %peek-char.  Ultimately
  somewhat fruitless; I can get 1.4s instead of 1.5s by only
  half-inlining the UTF-8 case though.
2016-05-04 12:40:27 +02:00
Andy Wingo
2ba638092f Initial peek-char implementation in Scheme
* module/ice-9/ports.scm (EILSEQ, decoding-error, peek-char-and-len/utf8):
  (peek-char-and-len/iso-8859-1, peek-char-and-len/iconv):
  (peek-char-and-len, %peek-char): New definitions.  Missing iconv1 for
  peek-char, but enough to benchmark.
2016-05-04 11:48:05 +02:00
Andy Wingo
36e32138f8 Port refactors to help Scheme peek-char
* libguile/ports.h (scm_sys_port_encoding, scm_sys_set_port_encoding):
  New functions, to expose port encodings as symbols directly to (ice-9
  ports).
  (scm_port_maybe_consume_initial_byte_order_mark): New function.
* libguile/ports.c (scm_port_encoding): Dispatch to %port-encoding.
  (scm_set_port_encoding_x): Dispatch to %set-port-encoding!.
  (port_maybe_consume_initial_byte_order_mark): New helper, factored out
  of peek_codepoint.
  (scm_port_maybe_consume_initial_byte_order_mark, peek_codepoint): Call
  port_maybe_consume_initial_byte_order_mark.
* module/ice-9/ports.scm (port-encoding): Implement in Scheme.
2016-05-04 11:47:42 +02:00
Andy Wingo
422f65fe09 Minor tweak to Scheme peek-byte.
* module/ice-9/ports.scm (peek-byte): Use second return from
  fill-input.
2016-05-01 22:00:37 +02:00
Andy Wingo
4ba59e94f9 Changes to Scheme fill-input corresponding to C
* module/ice-9/ports.scm (fill-input): Rewrite to make changes like the
  ones made to the C scm_fill_input: allow callers to specify a minimum
  amount of buffering.
2016-05-01 21:57:32 +02:00
Andy Wingo
6a752bcf2a peek-byte in Scheme
* libguile/ports.c (trampoline_to_c_read, trampoline_to_c_write): Since
  C might assume that the indices are within bounds of the bytevector,
  verify them more here.
  (scm_port_random_access_p, scm_port_read_buffering)
  (scm_set_port_read_buffer, scm_port_read, scm_port_write): New helpers
  exposed to (ice-9 ports).
  (scm_port_read_buffer, scm_port_write_buffer): Don't flush or validate
  port mode; we do that in Scheme.
* module/ice-9/ports.scm: Implement enough of port machinery to
  implement peek-byte in Scheme.  Not yet exported.
2016-04-30 14:46:45 +02:00
Andy Wingo
555c934726 Refactor way the-eof-object is defined
* libguile/ports.c (scm_init_ice_9_ports): Define the-eof-object here.
  Update a comment.
* module/ice-9/ports.scm: Use the-eof-object definition from C.
2016-04-30 14:44:20 +02:00
Andy Wingo
44b3342c4d Load port bindings in separate (ice-9 ports) module
* module/ice-9/ports.scm: New file.
* am/bootstrap.am (SOURCES): Add ice-9/ports.scm.
* libguile/fports.c (scm_init_ice_9_fports): New function.
  (scm_init_fports): Arrange for scm_init_ice_9_fports to be called via
  load-extension, and load snarfed things there.  Move open-file
  definition early, to allow ports to bootstrap.
* libguile/ioext.c (scm_init_ice_9_ioext): New function.
  (scm_init_ioext): Similarly, register scm_init_ice_9_ioext as an
  extension.
* libguile/ports.c (scm_set_current_input_port)
  (scm_set_current_output_port, scm_set_current_error_port): Don't
  define Scheme bindings; do that in Scheme.
* libguile/ports.c (scm_i_set_default_port_encoding):
  (scm_i_default_port_encoding, scm_i_default_port_conversion_handler):
  (scm_i_set_default_port_conversion_handler): Since we now init
  encoding early, remove the "init" flags on these encoding/strategy
  vars.
  (scm_init_ice_9_ports): New function.
  (scm_init_ports): Register scm_init_ice_9_ports extension, and define
  some bindings needed by the bootstrap.
* module/Makefile.am (SOURCES): Add ice-9/ports.scm.
* module/ice-9/boot-9.scm: Remove code that's not on the boot path,
  moving it to ice-9/ports.scm.  At the end, load (ice-9 ports).
* module/ice-9/psyntax.scm (include): Use close-port instead of
  close-input-port.
* module/ice-9/psyntax-pp.scm (include): Regenerate.
2016-04-15 14:07:02 +02:00
Andy Wingo
5e470ea48f Fix R6RS imports of interfaces that use interfaces
* module/ice-9/r6rs-libraries.scm (resolve-r6rs-interface): In Guile, a
  module's public interface is just another module, and that means that
  it can import other modules as well.  Allow for R6RS modules that
  import module whose interfaces import other modules to access all
  visible bindings.
* test-suite/tests/rnrs-libraries.test ("import features"): Update
  test.
2016-04-14 12:35:55 +02:00
Andy Wingo
110695c82e Fix error in exception printer when bootstrapping
* module/ice-9/boot-9.scm (exception-printers): Fix error in which, for
  a pure bootstrap with no compiled files, the exception printer would
  use false-with-exception before it has been defined, which doesn't
  work for macros.  We wouldn't see this problem normally because,
  oddly, the macro is indeed defined normally because of boot reasons.
2016-04-13 11:12:24 +02:00
Andy Wingo
59a18451b8 Use symbols instead of _IONBF values as args to setvbuf
* libguile/ports.c (scm_setvbuf): Use the symbols `none', `line', and
  `block' instead of the values `_IONBF', `_IOLBF', and `_IOFBF'.
* NEWS: Update.
* doc/ref/posix.texi (Ports and File Descriptors): Update setvbuf
documentation.
* module/ice-9/deprecated.scm (define-deprecated): New helper.
(_IONBF, _IOLBF, _IOFBF): Define deprecated values.
* benchmark-suite/benchmarks/read.bm ("read"):
* benchmark-suite/benchmarks/uniform-vector-read.bm
("uniform-vector-read!"):
* libguile/r6rs-ports.c (cbip_fill_input):
* module/system/base/types.scm (%ffi-memory-backend):
* module/web/client.scm (open-socket-for-uri):
* module/web/server/http.scm (http-read):
* test-suite/tests/ports.test ("pipe, fdopen, and line buffering"):
("setvbuf"):
* test-suite/tests/r6rs-ports.test ("7.2.7 Input Ports"): Update to use
non-deprecated interfaces.
2016-04-04 16:30:56 +02:00
Andy Wingo
39090e677e Add frame-procedure-name
* libguile/frames.c (frame_procedure_name_var): New static definition.
  (init_frame_procedure_name_var): New helper.
  (scm_frame_procedure_name): New function that returns the name of the
  frame's procedure, as frame-procedure is to be deprecated.

* libguile/frames.h (scm_frame_procedure_name): Export.

* module/ice-9/boot-9.scm (exception-printers): Use frame-procedure-name
  instead of procedure-name on frame-procedure.

* module/system/vm/frame.scm (frame-procedure-name): New private
  function, implementing scm_frame_procedure_name.
  (frame-call-representation): Use frame-procedure-name to get the
  procedure name to print.
2015-12-01 11:30:54 +01:00
Andy Wingo
25738ec35d Eval speedup for lexical-ref
* module/ice-9/eval.scm (primitive-eval): Specialize lexical-ref for
  depths 0, 1, and 2.  Speeds up this test by around 13%:

    (primitive-eval '(let lp ((n 0)) (when (< n #e1e7) (lp (1+ n)))))
2015-11-11 14:51:19 +01:00
Andy Wingo
fe7ecee820 Only lazily compile where profitable
* module/ice-9/eval.scm (primitive-eval): Only lazily compile box-ref on
  toplevel variables; otherwise compile eagerly to avoid the
  indirection.
2015-03-12 14:48:03 +01:00
Andy Wingo
7fee63b947 Optimize branches in the evaluator
* module/ice-9/eval.scm (primitive-eval): Factor out primitive=?
  helper.  Simplify compile-top-call.  Add compile-top-branch for
  primcall branches, so the compiler can see the specialized branch
  operator.
2015-03-12 14:26:24 +01:00
Andy Wingo
d76d80d23c Primcall inlining in eval.scm, lazy function body compilation
* module/ice-9/eval.scm (primitive-eval): Lazily compile lambda bodies.
  Special-case calls to top-level or module variables, and recognize
  some of those calls as primcalls.  In that case, emit closures with
  the primcalls.
2015-03-12 14:06:15 +01:00
Andy Wingo
eb0376567d Remove unused "nargs" field of memoized call expressions
* libguile/eval.c (eval):
* libguile/memoize.c (MAKMEMO_CALL, memoize, unmemoize):
* module/ice-9/eval.scm (primitive-eval): Remove "nargs" field from
  memoized call expressions, and adapt callers.
2015-03-12 08:37:04 +01:00
Andy Wingo
aead655a45 Re-implement (ice-9 streams) in terms of (srfi srfi-41)
* module/ice-9/streams.scm: Re-implement in terms of SRFI-41.  Passes
  tests.
2015-03-09 13:48:38 +01:00
Andy Wingo
37ae02ffa0 Fix infinite loop in expander
* module/ice-9/psyntax.scm (resolve-identifier): There is a case where a
  syntax object can resolve to itself.  Prevent an infinite loop in that
  case by continuing to resolve by name.

* module/ice-9/psyntax-pp.scm: Regenerate.

* test-suite/tests/syncase.test ("infinite loop bug"): Add a test.
2015-02-13 16:43:01 +01:00
Andy Wingo
0a5b437ef9 Merge commit 'ed72201a79'
Conflicts:
	test-suite/tests/r6rs-ports.test
2015-01-22 14:53:06 +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
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
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
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
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
Mark H Weaver
856d318a9f Merge branch 'stable-2.0'
Conflicts:
	benchmark-suite/benchmarks/ports.bm
	libguile/async.h
	libguile/bytevectors.c
	libguile/foreign.c
	libguile/gsubr.c
	libguile/srfi-1.c
	libguile/vm-engine.h
	libguile/vm-i-scheme.c
	module/Makefile.am
	module/language/tree-il/analyze.scm
	module/language/tree-il/peval.scm
	module/scripts/compile.scm
	module/scripts/disassemble.scm
	test-suite/tests/asm-to-bytecode.test
	test-suite/tests/peval.test
	test-suite/tests/rdelim.test
2014-09-30 03:50:47 -04:00
Andy Wingo
3157d45503 Add (ice-9 unicode) module
* libguile/unicode.c:
* libguile/unicode.h:
* test-suite/tests/unicode.test:
* module/ice-9/unicode.scm: New files.

* module/Makefile.am:
* libguile/Makefile.am:
* test-suite/Makefile.am:
* libguile/init.c: Wire new files into the build.

* doc/ref/api-data.texi: Add docs.
2014-09-29 21:54:14 -04:00
Andy Wingo
c5ea75534c Add (ice-9 unicode) module
* libguile/unicode.c:
* libguile/unicode.h:
* test-suite/tests/unicode.test:
* module/ice-9/unicode.scm: New files.

* module/Makefile.am:
* libguile/Makefile.am:
* test-suite/Makefile.am:
* libguile/init.c: Wire new files into the build.

* doc/ref/api-data.texi: Add docs.
2014-09-12 17:00:59 +02:00
Ian Price
b072b8e692 Provide curried version of define*-public.
* module/ice-9/curried-definitions.scm (define*-public): New macro.
2014-07-31 16:05:58 +01:00
Ian Price
8857e271d8 Prevent add-to-load-path from adding duplicate entries
* module/ice-9/boot-9.scm (add-to-load-path): Remove argument from
  %load-path (if it exists) before pushing. This also means that the
  `elt' will always be at the front of %load-path.
2014-07-30 19:22:04 +01:00