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

7681 commits

Author SHA1 Message Date
Neil Jerram
1dd797921c Fix for incorrect (gcd -2) => -2; should give 2.
(reported by Bill Schottstaedt)

* libguile/numbers.c (scm_gcd): When only one arg given, use scm_abs
  to ensure that result is non-negative.

* test-suite/tests/numbers.test ("gcd"): New test, (gcd -2).
2008-09-22 21:21:20 +01:00
Ludovic Courtès
21c097e0ed Use GC's accessors rather than its global variables.
* libguile/gc.c (scm_storage_prehistory): Use `GC_set_free_space_divisor ()'
  instead of accessing the global variable directly.
2008-09-19 10:25:04 +02:00
Andy Wingo
02b84691b2 don't poke installed scm, go, etc files when running pre-inst-guile
* libguile/load.c (scm_init_load_path): If GUILE_SYSTEM_PATH is set, use
  that instead of the compiled-in suffix to the load path. And, as a
  special case, GUILE_SYSTEM_PATH= is interpreted as '(). A bit nasty.

* pre-inst-guile-env.in (top_builddir): Set GUILE_SYSTEM_PATH to the
  empty string, if it is not set.
2008-09-18 23:04:58 +02:00
Ludovic Courtès
72e6b60838 Implement scm_without_guile ()' in terms of GC_do_blocking ()'.
* libguile/threads.c (guilify_self_1): Initialize `t->guile_mode'.
  (guilify_self_2): Likewise.
  (struct without_guile_arg): New type.
  (without_guile_trampoline): New function.
  (scm_without_guile): Implement in terms of `GC_do_blocking ()'.

* libguile/threads.h (scm_i_thread)[guile_mode]: New field.
2008-09-18 22:55:16 +02:00
Ludovic Courtès
108e4c5b64 Remove double inclusion of <config.h> in `threads.c'. 2008-09-18 22:52:33 +02:00
Andy Wingo
d51406fe87 lambda-lifting for (lambda () ...) as consumer of call-with-values
* libguile/vm-engine.c (vm_run): Add new error case,
  vm_error_not_enough_values.

* libguile/vm-i-system.c (goto/nargs, call/nargs): So, in these cases, if
  we get too many values, we don't truncate the values like we do in the
  single-value continuation case, or in the mvbind case. What to do? I
  guess we either truncate them here, or only allow the correct number of
  values. Dunno. Mark the code as a fixme.
  (truncate-values): New instruction, for mv-bind: checks that the number
  of values on the stack is compatible with the number of bindings we
  have arranged for them, truncating if necessary.

* module/language/scheme/translate.scm (custom-transformer-table):
  Compile receive as a primary form -- not so much because it is a
  primary form, but more to test the mv-bind machinery. Also it's more
  efficient, I think.

* module/system/il/compile.scm (lift-variables!): New helper, factored
  out of `optimize'.
  (optimize): Add a few more cases. Adapt `lambda' optimization, which
  isn't much. I'm not happy with ghil as a mungeable language.
  Add a case for call-with-values with the second argument is
  a lambda: lift the lambda. Untested.
  (codegen): Refactor the push-bindings! code. Compile mv-bind.

* module/system/il/ghil.scm (<ghil-mv-bind>): Add mv-bind construct,
  along with its procedures.

* module/system/il/glil.scm (<glil-mv-bind>): Add mv-bind construct,
  different from the high-level one. It makes sense in the source, I
  think.

* module/system/vm/assemble.scm (codegen): Assemble glil-mv-bind by
  pushing onto the bindings list, and actually push some code to truncate
  the values.
2008-09-18 22:49:55 +02:00
Ludovic Courtès
2a5bf2eeec Use the `GC_FREE_SPACE_DIVISOR' environment variable.
* libguile/gc.c (scm_storage_prehistory): Initialize `GC_free_space_divisor'
  using the `GC_FREE_SPACE_DIVISOR' environment variable.
2008-09-18 22:11:43 +02:00
Ludovic Courtès
6033d3266c Remove per-thread `gc_running_p'.
* libguile/gc.c (scm_gc): Don't use `scm_gc_running_p' as
  an lvalue.

* libguile/gc.h (scm_gc_running_p): Define to 0.

* libguile/threads.h (scm_i_thread)[gc_running_p]: Remove.
2008-09-18 00:04:38 +02:00
Ludovic Courtès
f5cc9619df Remove GC-related fields from `scm_i_thread'.
* libguile/gc.h (scm_i_freelist, scm_i_freelist2): Remove declarations.

* libguile/threads.c (resume): Don't use `t->clear_freelists_p' and
  `scm_i_freelist{,2}'.
  (scm_enter_guile, scm_leave_guile, guilify_self_1): Don't use
  the `heap_mutex' and other fields removed from `scm_i_thread'.
  (scm_i_freelist, scm_i_freelist2): Remove.

* libguile/threads.h (scm_i_thread)[heap_mutex, freelist, freelist2,
  clear_freelists_p]: Remove.
2008-09-17 23:37:31 +02:00
Ludovic Courtès
43adae308c Remove code intended to put threads to sleep.
Actually, threads would "go to sleep" either by blocking on a heap
allocation, or by noticing `scm_i_thread_go_to_sleep' is set when
running `SCM_TICK', which limits the applicability of this technique
(e.g., it was not appropriate for the shared string code).

* libguile/threads.c (scm_i_thread_go_to_sleep, scm_i_thread_put_to_sleep,
  scm_i_thread_invalidate_freelists, scm_i_thread_wake_up,
  scm_i_thread_sleep_for_gc): Remove.

* libguile/threads.h (scm_i_thread_go_to_sleep, scm_i_thread_put_to_sleep,
  scm_i_thread_invalidate_freelists, scm_i_thread_wake_up,
  scm_i_thread_sleep_for_gc): Remove declarations.
  (SCM_THREAD_SWITCHING_CODE): Do nothing.
2008-09-17 22:58:32 +02:00
Ludovic Courtès
902578f15a Remove use of `scm_i_thread_put_to_sleep ()' in the string code.
* libguile/strings.c (scm_i_string_writable_chars): Remove use of
  `scm_i_thread_put_to_sleep ()'.  This leaves a race condition,
  which is hopefully not harmful.
2008-09-17 20:41:41 +02:00
Ludovic Courtès
8b039053b8 Remove GC-related code from fluids.
* libguile/fluids.c (all_dynamic_states, all_fluids): Remove.  Together,
  they prevented dynamic states and fluids to be collected.  Callers no
  longer use them.
  (resize_all_states): Remove.
  (grow_dynamic_state): New function.
  (next_fluid_num): Don't call `resize_all_states ()'.
  (scm_i_fluid_num, scm_i_fast_fluid_ref, scm_i_fast_fluid_set_x): Remove,
  as they broke encapsulation and would have needed duplication of the lazy
  dynamic state growing code.
  (scm_fluid_ref, scm_fluid_set_x): Lazily grow the dynamic state's fluid
  vector.
  (scm_fluids_prehistory): Don't set an `scm_after_sweep_c_hook'.

* libguile/fluids.h (SCM_FLUID_NUM, SCM_FAST_FLUID_REF, SCM_FAST_FLUID_SET_X,
  scm_i_fluid_num, scm_i_fast_fluid_set_x, scm_i_fast_fluid_ref): Remove.

* libguile/load.c (the_reader_fluid_num): Remove.
  (scm_primitive_load): Use `scm_fluid_ref ()' instead of
  `SCM_FAST_FLUID_REF ()'.
  (scm_init_load): Likewise.
2008-09-17 00:25:03 +02:00
Ludovic Courtès
bc743877ff Use immutable cells for vectors.
* libguile/vectors.c (scm_c_make_vector): Use `scm_immutable_cell ()'.
2008-09-16 12:17:29 +02:00
Ludovic Courtès
a284cc7ed8 Use immutable double-cells for symbols.
* libguile/strings.c (scm_i_make_symbol): Use `scm_immutable_double_cell ()'.
2008-09-16 12:12:38 +02:00
Ludovic Courtès
737219ddbb Add `scm_immutable_double_cell ()'.
* libguile/inline.h (scm_immutable_double_cell): New.
2008-09-16 12:10:52 +02:00
Andy Wingo
efbd589204 compile call-with-values, woot!
* libguile/vm-engine.c (vm_run): Add another byte onto the bootstrap
  program, as the offset passed to mv-call now takes two bytes.

* module/system/vm/frame.scm (bootstrap-frame?): Update for the new
  bootstrap length. Really we should just check for 'halt though.

* libguile/vm-i-system.c (FETCH_OFFSET): New helper, used in BR().
  (goto/nargs, call/nargs): Versions of goto/args and call, respectively,
  that take the number of arguments from a value on the top of the stack.
  (mv-call): Call FETCH_OFFSET to get the offset.

* module/language/scheme/translate.scm (custom-transformer-table):
  Compile call-with-values to <ghil-mv-call>. There is some trickery
  because of the r4rs.scm call-with-values trampolines.

* module/system/il/ghil.scm: Add <ghil-mv-call> and accessors.

* module/system/il/compile.scm (codegen): Compile <ghil-mv-call>.

* module/system/il/glil.scm: Add <glil-mv-call>, which needs some special
  assembly because of the label. Fix some typos.

* module/system/vm/assemble.scm (byte-length): New helper, factored out
  and made more general.
  (codegen): Assemble mv-call, including the label.
  (check-length): New helper, makes sure that the addressing is
  consistent within the produced object code.
  (stack->bytes): Rewrite to be more generic -- now `br' instructions
  aren't the only ones jumping around in the instruction stream.

* module/system/vm/conv.scm (make-byte-decoder): Return two values in the
  #f case.

* module/system/vm/disasm.scm (disassemble-bytecode): Rewrite, because
  the previous implementation depended on a guile interpreter quirk:
  namely, that multiple values could be represented within one value, and
  destructured later.
2008-09-16 00:26:22 +02:00
Ludovic Courtès
3db825b067 Use immutable cells for closures.
* libguile/eval.c (scm_closure): Use `scm_immutable_cell ()' instead
  of `scm_cell ()'.

* libguile/procs.h (SCM_SETCODE, SCM_SETENV): Remove.
2008-09-15 23:45:37 +02:00
Ludovic Courtès
d3be55145a Use immutable cells (aka. libgc "stubborn") for subrs.
* libguile/procs.c (scm_c_make_subr): Use `scm_immutable_cell ()' instead
  of `scm_cell ()'.
  (scm_free_subr_entry): Remove.

* libguile/procs.h (SCM_SET_SUBRNUM, SCM_SET_SUBRF): Remove.
  (scm_free_subr_entry): Remove declaration.
2008-09-15 23:32:11 +02:00
Ludovic Courtès
53ea4fdf99 Add `scm_immutable_cell ()'.
* libguile/inline.h (scm_immutable_cell): New.
2008-09-15 23:28:35 +02:00
Ludovic Courtès
d6c74168a7 Remove unused GC string/symbol functions.
* libguile/strings.c (scm_i_stringbuf_mark, scm_i_stringbuf_free,
  scm_i_string_mark, scm_i_string_free, scm_i_symbol_mark,
  scm_i_symbol_free): Remove.

* libguile/strings.h: Remove corresponding declarations.
2008-09-15 22:59:08 +02:00
Ludovic Courtès
11d2fc0660 Conditionalize GC 6.x code.
* libguile/gc.c (scm_storage_prehistory): Have `GC_init ()' called only
  with GC 6.x (it doesn't hurt with 7.x, though).
2008-09-15 22:57:24 +02:00
Neil Jerram
b5cb4464ca Make multi-byte reads on unbuffered ports more efficient.
Idea and original patch were by Ludovic Courts, this is Neil Jerram's
reworking of it.

	* libguile/srfi-4.c (scm_uniform_vector_read_x): Use scm_c_read,
	instead of equivalent code here.

	* libguile/ports.c (scm_fill_input): Add assertion that read
	buffer is empty when called.
	(port_and_swap_buffer, swap_buffer): New, for...
	(scm_c_read): Use caller's buffer for reading, to avoid making N
	1-byte low-level read calls, in the case where the port is
	unbuffered (or has a very small buffer).
2008-09-15 18:52:51 +01:00
Andy Wingo
ef24c01bff add special case for (apply values ...)
* libguile/vm-engine.c (vm_run): Move nvalues to the top level, to avoid
  (spurious, it seems) gcc warnings about it being used uninitialized.

* libguile/vm-i-system.c (halt, return/values): Adapt to gcc silliness.
  Deindent some of return/values.
  (return/values*): New instruction, does what (apply values . args)
  would do.

* module/language/scheme/translate.scm (custom-transformer-table): Move
  the apply and @apply cases here from inline.scm, because we need some
  more cleverness when dealing with cases like (apply values . args).
  (lookup-apply-transformer): Define an eval transformer for `values',
  turning it into ghil-values*.

* module/system/il/compile.scm (codegen): Compile <ghil-values*> into
  return/values*.

* module/system/il/ghil.scm: Add <ghil-values*> and accessors.
  (ghil-lookup): Add optional argument, define?, which if false tells us
  not to actually cache the binding if it is not found in the toplevel.

* module/system/il/inline.scm: Remove apply clauses.

* module/system/vm/frame.scm (bootstrap-frame?): Update heuristic for
  bootstrap-frame?, as the bootstrap frame is now 5 bytes since it
  accepts multiple values.
2008-09-15 00:04:34 +02:00
Ludovic Courtès
04f8c62ca6 Fix detection of the GC version.
* libguile/boehm-gc.h: Don't expect `GC_VERSION_MAJOR' to be defined,
  as it's defined only since 7.x.
2008-09-14 22:07:34 +02:00
Andy Wingo
a222b0fa91 add multiple values support to the vm
* libguile/vm-engine.c (vm_run): The bootstrap program now uses mv_call,
  so as to allow multiple values out of the VM. (It did before, because
  multiple values were represented internally as single scm_values
  objects, but now that values go on the stack, we need to note the boot
  frame as accepting multiple values.)
  (vm_error_no_values): New error, happens if you pass no values into a
  single-value continuation. Passing more than one is OK though, it just
  takes the first one.

* libguile/vm-i-system.c (halt): Assume that someone has pushed the
  number of values onto the stack, and package up that number of values
  as a scm_values() object, for communication with the interpreter.
  (mv-call): New instruction, calls a procedure with a multiple-value
  continuation, even handling calls out to the interpreter.
  (return/values): New instruction, returns multiple values to the
  continuation. If the continuation is single-valued, takes the first
  value or errors if there are no values. Otherwise it returns to the
  multiple-value return address, pushing the number of values on top of
  the values.

* module/system/il/compile.scm (codegen): Compile <ghil-values> forms.

* module/system/il/ghil.scm (<ghil-values>) Add new GHIL data structure
  and associated procedures.

* module/language/scheme/translate.scm (custom-transformer-table):
  Compile (values .. ) forms into <ghil-values>.
2008-09-14 17:06:52 +02:00
Ludovic Courtès
44e268898b Merge branch 'master' into boehm-demers-weiser-gc
Conflicts:
	lib/Makefile.am
	libguile/gc-card.c
	libguile/gc-freelist.c
	libguile/gc-mark.c
	libguile/gc-segment.c
	libguile/gc.c
	libguile/gc.h
	libguile/gc_os_dep.c
	libguile/private-gc.h
	m4/.cvsignore
	m4/gnulib-cache.m4
	m4/gnulib-comp.m4
2008-09-13 22:51:27 +02:00
Andy Wingo
f03c31dbad rename tail-call to goto/args, add some more tail instructions
* libguile/vm-i-system.c (call): Rename continuation invocation from
  `vm_call_cc' to `vm_call_continuation', because that's what it really
  does. Add a note that it doesn't handle multiple values at the moment.
  (goto/arg): Renamed from tail-call, in deference to the progenitors, on
  Dale Smith's suggestion.
  (goto/apply): New instruction, for `apply' in a tail context. Not yet
  used, or vetted for that matter.
  (call/cc): No need to pop the program, I don't think; although this
  isn't tested either.
  (goto/cc): New instruction, for call/cc in a tail context.

* module/language/scheme/translate.scm (*forbidden-primitives*): Rename
  from %forbidden-primitives.

* module/system/il/compile.scm (codegen): Adapt to goto/args instead of
  tail-call.

* module/system/il/inline.scm: Start inlining some macros used in
  r4rs.scm -- not yet fully tested.

* ice-9/boot-9.scm: Allow load of a compiled r4rs file.
2008-09-13 19:24:03 +02:00
Andy Wingo
da320011a3 add a multiple values return address to stack frames
* libguile/frames.c (frame-mv-return-address): New accessor.

* libguile/frames.h: Update frame diagram.
  (SCM_FRAME_UPPER_ADDRESS): Update for data area
  growing by one pointer.
  (SCM_FRAME_MV_RETURN_ADDRESS): New macro.

* libguile/vm-engine.h (NEW_FRAME): Update for frame getting bigger by a
  pointer. In a normal NEW_FRAME, set the MV return address to NULL, to
  indicate that this continuation does not accept multiple values.

* libguile/vm-i-system.c (tail-call): Update frame replacement code to
  understand the MV return address.
  (return): Make room for the MVRA.
2008-09-13 19:22:28 +02:00
Andy Wingo
28106f547d inline frame replacement in tail-call
* libguile/programs.c (program_print): Only try to lookup write-program
  if the module system is booted.

* libguile/vm-engine.h (FREE_FRAME): Remove, it's now inlined everywhere.

* libguile/vm-i-system.c (tail-call): Inline FREE_FRAME, and implement
  the calling bits here. Will make things more hackable.
2008-09-13 15:41:43 +02:00
Ludovic Courtès
dbb605f575 Include <config.h> in all C files; use #ifdef HAVE_CONFIG_H' rather than #if'. 2008-09-13 15:35:27 +02:00
Andy Wingo
1dc8f8517c inline FREE_FRAME in halt
* libguile/vm-i-system.c (halt): Inline FREE_FRAME, specialized for the
  halt case.
2008-09-13 14:40:27 +02:00
Andy Wingo
f13c269b7f inline FREE_FRAME in return, sync stack_base in CACHE_REGISTER
* libguile/vm-engine.h (CACHE_REGISTER): Sync stack_base too.

* libguile/vm-i-system.c (return): Inline FREE_FRAME here,
  micro-optimizing a wee bit. Sounds silly, but it's to enable some
  refactoring.
2008-09-13 14:30:57 +02:00
Andy Wingo
2cdb8cdc0d clean up NEW_FRAME macro
* libguile/vm-engine.h (NEW_FRAME): Clean up this macro.
2008-09-13 14:19:30 +02:00
Andy Wingo
93d197be98 readability improvement in vm-i-scheme
* libguile/vm-engine.h:
* libguile/vm-i-scheme.c: Move some helper macros closer to their use
  sites.
2008-09-13 14:19:30 +02:00
Andy Wingo
0ba8bb7143 tweaks for printing programs
* module/system/vm/program.scm (program-bindings-as-lambda-list): Handle
  the bindings-is-null case too -- not sure how it comes about, though. A
  thunk with no let, perhaps.
  (write-program): Another default for the name: the source location at
  which it was defined.

* libguile/programs.c (program_print): Add some "logic" to stop doing
  detailed prints if one print had a nonlocal exit -- preventing
  exceptions in backtraces.
2008-09-13 14:19:30 +02:00
Andy Wingo
e6fea61823 programs can now get at their names, and print nicely
* module/system/vm/frame.scm (frame-call-representation)
  (frame-program-name): Rename program-name to frame-program-name, and
  use the program-name if it is available.

* module/system/vm/program.scm (program-bindings): Return #f if there are
  no bindings.
  (program-name): New public procedure.
  (program-bindings-as-lambda-list, write-program): A more useful writer
  for programs.

* libguile/programs.c (scm_bootstrap_programs, program_print): Add a smob
  printer for programs, which dispatches to `write-program'.
2008-09-13 14:19:30 +02:00
Ludovic Courtès
61db429e25 Add `ChangeLog-2008' files to the distribution. 2008-09-12 21:57:52 +02:00
Ludovic Courtès
afb59d75b8 Rename ChangeLog' files to ChangeLog-2008'. 2008-09-12 21:49:58 +02:00
Ludovic Courtès
3c2a5013de Include <config.h> in `discouraged.c'.
* libguile/discouraged.c: Include <config.h> first so that files that
  rely on `config.h' macros (such as Gnulib-provided headers) work as
  expected.
2008-09-12 09:41:54 +02:00
Ludovic Courtès
85ca88c68b Remove `.cvsignore' files. 2008-09-11 21:28:21 +02:00
Han-Wen Nienhuys
b71c8ec90a Revise GC asserts.
* libguile/gc.c (scm_i_gc): Change assert into printed warning.

* libguile/private-gc.h (nil): introduce scm_i_last_marked_cell_count,
  as a private mechanism for maintaining cell counts.  Remove variable
  scm_cells_allocated.
2008-09-11 12:10:58 -03:00
Ludovic Courtès
ebd7821321 Adjust to be usable with `libgc' 7.1.
* libguile/boehm-gc.h: Only include <gc/gc_local_alloc.h> with
  `libgc' 6.x.  Define `GC_PTR' for `libgc' 7.x+.
2008-09-11 00:44:13 +02:00
Ludovic Courtès
e9d8bc2558 Fix bug in port eviction code
* libguile/fports.c (scm_i_evict_port): Check whether PORT has a
  ptab entry associated with it.  It's unclear when this can happen.
2008-09-11 00:06:55 +02:00
Ludovic Courtès
0306509bc8 Fix broken hash-table merge.
* libguile/hashtab.c (scm_hash_fn_create_handle_x): Return IT only when
  it satisfies `scm_is_pair ()'.
2008-09-10 23:51:21 +02:00
Ludovic Courtès
b359b36a63 Fix broken GC and threads merge.
* libguile/private-gc.h (scm_i_tag_name): New declaration.

* libguile/threads.c: Include <config.h>.
2008-09-10 23:33:59 +02:00
Ludovic Courtès
7f2a6c387c Fix broken port merge.
* libguile/ports.c (finalize_port): Don't call `scm_remove_from_port_table ()'.
  (scm_flush): Don't refer to `scm_i_port_table_size'.
  (scm_ports_prehistory): Don't allocate `scm_i_port_table'.

* libguile/ports.h (scm_i_port_table_room): Remove declaration.
2008-09-10 23:32:50 +02:00
Ludovic Courtès
6f03035fe8 Merge branch 'master' into boehm-demers-weiser-gc
Conflicts:
	libguile/Makefile.am
	libguile/coop-defs.h
	libguile/gc-card.c
	libguile/gc-freelist.c
	libguile/gc-malloc.c
	libguile/gc-mark.c
	libguile/gc-segment.c
	libguile/gc.c
	libguile/gc.h
	libguile/gc_os_dep.c
	libguile/hashtab.c
	libguile/hashtab.h
	libguile/inline.h
	libguile/private-gc.h
	libguile/struct.c
	libguile/struct.h
	libguile/threads.c
	libguile/threads.h
	libguile/vectors.h
	libguile/weaks.h
	test-suite/tests/gc.test
2008-09-10 23:09:30 +02:00
Ludovic Courtes
35747a3e06 Add comment about `GC_local_malloc ()' upon thread destruction.
* libguile/threads.c (on_thread_exit): Add caveat about possible
  segfault.

git-archimport-id: lcourtes@laas.fr--2006-libre/guile-core--boehm-gc--0--patch-8
2008-09-10 22:52:10 +02:00
Ludovic Courtes
071e0d9329 Remove `scm_get_stack_base ()'.
* libguile/threads.c: Replace `scm_get_stack_base ()' by
  `GC_stackbottom'.

* libguile/gc.h (scm_get_stack_base): Remove declaration.

git-archimport-id: lcourtes@laas.fr--2006-libre/guile-core--boehm-gc--0--patch-7
2008-09-10 22:52:03 +02:00
Ludovic Courtès
e0513d4d77 Merge commit '2e77f7202b' into boehm-demers-weiser-gc
Conflicts:
	libguile/threads.c
2008-09-10 22:51:46 +02:00