summaryrefslogtreecommitdiff
path: root/libguile/control.h
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-02-02 22:59:55 +0100
committerAndy Wingo <wingo@pobox.com>2010-02-08 12:38:18 +0100
commitadaf86ec49959f6df55947cf69ac98d6bf1074f7 (patch)
tree18de5748a636632c57d9c9cb434e9855d165b9d5 /libguile/control.h
parent69f90b0b051e77257a753f1ee7ae6a18a1147c78 (diff)
downloadguile-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.h')
-rw-r--r--libguile/control.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/libguile/control.h b/libguile/control.h
index 8354c7ec2..b49856259 100644
--- a/libguile/control.h
+++ b/libguile/control.h
@@ -20,6 +20,34 @@
#define SCM_CONTROL_H
+#define SCM_F_PROMPT_INLINE 0x1
+#define SCM_F_PROMPT_ESCAPE 0x2
+
+#define SCM_PROMPT_P(x) (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_prompt)
+#define SCM_PROMPT_FLAGS(x) (SCM_CELL_WORD ((x), 0) >> 8)
+#define SCM_PROMPT_INLINE_P(x) (SCM_PROMPT_FLAGS (x) & SCM_F_PROMPT_INLINE)
+#define SCM_PROMPT_ESCAPE_P(x) (SCM_PROMPT_FLAGS (x) & SCM_F_PROMPT_ESCAPE)
+#define SCM_PROMPT_TAG(x) (SCM_CELL_OBJECT ((x), 1)
+#define SCM_PROMPT_REGISTERS(x) ((struct scm_prompt_registers*)SCM_CELL_WORD ((x), 2))
+#define SCM_PROMPT_DYNENV(x) (SCM_CELL_OBJECT ((x), 3))
+#define SCM_PROMPT_HANDLER(x) (SCM_CELL_OBJECT ((x), 4))
+#define SCM_PROMPT_PRE_UNWIND_HANDLER(x) (SCM_CELL_OBJECT ((x), 5))
+
+#define SCM_PROMPT_SETJMP(p) (SCM_I_SETJMP (SCM_PROMPT_REGISTERS (p)->regs))
+
+struct scm_prompt_registers
+{
+ scm_t_uint8 *ip;
+ SCM *sp;
+ SCM *fp;
+ scm_i_jmp_buf regs;
+};
+
+
+SCM_INTERNAL 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_INTERNAL void scm_register_control (void);