summaryrefslogtreecommitdiff
path: root/libguile/programs.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-02-06 17:00:03 +0100
committerAndy Wingo <wingo@pobox.com>2010-02-08 13:00:54 +0100
commit1d1cae0e2e063d9a36e7d600f87cf3d6eaf940f3 (patch)
tree136a102cc12ca78edbcb740ecc11f89fa0920e7b /libguile/programs.c
parent217167c6b2e6e400306c8cb4a0bff86c17eef28c (diff)
downloadguile-1d1cae0e2e063d9a36e7d600f87cf3d6eaf940f3.tar.gz
continuations are vm procedures
* libguile/vm-i-system.c (continuation-call): New op, like subr-call or foreign-call, but for continuations. * libguile/continuations.h: Add scm_i_continuation_call internal declaration. (SCM_CONTINUATIONP): Reimplement in terms of SCM_PROGRAM_IS_CONTINUATION. (scm_tc16_continuation, SCM_CONTREGS, SCM_CONTINUATION_LENGTH) (SCM_SET_CONTINUATION_LENGTH, SCM_JMPBUF, SCM_DYNENV, SCM_THROW_VALUE) (SCM_CONTINUATION_ROOT, SCM_DFRAME): Remove these from the exposed API. (scm_i_continuation_to_frame): New internal declaration. * libguile/continuations.c * libguile/continuations.c: Add trickery like in foreign.c, smob.c, and gsubr.c, so that we can make procedural trampolines for continuations. (scm_i_continuation_to_frame): New internal function, from stacks.c. * libguile/programs.h (SCM_F_PROGRAM_IS_CONTINUATION) (SCM_PROGRAM_IS_CONTINUATION): Add a flag for programs that are continuations. Probably should add flags for the other trampoline types too. * libguile/programs.c (scm_i_program_print): Print continuations as before. * libguile/stacks.c (scm_stack_id, scm_make_stack): Use scm_i_continuation_to_frame in the continuation case.
Diffstat (limited to 'libguile/programs.c')
-rw-r--r--libguile/programs.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libguile/programs.c b/libguile/programs.c
index 189b64e74..ac35e3c10 100644
--- a/libguile/programs.c
+++ b/libguile/programs.c
@@ -79,7 +79,14 @@ scm_i_program_print (SCM program, SCM port, scm_print_state *pstate)
(scm_c_resolve_module ("system vm program"),
scm_from_locale_symbol ("write-program"));
- if (scm_is_false (write_program) || print_error)
+ if (SCM_PROGRAM_IS_CONTINUATION (program))
+ {
+ /* twingliness */
+ scm_puts ("#<continuation ", port);
+ scm_uintprint (SCM_CELL_WORD_1 (program), 16, port);
+ scm_putc ('>', port);
+ }
+ else if (scm_is_false (write_program) || print_error)
{
scm_puts ("#<program ", port);
scm_uintprint (SCM_CELL_WORD_1 (program), 16, port);