diff options
author | Andy Wingo <wingo@pobox.com> | 2010-02-02 22:59:55 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-02-08 12:38:18 +0100 |
commit | adaf86ec49959f6df55947cf69ac98d6bf1074f7 (patch) | |
tree | 18de5748a636632c57d9c9cb434e9855d165b9d5 /libguile/control.c | |
parent | 69f90b0b051e77257a753f1ee7ae6a18a1147c78 (diff) | |
download | guile-adaf86ec49959f6df55947cf69ac98d6bf1074f7.tar.gz |
connect a few more wires to promptenstein
* libguile/tags.h (scm_tc7_prompt): Allocate a tc7 for prompt objects.
* libguile/control.h (SCM_F_PROMPT_INLINE, SCM_F_PROMPT_ESCAPE)
(SCM_PROMPT_P, SCM_PROMPT_FLAGS, SCM_PROMPT_INLINE_P)
(SCM_PROMPT_ESCAPE_P, SCM_PROMPT_TAG, SCM_PROMPT_REGISTERS)
(SCM_PROMPT_DYNENV, SCM_PROMPT_HANDLER)
(SCM_PROMPT_PRE_UNWIND_HANDLER, SCM_PROMPT_SETJMP)
(struct scm_prompt_registers):
* libguile/control.c (scm_c_make_prompt): Flesh out a simple prompts
implementation.
* libguile/vm-i-system.c (prompt): Wire up the implementation.
* libguile/vm.c: Add a needed #include.
Diffstat (limited to 'libguile/control.c')
-rw-r--r-- | libguile/control.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/libguile/control.c b/libguile/control.c index 66bb5f8a8..bcbc6a136 100644 --- a/libguile/control.c +++ b/libguile/control.c @@ -22,6 +22,7 @@ #include "libguile/_scm.h" #include "libguile/control.h" +#include "libguile/vm.h" @@ -47,6 +48,36 @@ SCM_DEFINE (scm_atprompt, "@prompt", 4, 0, 0, } #undef FUNC_NAME +SCM +scm_c_make_prompt (SCM vm, SCM k, SCM handler, SCM pre_unwind, + scm_t_uint8 inline_p, scm_t_uint8 escape_only_p) +{ + scm_t_bits tag; + SCM ret; + struct scm_prompt_registers *regs; + + tag = scm_tc7_prompt; + if (inline_p) + tag |= SCM_F_PROMPT_INLINE; + if (escape_only_p) + tag |= SCM_F_PROMPT_ESCAPE; + ret = scm_words (tag, 6); + + regs = scm_gc_malloc_pointerless (sizeof (*regs), "prompt registers"); + regs->fp = SCM_VM_DATA (vm)->fp; + regs->sp = SCM_VM_DATA (vm)->sp; + regs->ip = SCM_VM_DATA (vm)->ip; + + SCM_SET_CELL_OBJECT (ret, 1, k); + SCM_SET_CELL_WORD (ret, 2, (scm_t_bits)regs); + SCM_SET_CELL_OBJECT (ret, 3, scm_i_dynwinds ()); + SCM_SET_CELL_OBJECT (ret, 4, handler); + SCM_SET_CELL_OBJECT (ret, 5, pre_unwind); + + return ret; +} + + static void |