From c39f8e909b0fde21c586c09f2cb7c6538da1d492 Mon Sep 17 00:00:00 2001 From: Jose Antonio Ortega Ruiz Date: Sun, 6 Jun 2004 19:53:13 +0000 Subject: keep track of runtime errors and correctly report them. --- mixlib/xmix_vm_handlers.c | 53 +++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 20 deletions(-) (limited to 'mixlib/xmix_vm_handlers.c') 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; } } -- cgit v1.2.3