guile_vm_SOURCES = guile-vm.c
guile_vm_LDADD = libguile-vm.la ../libguile/libguile.la
-AM_CFLAGS = -Wall -g
-
-CFLAGS:=$(filter-out -Wmissing-prototypes,$(CFLAGS))
-
lib_LTLIBRARIES = libguile-vm.la
libguile_vm_la_SOURCES = \
bootstrap.h \
#define SCM_HEAP_FRAME_POINTER(f) (SCM_HEAP_FRAME_DATA (f) + 2)
#define SCM_VALIDATE_HEAP_FRAME(p,x) SCM_MAKE_VALIDATE (p, x, HEAP_FRAME_P)
+extern SCM scm_frame_program (SCM frame);
+extern SCM scm_frame_local_ref (SCM frame, SCM index);
+extern SCM scm_frame_local_set_x (SCM frame, SCM index, SCM val);
+extern SCM scm_frame_return_address (SCM frame);
+extern SCM scm_frame_dynamic_link (SCM frame);
+extern SCM scm_frame_external_link (SCM frame);
+
extern SCM scm_c_make_heap_frame (SCM *fp);
extern void scm_bootstrap_frames (void);
extern void scm_init_frames (void);
extern struct scm_instruction scm_instruction_table[];
extern struct scm_instruction *scm_lookup_instruction (SCM name);
+extern SCM scm_instruction_list (void);
+extern SCM scm_instruction_p (SCM obj);
+extern SCM scm_instruction_length (SCM inst);
+extern SCM scm_instruction_pops (SCM inst);
+extern SCM scm_instruction_pushes (SCM inst);
+extern SCM scm_instruction_to_opcode (SCM inst);
+extern SCM scm_opcode_to_instruction (SCM op);
+
extern void scm_bootstrap_instructions (void);
extern void scm_init_instructions (void);
extern SCM scm_load_objcode (SCM file);
extern SCM scm_objcode_to_program (SCM objcode);
+extern SCM scm_objcode_p (SCM obj);
+extern SCM scm_bytecode_to_objcode (SCM bytecode, SCM nlocs, SCM nexts);
+extern SCM scm_objcode_to_u8vector (SCM objcode);
extern void scm_bootstrap_objcodes (void);
extern void scm_init_objcodes (void);
extern SCM scm_c_make_program (void *addr, size_t size, SCM holder);
extern SCM scm_c_make_closure (SCM program, SCM external);
+extern SCM scm_program_p (SCM obj);
+extern SCM scm_program_base (SCM program);
+extern SCM scm_program_arity (SCM program);
+extern SCM scm_program_meta (SCM program);
+extern SCM scm_program_objects (SCM program);
+extern SCM scm_program_external (SCM program);
+extern SCM scm_program_external_set_x (SCM program, SCM external);
+extern SCM scm_program_bytecode (SCM program);
+
extern void scm_bootstrap_programs (void);
extern void scm_init_programs (void);
#endif
#include <string.h>
+#include "bootstrap.h"
#include "frames.h"
#include "instructions.h"
#include "objcodes.h"
{
SCM frame;
SCM *dl = SCM_FRAME_DYNAMIC_LINK (fp);
+#if 0
SCM *src = SCM_FRAME_UPPER_ADDRESS (fp);
+#endif
SCM *dest = SCM_FRAME_LOWER_ADDRESS (fp);
if (!dl)
#undef FUNC_NAME
SCM_DEFINE (scm_the_vm, "the-vm", 0, 0, 0,
- (),
+ (void),
"")
#define FUNC_NAME s_scm_the_vm
{
extern SCM scm_vm_option_ref (SCM vm, SCM key);
extern SCM scm_vm_option_set_x (SCM vm, SCM key, SCM val);
+extern SCM scm_vm_version (void);
+extern SCM scm_the_vm (void);
+extern SCM scm_vm_p (SCM obj);
+extern SCM scm_vm_ip (SCM vm);
+extern SCM scm_vm_sp (SCM vm);
+extern SCM scm_vm_fp (SCM vm);
+extern SCM scm_vm_boot_hook (SCM vm);
+extern SCM scm_vm_halt_hook (SCM vm);
+extern SCM scm_vm_next_hook (SCM vm);
+extern SCM scm_vm_break_hook (SCM vm);
+extern SCM scm_vm_enter_hook (SCM vm);
+extern SCM scm_vm_apply_hook (SCM vm);
+extern SCM scm_vm_exit_hook (SCM vm);
+extern SCM scm_vm_return_hook (SCM vm);
+extern SCM scm_vm_option (SCM vm, SCM key);
+extern SCM scm_set_vm_option_x (SCM vm, SCM key, SCM val);
+extern SCM scm_vm_stats (SCM vm);
+extern SCM scm_vm_this_frame (SCM vm);
+extern SCM scm_vm_last_frame (SCM vm);
+extern SCM scm_vm_last_ip (SCM vm);
+extern SCM scm_vm_save_stack (SCM vm);
+extern SCM scm_vm_fetch_code (SCM vm);
+extern SCM scm_vm_fetch_stack (SCM vm);
+
extern SCM scm_load_compiled_with_vm (SCM file);
extern void scm_init_vm (void);
*/
if (SCM_VM_CONT_P (x))
{
+ program = x;
vm_call_cc:
/* Check the number of arguments */
if (nargs != 1)
- scm_wrong_num_args (x);
+ scm_wrong_num_args (program);
/* Reinstate the continuation */
EXIT_HOOK ();
- reinstate_vm_cont (vp, x);
+ reinstate_vm_cont (vp, program);
CACHE_REGISTER ();
program = SCM_FRAME_PROGRAM (fp);
CACHE_PROGRAM ();
*sp = scm_apply (x, args, SCM_EOL);
goto vm_return;
}
+
+ program = x;
+
/*
* Continuation call
*/
- if (SCM_VM_CONT_P (x))
+ if (SCM_VM_CONT_P (program))
goto vm_call_cc;
- program = x;
goto vm_error_wrong_type_apply;
}