summaryrefslogtreecommitdiffhomepage
path: root/mixlib/xmix_vm_handlers.c
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2004-06-06 19:53:13 +0000
committerJose Antonio Ortega Ruiz <jao@gnu.org>2004-06-06 19:53:13 +0000
commite4ea0f415121795b552134254dccf76999f70d40 (patch)
treefcdeffbfd23aadd1052b57109b6be75d67b73217 /mixlib/xmix_vm_handlers.c
parent67dae25cb73f9c6af330b69e015a2561e491d28f (diff)
downloadmdk-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.c53
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;
}
}