diff options
author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2004-06-06 19:53:13 +0000 |
---|---|---|
committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2004-06-06 19:53:13 +0000 |
commit | e4ea0f415121795b552134254dccf76999f70d40 (patch) | |
tree | fcdeffbfd23aadd1052b57109b6be75d67b73217 /mixlib/xmix_vm_handlers.c | |
parent | 67dae25cb73f9c6af330b69e015a2561e491d28f (diff) | |
download | mdk-e4ea0f415121795b552134254dccf76999f70d40.tar.gz mdk-e4ea0f415121795b552134254dccf76999f70d40.tar.bz2 |
keep track of runtime errors and correctly report them.
Diffstat (limited to 'mixlib/xmix_vm_handlers.c')
-rw-r--r-- | mixlib/xmix_vm_handlers.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/mixlib/xmix_vm_handlers.c b/mixlib/xmix_vm_handlers.c index 4d0285f..a778750 100644 --- a/mixlib/xmix_vm_handlers.c +++ b/mixlib/xmix_vm_handlers.c @@ -1,9 +1,9 @@ /* -*-c-*- -------------- xmix_vm_handlers.c : * Implementation of the functions declared in xmix_vm_handlers.h * ------------------------------------------------------------------ - * $Id: xmix_vm_handlers.c,v 1.7 2003/01/11 22:43:13 jao Exp $ + * $Id: xmix_vm_handlers.c,v 1.8 2004/06/06 19:54:11 jao Exp $ * ------------------------------------------------------------------ - * Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + * Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -103,31 +103,42 @@ mix_vm_command_info_t commands_[] = { /* trace current instruction */ static void -trace_ (mix_vm_cmd_dispatcher_t *dis) +do_trace_ (mix_vm_cmd_dispatcher_t *dis, gboolean error) { enum {BUFFER_LEN = 128}; static gchar STRINS[BUFFER_LEN]; - if (wants_logs_ (dis)) + const mix_src_file_t *file = mix_vm_get_src_file (dis->vm); + const gchar *line = "\n"; + mix_address_t loc = mix_vm_get_prog_count (dis->vm); + mix_word_t ins = mix_vm_get_addr_contents (dis->vm, loc); + mix_ins_t fins; + mix_word_to_ins_uncheck (ins, fins); + mix_ins_to_string_in_buffer (&fins, STRINS, BUFFER_LEN); + + if (file != NULL) { - const mix_src_file_t *file = mix_vm_get_src_file (dis->vm); - const gchar *line = "\n"; - mix_address_t loc = mix_vm_get_prog_count (dis->vm); - mix_word_t ins = mix_vm_get_addr_contents (dis->vm, loc); - mix_ins_t fins; - mix_word_to_ins_uncheck (ins, fins); - mix_ins_to_string_in_buffer (&fins, STRINS, BUFFER_LEN); + gulong b = mix_vm_get_break_lineno (dis->vm); + if (b > 0) line = mix_src_file_get_line (file, b); + } - if (file != NULL) - { - gulong b = mix_vm_get_break_lineno (dis->vm); - if (b > 0) line = mix_src_file_get_line (file, b); - } + if (!error) + log_message_ (dis, "%d: [%-15s]\t%s", (gint)loc, STRINS, line); + else + log_error_ (dis, "%d: [%-15s]\t%s", (gint)loc, STRINS, line); +} - log_message_ (dis, "%d: [%-15s]\t%s", (gint)loc, STRINS, line); +static void +trace_ (mix_vm_cmd_dispatcher_t *dis) +{ + if (wants_logs_ (dis)) + { + do_trace_ (dis, FALSE); } } +#define trace_error_(dis) do_trace_ (dis, TRUE) + /* run a program tracing executed instructions */ static int run_and_trace_ (mix_vm_cmd_dispatcher_t *dis) @@ -328,12 +339,14 @@ cmd_run_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) } break; case MIX_VM_ERROR: - log_error_ (dis, _("... error executing loaded file")); + log_error_ (dis, _("%s:"), mix_vm_get_last_error_string (dis->vm)); + trace_error_ (dis); break; default: g_assert_not_reached (); break; } + if (wants_logs_ (dis)) print_time_ (dis); return TRUE; @@ -373,8 +386,8 @@ cmd_next_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) } else if (k == MIX_VM_ERROR) { - log_error_ (dis, _("Error at address %d"), - mix_vm_get_prog_count (dis->vm)); + log_error_ (dis, _("%s:"), mix_vm_get_last_error_string (dis->vm)); + trace_error_ (dis); break; } } |