diff options
Diffstat (limited to 'mixlib')
-rw-r--r-- | mixlib/mix_vm.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/mixlib/mix_vm.c b/mixlib/mix_vm.c index 8e8a065..c73e848 100644 --- a/mixlib/mix_vm.c +++ b/mixlib/mix_vm.c @@ -32,40 +32,50 @@ vm_reset_reload_ (mix_vm_t *vm, gboolean is_reload) 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); + for ( k = 1; k < IREG_NO_+1; ++k ) set_rI_ (vm, k, MIX_WORD_ZERO); set_over_ (vm, FALSE); set_cmp_ (vm, mix_EQ); set_loc_ (vm, MIX_WORD_ZERO); set_last_error_ (vm, MIX_VM_ERROR_NONE); - for ( k = 0; k < MEM_CELLS_NO_; ++k) - set_cell_ (vm, k, MIX_WORD_ZERO); + for ( k = 0; k < MEM_CELLS_NO_; ++k) set_cell_ (vm, k, MIX_WORD_ZERO); + if (vm->symbol_table != NULL ) { mix_symbol_table_delete (vm->symbol_table); vm->symbol_table = NULL; } + if (vm->line_table != NULL) { g_tree_destroy (vm->line_table); vm->line_table = NULL; } + if (vm->address_table != NULL) { g_tree_destroy (vm->address_table); vm->address_table = NULL; } + if (vm->src_file != NULL) { mix_src_file_delete (vm->src_file); vm->src_file = NULL; } + for (k = 0; k < BD_NO_; ++k) if (vm->devices[k] != NULL) { - mix_device_delete (vm->devices[k]); - vm->devices[k] = NULL; + mix_device_type_t type = mix_device_type (vm->devices[k]); + if (!is_reload || (type != mix_dev_CONSOLE + && type != mix_dev_PRINTER + && type != mix_dev_CARD_WR)) + { + mix_device_delete (vm->devices[k]); + vm->devices[k] = NULL; + } } + if (!is_reload) mix_vm_clear_all_breakpoints (vm); |