summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'mixlib/mix_vm.c')
-rw-r--r--mixlib/mix_vm.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/mixlib/mix_vm.c b/mixlib/mix_vm.c
index 6da21e2..0a885d8 100644
--- a/mixlib/mix_vm.c
+++ b/mixlib/mix_vm.c
@@ -343,6 +343,39 @@ mix_vm_get_address_lineno (const mix_vm_t *vm, mix_address_t addr)
return lineno;
}
+/* Get the address for a given source line number */
+typedef struct
+{
+ guint lineno;
+ mix_address_t result;
+} addr_traverse_t;
+
+static gint
+get_address_ (gpointer key, gpointer value, gpointer data)
+{
+ addr_traverse_t *tr = (addr_traverse_t *)data;
+ if (GPOINTER_TO_UINT (key) == tr->lineno)
+ {
+ tr->result = mix_short_new (GPOINTER_TO_UINT (value));
+ return TRUE;
+ }
+ return (GPOINTER_TO_UINT (key) < tr->lineno)? FALSE:TRUE;
+}
+
+mix_address_t
+mix_vm_get_lineno_address (const mix_vm_t *vm, guint lineno)
+{
+ addr_traverse_t tr;
+
+ g_return_val_if_fail (vm != NULL, MIX_VM_CELL_NO);
+ if (!vm->line_table) return MIX_VM_CELL_NO;
+ tr.lineno = lineno;
+ tr.result = MIX_VM_CELL_NO;
+ g_tree_traverse (vm->line_table, get_address_, G_IN_ORDER, (gpointer)&tr);
+ return tr.result;
+}
+
+
/* Reposition program counter and reset state so that a loaded
program can be restarted.
*/