diff options
Diffstat (limited to 'mixlib/mix_vm.c')
-rw-r--r-- | mixlib/mix_vm.c | 33 |
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. */ |