Introduce ref_ptr::new_reference
[deliverable/binutils-gdb.git] / gdb / exceptions.c
CommitLineData
60250e8b
AC
1/* Exception (throw catch) mechanism, for GDB, the GNU debugger.
2
e2882c85 3 Copyright (C) 1986-2018 Free Software Foundation, Inc.
60250e8b
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
60250e8b
AC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
60250e8b
AC
19
20#include "defs.h"
21#include "exceptions.h"
60250e8b
AC
22#include "breakpoint.h"
23#include "target.h"
24#include "inferior.h"
25#include "annotate.h"
26#include "ui-out.h"
e06e2353 27#include "serial.h"
347bddb7 28#include "gdbthread.h"
694ec099 29#include "top.h"
223ffa71 30#include "common/gdb_optional.h"
60250e8b 31
6b1b7650 32static void
c6da7a6d 33print_flush (void)
6b1b7650 34{
694ec099 35 struct ui *ui = current_ui;
e06e2353
AC
36 struct serial *gdb_stdout_serial;
37
c6da7a6d
AC
38 if (deprecated_error_begin_hook)
39 deprecated_error_begin_hook ();
5df43998 40
223ffa71 41 gdb::optional<target_terminal::scoped_restore_terminal_state> term_state;
5df43998 42 if (target_supports_terminal_ours ())
481ac8c9 43 {
223ffa71
TT
44 term_state.emplace ();
45 target_terminal::ours_for_output ();
481ac8c9 46 }
e06e2353
AC
47
48 /* We want all output to appear now, before we print the error. We
49 have 3 levels of buffering we have to flush (it's possible that
50 some of these should be changed to flush the lower-level ones
51 too): */
52
53 /* 1. The _filtered buffer. */
5df43998
GB
54 if (filtered_printing_initialized ())
55 wrap_here ("");
e06e2353
AC
56
57 /* 2. The stdio buffer. */
c6da7a6d 58 gdb_flush (gdb_stdout);
e06e2353
AC
59 gdb_flush (gdb_stderr);
60
61 /* 3. The system-level buffer. */
694ec099 62 gdb_stdout_serial = serial_fdopen (fileno (ui->outstream));
cade9e54
PB
63 if (gdb_stdout_serial)
64 {
65 serial_drain_output (gdb_stdout_serial);
66 serial_un_fdopen (gdb_stdout_serial);
67 }
e06e2353 68
c6da7a6d 69 annotate_error_begin ();
6b1b7650
AC
70}
71
9cbc821d 72static void
71fff37b 73print_exception (struct ui_file *file, struct gdb_exception e)
9cbc821d
AC
74{
75 /* KLUGE: cagney/2005-01-13: Write the string out one line at a time
76 as that way the MI's behavior is preserved. */
77 const char *start;
78 const char *end;
d7f9d729 79
9cbc821d
AC
80 for (start = e.message; start != NULL; start = end)
81 {
82 end = strchr (start, '\n');
83 if (end == NULL)
84 fputs_filtered (start, file);
85 else
86 {
87 end++;
88 ui_file_write (file, start, end - start);
89 }
90 }
c6da7a6d 91 fprintf_filtered (file, "\n");
e48f5bee
AC
92
93 /* Now append the annotation. */
94 switch (e.reason)
95 {
96 case RETURN_QUIT:
97 annotate_quit ();
98 break;
99 case RETURN_ERROR:
100 /* Assume that these are all errors. */
101 annotate_error ();
102 break;
103 default:
104 internal_error (__FILE__, __LINE__, _("Bad switch."));
105 }
9cbc821d
AC
106}
107
8a076db9 108void
71fff37b 109exception_print (struct ui_file *file, struct gdb_exception e)
8a076db9
AC
110{
111 if (e.reason < 0 && e.message != NULL)
112 {
c6da7a6d 113 print_flush ();
9cbc821d 114 print_exception (file, e);
9cbc821d
AC
115 }
116}
8a076db9 117
9cbc821d 118void
71fff37b 119exception_fprintf (struct ui_file *file, struct gdb_exception e,
9cbc821d
AC
120 const char *prefix, ...)
121{
122 if (e.reason < 0 && e.message != NULL)
123 {
124 va_list args;
c6da7a6d
AC
125
126 print_flush ();
9cbc821d
AC
127
128 /* Print the prefix. */
129 va_start (args, prefix);
130 vfprintf_filtered (file, prefix, args);
131 va_end (args);
132
133 print_exception (file, e);
8a076db9
AC
134 }
135}
136
ecf45d2c
SL
137/* See exceptions.h. */
138
139int
140exception_print_same (struct gdb_exception e1, struct gdb_exception e2)
141{
142 const char *msg1 = e1.message;
143 const char *msg2 = e2.message;
144
145 if (msg1 == NULL)
146 msg1 = "";
147 if (msg2 == NULL)
148 msg2 = "";
149
150 return (e1.reason == e2.reason
151 && e1.error == e2.error
152 && strcmp (msg1, msg2) == 0);
153}
This page took 0.980333 seconds and 4 git commands to generate.