X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/252acfe8e70ac4c7d325588ffea1905fcf6f86b2..d8d9a8da05ec876acba81a559798eb5eeceb5a17:/libguile/vm.h diff --git a/libguile/vm.h b/libguile/vm.h index 2479ee4a4..8f88d0cd4 100644 --- a/libguile/vm.h +++ b/libguile/vm.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2009, 2010, 2011 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -28,71 +28,63 @@ enum { SCM_VM_POP_CONTINUATION_HOOK, SCM_VM_NEXT_HOOK, SCM_VM_ABORT_CONTINUATION_HOOK, - SCM_VM_RESTORE_CONTINUATION_HOOK, SCM_VM_NUM_HOOKS, }; -struct scm_vm; - -typedef SCM (*scm_t_vm_engine) (SCM vm, SCM program, SCM *argv, int nargs); - #define SCM_VM_REGULAR_ENGINE 0 #define SCM_VM_DEBUG_ENGINE 1 #define SCM_VM_NUM_ENGINES 2 struct scm_vm { - scm_t_uint8 *ip; /* instruction pointer */ + scm_t_uint32 *ip; /* instruction pointer */ SCM *sp; /* stack pointer */ SCM *fp; /* frame pointer */ + SCM *stack_limit; /* stack limit address */ + int trace_level; /* traces enabled if trace_level > 0 */ + SCM *sp_max_since_gc; /* highest sp since last gc */ size_t stack_size; /* stack size */ SCM *stack_base; /* stack base address */ - SCM *stack_limit; /* stack limit address */ - int engine; /* which vm engine we're using */ + SCM overflow_handler_stack; /* alist of max-stack-size -> thunk */ SCM hooks[SCM_VM_NUM_HOOKS]; /* hooks */ - int trace_level; /* traces enabled if trace_level > 0 */ - scm_t_int64 cookie; /* used to detect unrewindable continuations */ + int engine; /* which vm engine we're using */ }; -SCM_API SCM scm_the_vm_fluid; - -#define SCM_VM_P(x) (SCM_HAS_TYP7 (x, scm_tc7_vm)) -#define SCM_VM_DATA(vm) ((struct scm_vm *) SCM_CELL_WORD_1 (vm)) -#define SCM_VALIDATE_VM(pos,x) SCM_MAKE_VALIDATE (pos, x, VM_P) - -SCM_API SCM scm_the_vm (void); -SCM_API SCM scm_make_vm (void); - -SCM_API SCM scm_the_vm (void); -SCM_API SCM scm_call_with_vm (SCM vm, SCM proc, SCM args); - -SCM_API SCM scm_vm_p (SCM obj); -SCM_API SCM scm_vm_ip (SCM vm); -SCM_API SCM scm_vm_sp (SCM vm); -SCM_API SCM scm_vm_fp (SCM vm); -SCM_API SCM scm_vm_apply_hook (SCM vm); -SCM_API SCM scm_vm_push_continuation_hook (SCM vm); -SCM_API SCM scm_vm_pop_continuation_hook (SCM vm); -SCM_API SCM scm_vm_abort_continuation_hook (SCM vm); -SCM_API SCM scm_vm_restore_continuation_hook (SCM vm); -SCM_API SCM scm_vm_next_hook (SCM vm); -SCM_API SCM scm_vm_trace_level (SCM vm); -SCM_API SCM scm_set_vm_trace_level_x (SCM vm, SCM level); -SCM_API SCM scm_vm_engine (SCM vm); -SCM_API SCM scm_set_vm_engine_x (SCM vm, SCM engine); +SCM_INTERNAL struct scm_vm *scm_the_vm (void); +SCM_API SCM scm_call_with_vm (SCM proc, SCM args); + +SCM_API SCM scm_call_with_stack_overflow_handler (SCM limit, SCM thunk, + SCM handler); + +SCM_API SCM scm_vm_apply_hook (void); +SCM_API SCM scm_vm_push_continuation_hook (void); +SCM_API SCM scm_vm_pop_continuation_hook (void); +SCM_API SCM scm_vm_abort_continuation_hook (void); +SCM_API SCM scm_vm_next_hook (void); +SCM_API SCM scm_vm_trace_level (void); +SCM_API SCM scm_set_vm_trace_level_x (SCM level); +SCM_API SCM scm_vm_engine (void); +SCM_API SCM scm_set_vm_engine_x (SCM engine); SCM_API SCM scm_set_default_vm_engine_x (SCM engine); -SCM_API void scm_c_set_vm_engine_x (SCM vm, int engine); +SCM_API void scm_c_set_vm_engine_x (int engine); SCM_API void scm_c_set_default_vm_engine_x (int engine); +struct GC_ms_entry; +SCM_INTERNAL struct GC_ms_entry * scm_i_vm_mark_stack (struct scm_vm *, + struct GC_ms_entry *, + struct GC_ms_entry *); +SCM_INTERNAL void scm_i_vm_free_stack (struct scm_vm *vp); + #define SCM_F_VM_CONT_PARTIAL 0x1 #define SCM_F_VM_CONT_REWINDABLE 0x2 struct scm_vm_cont { SCM *sp; SCM *fp; - scm_t_uint8 *ra, *mvra; + scm_t_uint32 *ra; scm_t_ptrdiff stack_size; SCM *stack_base; scm_t_ptrdiff reloc; + scm_t_dynstack *dynstack; scm_t_uint32 flags; }; @@ -103,14 +95,13 @@ struct scm_vm_cont { SCM_API SCM scm_load_compiled_with_vm (SCM file); -SCM_INTERNAL SCM scm_c_vm_run (SCM vm, SCM program, SCM *argv, int nargs); - -SCM_INTERNAL void scm_i_vm_print (SCM x, SCM port, - scm_print_state *pstate); -SCM_INTERNAL SCM scm_i_vm_capture_continuation (SCM vm); +SCM_INTERNAL SCM scm_i_call_with_current_continuation (SCM proc); +SCM_INTERNAL SCM scm_i_capture_current_stack (void); SCM_INTERNAL SCM scm_i_vm_capture_stack (SCM *stack_base, SCM *fp, SCM *sp, - scm_t_uint8 *ra, scm_t_uint8 *mvra, + scm_t_uint32 *ra, + scm_t_dynstack *dynstack, scm_t_uint32 flags); +SCM_INTERNAL int scm_i_vm_cont_to_frame (SCM cont, struct scm_frame *frame); SCM_INTERNAL void scm_i_vm_cont_print (SCM x, SCM port, scm_print_state *pstate); SCM_INTERNAL void scm_bootstrap_vm (void);