diff options
author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2001-09-16 22:29:30 +0000 |
---|---|---|
committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2001-09-16 22:29:30 +0000 |
commit | d30b9f7e16a39fc297605f530a07c41cdcc2563f (patch) | |
tree | 2d6662ceba1d5d926a3299639734f3259cf36012 | |
parent | 5430bc3493d4012fb11f32675eaa9c437e4e83bd (diff) | |
download | mdk-d30b9f7e16a39fc297605f530a07c41cdcc2563f.tar.gz mdk-d30b9f7e16a39fc297605f530a07c41cdcc2563f.tar.bz2 |
maintain virtual machine status
-rw-r--r-- | mixlib/mix_vm.c | 50 | ||||
-rw-r--r-- | mixlib/mix_vm.h | 31 |
2 files changed, 57 insertions, 24 deletions
diff --git a/mixlib/mix_vm.c b/mixlib/mix_vm.c index 692f84d..4bbc976 100644 --- a/mixlib/mix_vm.c +++ b/mixlib/mix_vm.c @@ -28,6 +28,7 @@ static void vm_reset_reload_ (mix_vm_t *vm, gboolean is_reload) { guint k; + set_status_ (vm, MIX_VM_EMPTY); set_rA_ (vm, MIX_WORD_ZERO); set_rX_ (vm, MIX_WORD_ZERO); set_rJ_ (vm, MIX_WORD_ZERO); @@ -38,7 +39,6 @@ vm_reset_reload_ (mix_vm_t *vm, gboolean is_reload) set_loc_ (vm, MIX_WORD_ZERO); for ( k = 0; k < MEM_CELLS_NO_; ++k) set_cell_ (vm, k, MIX_WORD_ZERO); - halt_ (vm, FALSE); if (vm->symbol_table != NULL ) { mix_symbol_table_delete (vm->symbol_table); @@ -318,7 +318,11 @@ mix_vm_load_file (mix_vm_t *vm, const gchar *name) g_return_val_if_fail (vm != NULL, FALSE); file = mix_code_file_new_read (name); - if (file == NULL) return FALSE; + if (file == NULL) + { + set_status_ (vm, MIX_VM_ERROR); + return FALSE; + } sp = mix_code_file_get_source_path (file); if (sp != NULL) @@ -357,6 +361,7 @@ mix_vm_load_file (mix_vm_t *vm, const gchar *name) set_start_ (vm, get_loc_ (vm)); mix_code_file_delete (file); + set_status_ (vm, MIX_VM_LOADED); return TRUE; } @@ -428,7 +433,7 @@ mix_vm_get_lineno_address (const mix_vm_t *vm, guint lineno) /* continue execution of instructions in memory */ -int +mix_vm_status_t mix_vm_run (mix_vm_t *vm) { mix_ins_t ins; @@ -441,39 +446,47 @@ mix_vm_run (mix_vm_t *vm) g_slist_prepend (vm->address_list, GINT_TO_POINTER ((gint)get_loc_ (vm))); if ( !(*ins_handlers_[ins.opcode]) (vm,&ins) ) - return MIX_VM_ERROR; + return set_status_ (vm, MIX_VM_ERROR); else update_time_ (vm, &ins); if (bp_is_set_ (vm, get_loc_ (vm))) - return MIX_VM_BREAK; + return set_status_ (vm, MIX_VM_BREAK); if (mix_predicate_list_eval (get_pred_list_ (vm))) - return MIX_VM_COND_BREAK; + return set_status_ (vm, MIX_VM_COND_BREAK); if (get_loc_ (vm) >= MIX_VM_CELL_NO) halt_ (vm, TRUE); } - return MIX_VM_HALT; + return set_status_ (vm, MIX_VM_HALT); } /* execute next memory instruction */ -int +mix_vm_status_t mix_vm_exec_next (mix_vm_t *vm) { mix_ins_t ins; g_return_val_if_fail (vm != NULL, MIX_VM_ERROR); if (get_loc_ (vm) >= MIX_VM_CELL_NO) halt_ (vm, TRUE); - if (is_halted_ (vm)) return MIX_VM_HALT; + if (is_halted_ (vm)) return set_status_ (vm, MIX_VM_HALT); vm->address_list = g_slist_prepend (vm->address_list, GINT_TO_POINTER ((gint)get_loc_ (vm))); mix_word_to_ins_uncheck (get_cell_ (vm, get_loc_ (vm)), ins); if (!(*ins_handlers_[ins.opcode]) (vm, &ins)) - return MIX_VM_ERROR; + return set_status_ (vm, MIX_VM_ERROR); else update_time_ (vm, &ins); - if (is_halted_ (vm)) return MIX_VM_HALT; - if (bp_is_set_ (vm, get_loc_ (vm))) return MIX_VM_BREAK; + if (is_halted_ (vm)) return set_status_ (vm, MIX_VM_HALT); + if (bp_is_set_ (vm, get_loc_ (vm))) return set_status_ (vm, MIX_VM_BREAK); if (mix_predicate_list_eval (get_pred_list_ (vm))) - return MIX_VM_COND_BREAK; - return MIX_VM_OK; + return set_status_ (vm, MIX_VM_COND_BREAK); + return set_status_ (vm, MIX_VM_RUNNING); +} + +/* get the current execution status */ +mix_vm_status_t +mix_vm_get_run_status (const mix_vm_t *vm) +{ + g_return_val_if_fail (vm != NULL, MIX_VM_ERROR); + return get_status_ (vm); } /* Breakpoints */ @@ -624,6 +637,15 @@ mix_vm_get_last_breakpoint_message (const mix_vm_t *vm) return NULL; } +mix_predicate_type_t +mix_vm_get_last_conditional_breakpoint_type (const mix_vm_t *vm) +{ + const mix_predicate_t *last = NULL; + g_return_val_if_fail (vm != NULL, MIX_PRED_INVALID); + last = mix_predicate_list_last_true_eval (get_pred_list_ (vm)); + return last? mix_predicate_get_type (last) : MIX_PRED_INVALID; +} + /* Get the vm uptime, defined as the time spent executing instructions */ mix_time_t mix_vm_get_uptime (const mix_vm_t *vm) diff --git a/mixlib/mix_vm.h b/mixlib/mix_vm.h index d3f4e3f..b7412bf 100644 --- a/mixlib/mix_vm.h +++ b/mixlib/mix_vm.h @@ -153,25 +153,33 @@ mix_vm_get_lineno_address (const mix_vm_t *vm, guint lineno); /* continue execution of instructions in memory */ /* Possible outcomes */ -enum { - MIX_VM_ERROR, /* error executing instructions */ - MIX_VM_BREAK, /* breakpoint found */ - MIX_VM_COND_BREAK, /* conditional breakpoint found */ - MIX_VM_HALT, /* end of execution */ - MIX_VM_OK /* successful instruction execution */ -}; - -extern int +typedef enum { + MIX_VM_ERROR, /* error executing instructions */ + MIX_VM_BREAK, /* breakpoint found */ + MIX_VM_COND_BREAK, /* conditional breakpoint found */ + MIX_VM_HALT, /* end of execution */ + MIX_VM_RUNNING, /* successful instruction execution */ + MIX_VM_LOADED, /* program loaded */ + MIX_VM_EMPTY /* no program loaded */ +} mix_vm_status_t; + +/* run until next breakpoint or end of execution */ +extern mix_vm_status_t mix_vm_run (mix_vm_t *vm); /* execute next memory instruction */ -extern int +extern mix_vm_status_t mix_vm_exec_next (mix_vm_t *vm); +/* get the current execution status */ +extern mix_vm_status_t +mix_vm_get_run_status (const mix_vm_t *vm); + /* get the line no. of the last break or 0 if not found */ extern gulong mix_vm_get_break_lineno (const mix_vm_t *vm); + /* Breakpoints */ /* possible error outcomes */ enum { @@ -210,6 +218,9 @@ mix_vm_clear_conditional_breakpoint (mix_vm_t *vm, mix_predicate_t *pred); extern const gchar * mix_vm_get_last_breakpoint_message (const mix_vm_t *vm); +extern mix_predicate_type_t +mix_vm_get_last_conditional_breakpoint_type (const mix_vm_t *vm); + /* Get the vm uptime, defined as the time spent executing instructions */ extern mix_time_t mix_vm_get_uptime (const mix_vm_t *vm); |