summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_vm.c
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2001-07-19 00:24:23 +0000
committerJose Antonio Ortega Ruiz <jao@gnu.org>2001-07-19 00:24:23 +0000
commit9d46df7ae76533833c26df9f0b0bf24e086c25b2 (patch)
tree83c0375e6d4345a16035f7f756a156142e7e6e64 /mixlib/mix_vm.c
parentb18af386c53f81e31f98a1c1b699666ec69a7aa4 (diff)
downloadmdk-9d46df7ae76533833c26df9f0b0bf24e086c25b2.tar.gz
mdk-9d46df7ae76533833c26df9f0b0bf24e086c25b2.tar.bz2
cond bp support
Diffstat (limited to 'mixlib/mix_vm.c')
-rw-r--r--mixlib/mix_vm.c41
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 */