diff options
author | Andy Wingo <wingo@pobox.com> | 2010-02-06 17:00:03 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-02-08 13:00:54 +0100 |
commit | 1d1cae0e2e063d9a36e7d600f87cf3d6eaf940f3 (patch) | |
tree | 136a102cc12ca78edbcb740ecc11f89fa0920e7b /libguile/programs.c | |
parent | 217167c6b2e6e400306c8cb4a0bff86c17eef28c (diff) | |
download | guile-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.c | 9 |
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); |