From dd2730739c3c1204ecee97aa936e84ad0f7c5b08 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Sun, 22 Jul 2001 21:08:38 +0000 Subject: version 0.4 --- mixlib/mix_vm.c | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'mixlib/mix_vm.c') diff --git a/mixlib/mix_vm.c b/mixlib/mix_vm.c index 0e9f61b..692f84d 100644 --- a/mixlib/mix_vm.c +++ b/mixlib/mix_vm.c @@ -67,6 +67,12 @@ vm_reset_reload_ (mix_vm_t *vm, gboolean is_reload) } if (!is_reload) mix_vm_clear_all_breakpoints (vm); + + if (vm->address_list) + { + g_slist_free (vm->address_list); + vm->address_list = NULL; + } } @@ -82,6 +88,7 @@ mix_vm_new (void) vm->symbol_table = NULL; vm->src_file = NULL; vm->pred_list = mix_predicate_list_new (vm); + vm->address_list = NULL; for (i = 0; i < BD_NO_; ++i) vm->devices[i] = NULL; @@ -106,6 +113,8 @@ mix_vm_delete (mix_vm_t * vm) if (vm->address_table != NULL) g_tree_destroy (vm->address_table); if (vm->symbol_table != NULL) mix_symbol_table_delete (vm->symbol_table); if (vm->src_file != NULL) mix_src_file_delete (vm->src_file); + if (vm->pred_list != NULL) mix_predicate_list_delete (vm->pred_list); + if (vm->address_list != NULL) g_slist_free (vm->address_list); for (i = 0; i < BD_NO_; ++i) mix_device_delete (vm->devices[i]); mix_vm_clock_delete (vm->clock); @@ -418,25 +427,6 @@ mix_vm_get_lineno_address (const mix_vm_t *vm, guint lineno) } -/* Reposition program counter and reset state so that a loaded - program can be restarted. -*/ -void -mix_vm_reset_program (mix_vm_t *vm) -{ - guint k; - g_return_if_fail (vm != NULL); - reset_loc_ (vm); - halt_ (vm, FALSE); - set_rA_ (vm, MIX_WORD_ZERO); - set_rX_ (vm, MIX_WORD_ZERO); - set_rJ_ (vm, MIX_WORD_ZERO); - for ( k = 1; k < IREG_NO_+1; ++k ) - set_rI_ (vm, k, MIX_WORD_ZERO); - set_over_ (vm, FALSE); - set_cmp_ (vm, mix_EQ); -} - /* continue execution of instructions in memory */ int mix_vm_run (mix_vm_t *vm) @@ -447,6 +437,9 @@ mix_vm_run (mix_vm_t *vm) while ( !is_halted_ (vm) ) { mix_word_to_ins_uncheck (get_cell_ (vm, get_loc_ (vm)), ins); + vm->address_list = + g_slist_prepend (vm->address_list, + GINT_TO_POINTER ((gint)get_loc_ (vm))); if ( !(*ins_handlers_[ins.opcode]) (vm,&ins) ) return MIX_VM_ERROR; else @@ -468,6 +461,9 @@ mix_vm_exec_next (mix_vm_t *vm) 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; + 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; @@ -636,3 +632,10 @@ mix_vm_get_uptime (const mix_vm_t *vm) return mix_vm_clock_get_time (get_clock_ (vm)); } +/* Get the list of addresses for executed instructions */ +const GSList * +mix_vm_get_backtrace (const mix_vm_t *vm) +{ + g_return_val_if_fail (vm != NULL, NULL); + return get_address_list_ (vm); +} -- cgit v1.2.3