summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_vm.c
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2001-07-22 21:08:38 +0000
committerJose Antonio Ortega Ruiz <jao@gnu.org>2001-07-22 21:08:38 +0000
commitdd2730739c3c1204ecee97aa936e84ad0f7c5b08 (patch)
tree8ae0e030e9884c144ed396f28f1b8acdd0a00c99 /mixlib/mix_vm.c
parent4b003474d25aa79508f392ea16533b738896856d (diff)
downloadmdk-dd2730739c3c1204ecee97aa936e84ad0f7c5b08.tar.gz
mdk-dd2730739c3c1204ecee97aa936e84ad0f7c5b08.tar.bz2
version 0.4
Diffstat (limited to 'mixlib/mix_vm.c')
-rw-r--r--mixlib/mix_vm.c41
1 files changed, 22 insertions, 19 deletions
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);
+}