@@ -65,20 +65,13 @@ macro_rules! impl_error_chain_processed {
65
65
/// - a backtrace, generated when the error is created.
66
66
/// - an error chain, used for the implementation of `Error::cause()`.
67
67
#[ derive( Debug ) ]
68
- pub struct $error_name(
69
- // The members must be `pub` for `links`.
70
- /// The kind of the error.
71
- pub $error_kind_name,
72
- /// Contains the error chain and the backtrace.
73
- #[ doc( hidden) ]
74
- pub $crate:: State ,
75
- ) ;
68
+ pub struct $error_name( pub Box <( $error_kind_name, $crate:: State ) >) ;
76
69
77
70
impl $crate:: ChainedError for $error_name {
78
71
type ErrorKind = $error_kind_name;
79
72
80
73
fn new( kind: $error_kind_name, state: $crate:: State ) -> $error_name {
81
- $error_name( kind, state)
74
+ $error_name( Box :: new ( ( kind, state) ) )
82
75
}
83
76
84
77
fn from_kind( kind: Self :: ErrorKind ) -> Self {
@@ -120,10 +113,10 @@ macro_rules! impl_error_chain_processed {
120
113
impl $error_name {
121
114
/// Constructs an error from a kind, and generates a backtrace.
122
115
pub fn from_kind( kind: $error_kind_name) -> $error_name {
123
- $error_name(
116
+ $error_name( Box :: new ( (
124
117
kind,
125
118
$crate:: State :: default ( ) ,
126
- )
119
+ ) ) )
127
120
}
128
121
129
122
/// Constructs a chained error from another error and a kind, and generates a backtrace.
@@ -140,15 +133,15 @@ macro_rules! impl_error_chain_processed {
140
133
-> $error_name
141
134
where K : Into <$error_kind_name>
142
135
{
143
- $error_name(
136
+ $error_name( Box :: new ( (
144
137
kind. into( ) ,
145
138
$crate:: State :: new:: <$error_name>( error, ) ,
146
- )
139
+ ) ) )
147
140
}
148
141
149
142
/// Returns the kind of the error.
150
143
pub fn kind( & self ) -> & $error_kind_name {
151
- & self . 0
144
+ & ( self . 0 ) . 0
152
145
}
153
146
154
147
/// Iterates over the error chain.
@@ -158,7 +151,7 @@ macro_rules! impl_error_chain_processed {
158
151
159
152
/// Returns the backtrace associated with this error.
160
153
pub fn backtrace( & self ) -> Option <& $crate:: Backtrace > {
161
- self . 1 . backtrace( )
154
+ ( self . 0 ) . 1 . backtrace( )
162
155
}
163
156
164
157
/// Extends the error chain with a new entry.
@@ -170,15 +163,15 @@ macro_rules! impl_error_chain_processed {
170
163
171
164
impl :: std:: error:: Error for $error_name {
172
165
fn description( & self ) -> & str {
173
- self . 0 . description( )
166
+ ( self . 0 ) . 0 . description( )
174
167
}
175
168
176
169
#[ allow( unknown_lints, unused_doc_comment) ]
177
170
fn cause( & self ) -> Option <& :: std:: error:: Error > {
178
- match self . 1 . next_error {
171
+ match ( self . 0 ) . 1 . next_error {
179
172
Some ( ref c) => Some ( & * * c) ,
180
173
None => {
181
- match self . 0 {
174
+ match ( self . 0 ) . 0 {
182
175
$(
183
176
$( #[ $meta_foreign_links] ) *
184
177
$error_kind_name:: $foreign_link_variant( ref foreign_err) => {
@@ -194,18 +187,19 @@ macro_rules! impl_error_chain_processed {
194
187
195
188
impl :: std:: fmt:: Display for $error_name {
196
189
fn fmt( & self , f: & mut :: std:: fmt:: Formatter ) -> :: std:: fmt:: Result {
197
- :: std:: fmt:: Display :: fmt( & self . 0 , f)
190
+ :: std:: fmt:: Display :: fmt( & ( self . 0 ) . 0 , f)
198
191
}
199
192
}
200
193
201
194
$(
202
195
$( #[ $meta_links] ) *
203
196
impl From <$link_error_path> for $error_name {
204
197
fn from( e: $link_error_path) -> Self {
205
- $error_name(
198
+ let e = * e. 0 ;
199
+ $error_name( Box :: new( (
206
200
$error_kind_name:: $link_variant( e. 0 ) ,
207
201
e. 1 ,
208
- )
202
+ ) ) )
209
203
}
210
204
}
211
205
) *
@@ -243,7 +237,7 @@ macro_rules! impl_error_chain_processed {
243
237
type Target = $error_kind_name;
244
238
245
239
fn deref( & self ) -> & Self :: Target {
246
- & self . 0
240
+ & ( self . 0 ) . 0
247
241
}
248
242
}
249
243
@@ -305,7 +299,7 @@ macro_rules! impl_error_chain_processed {
305
299
306
300
impl From <$error_name> for $error_kind_name {
307
301
fn from( e: $error_name) -> Self {
308
- e . 0
302
+ ( e . 0 ) . 0
309
303
}
310
304
}
311
305
@@ -428,13 +422,13 @@ macro_rules! impl_extract_backtrace {
428
422
fn extract_backtrace( e: & ( :: std:: error:: Error + Send + ' static ) )
429
423
-> Option <:: std:: sync:: Arc <$crate:: Backtrace >> {
430
424
if let Some ( e) = e. downcast_ref:: <$error_name>( ) {
431
- return e . 1 . backtrace. clone( ) ;
425
+ return ( e . 0 ) . 1 . backtrace. clone( ) ;
432
426
}
433
427
$(
434
428
$( #[ $meta_links] ) *
435
429
{
436
430
if let Some ( e) = e. downcast_ref:: <$link_error_path>( ) {
437
- return e . 1 . backtrace. clone( ) ;
431
+ return ( e . 0 ) . 1 . backtrace. clone( ) ;
438
432
}
439
433
}
440
434
) *
0 commit comments