diff options
Diffstat (limited to 'mixlib/mix_vm.c')
-rw-r--r-- | mixlib/mix_vm.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/mixlib/mix_vm.c b/mixlib/mix_vm.c index f41c60a..8929527 100644 --- a/mixlib/mix_vm.c +++ b/mixlib/mix_vm.c @@ -65,7 +65,8 @@ vm_reset_reload_ (mix_vm_t *vm, gboolean is_reload) mix_device_delete (vm->devices[k]); vm->devices[k] = NULL; } - if (!is_reload) bp_clear_all_ (vm); + if (!is_reload) + mix_vm_clear_all_breakpoints (vm); } @@ -80,6 +81,7 @@ mix_vm_new (void) vm->address_table = NULL; vm->symbol_table = NULL; vm->src_file = NULL; + vm->pred_list = mix_predicate_list_new (vm); for (i = 0; i < BD_NO_; ++i) vm->devices[i] = NULL; @@ -451,6 +453,8 @@ mix_vm_run (mix_vm_t *vm) update_time_ (vm, &ins); if (bp_is_set_ (vm, get_loc_ (vm))) return MIX_VM_BREAK; + if (mix_predicate_list_eval (get_pred_list_ (vm))) + return MIX_VM_COND_BREAK; if (get_loc_ (vm) >= MIX_VM_CELL_NO) halt_ (vm, TRUE); } return MIX_VM_HALT; @@ -470,7 +474,10 @@ mix_vm_exec_next (mix_vm_t *vm) else update_time_ (vm, &ins); if (is_halted_ (vm)) return MIX_VM_HALT; - return bp_is_set_ (vm, get_loc_ (vm)) ? MIX_VM_BREAK : MIX_VM_OK; + if (bp_is_set_ (vm, get_loc_ (vm))) return MIX_VM_BREAK; + if (mix_predicate_list_eval (get_pred_list_ (vm))) + return MIX_VM_COND_BREAK; + return MIX_VM_OK; } /* Breakpoints */ @@ -590,6 +597,36 @@ mix_vm_clear_all_breakpoints (mix_vm_t *vm) { g_return_if_fail (vm != NULL); bp_clear_all_ (vm); + mix_predicate_list_clear (get_pred_list_ (vm)); +} + + +gint +mix_vm_set_conditional_breakpoint (mix_vm_t *vm, mix_predicate_t *pred) +{ + g_return_val_if_fail (vm != NULL, MIX_VM_BP_ERROR); + g_return_val_if_fail (pred != NULL, MIX_VM_BP_ERROR); + mix_predicate_list_add (get_pred_list_ (vm), pred); + return MIX_VM_BP_OK; +} + +gint +mix_vm_clear_conditional_breakpoint (mix_vm_t *vm, mix_predicate_t *pred) +{ + g_return_val_if_fail (vm != NULL, MIX_VM_BP_ERROR); + g_return_val_if_fail (pred != NULL, MIX_VM_BP_ERROR); + mix_predicate_list_remove (get_pred_list_ (vm), pred); + return MIX_VM_BP_OK; +} + +const gchar * +mix_vm_get_last_breakpoint_message (const mix_vm_t *vm) +{ + const mix_predicate_t *last = NULL; + g_return_val_if_fail (vm != NULL, NULL); + if ((last = mix_predicate_list_last_true_eval (get_pred_list_ (vm))) != NULL) + return mix_predicate_get_message (last); + return NULL; } /* Get the vm uptime, defined as the time spent executing instructions */ |