diff options
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 |