Commit b11a622
committed
Update exception handling to use
This makes the interface between C++ exception handling and Rust
`Result` cleaner and allows passing C++ exception from the inner C++
call to the outer C++ call via Rust's `CxxException` unmodified, i.e.,
without losing information.
To allow custom exception types, trait `ToCxxException` was introduced.
With this trait, it's possible to convert a Rust error to the wrapper
`CxxExeception` via a C++ function, thus allowing throwing other
exceptions as well. This required changing `r#try` function into
macros, so we can properly default to `rust::Error` for errors not
having `ToCxxException` defined.
Background: The `throw` statement in C++ (__cxa_throw) effectively
first allocates space on the heap and creates the exception within,
then starts unwinding. This can be also done via standard C++11 API in
two steps. First, `std::make_exception_ptr()` creates a new
`std::exception_ptr`, which points into this allocated space and
internally is just a pointer (it's a smart pointer much like
`std::shared_ptr`). Then, `std::rethrow_exception()` can be used to
actually throw and/or rethrow this exception.
Basically, the new implementation now uses `std::make_exception_ptr()`
called from Rust to construct an exception for the `Result<_, E>` and
then after returning it back to C++ via `CxxResult` (which is now BTW
smaller, just 8B) the C++ part throws it using
`std::rethrow_exception()`.std::exception_ptr
1 parent 73eeef3 commit b11a622
File tree
8 files changed
+275
-97
lines changed- book/src/binding
- gen/src
- macro/src
- src
8 files changed
+275
-97
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
29 | 41 | | |
30 | 42 | | |
31 | 43 | | |
| |||
51 | 63 | | |
52 | 64 | | |
53 | 65 | | |
54 | | - | |
55 | | - | |
56 | | - | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
57 | 70 | | |
58 | 71 | | |
59 | 72 | | |
| |||
85 | 98 | | |
86 | 99 | | |
87 | 100 | | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
88 | 107 | | |
89 | 108 | | |
90 | 109 | | |
| |||
141 | 160 | | |
142 | 161 | | |
143 | 162 | | |
| 163 | + | |
| 164 | + | |
144 | 165 | | |
145 | 166 | | |
146 | 167 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
138 | 138 | | |
139 | 139 | | |
140 | 140 | | |
141 | | - | |
| 141 | + | |
142 | 142 | | |
143 | 143 | | |
144 | 144 | | |
| |||
217 | 217 | | |
218 | 218 | | |
219 | 219 | | |
220 | | - | |
| 220 | + | |
| 221 | + | |
221 | 222 | | |
222 | 223 | | |
223 | 224 | | |
224 | 225 | | |
225 | 226 | | |
226 | 227 | | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
227 | 235 | | |
228 | 236 | | |
229 | 237 | | |
| |||
258 | 266 | | |
259 | 267 | | |
260 | 268 | | |
261 | | - | |
| 269 | + | |
262 | 270 | | |
263 | 271 | | |
264 | 272 | | |
265 | | - | |
| 273 | + | |
266 | 274 | | |
267 | 275 | | |
268 | 276 | | |
| |||
345 | 353 | | |
346 | 354 | | |
347 | 355 | | |
348 | | - | |
349 | | - | |
350 | | - | |
351 | | - | |
352 | | - | |
353 | | - | |
354 | | - | |
355 | | - | |
356 | | - | |
357 | | - | |
358 | | - | |
359 | | - | |
360 | | - | |
361 | | - | |
362 | 356 | | |
363 | 357 | | |
364 | 358 | | |
| |||
414 | 408 | | |
415 | 409 | | |
416 | 410 | | |
| 411 | + | |
| 412 | + | |
417 | 413 | | |
418 | 414 | | |
419 | 415 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
706 | 706 | | |
707 | 707 | | |
708 | 708 | | |
709 | | - | |
710 | | - | |
| 709 | + | |
| 710 | + | |
711 | 711 | | |
712 | 712 | | |
713 | 713 | | |
| |||
783 | 783 | | |
784 | 784 | | |
785 | 785 | | |
786 | | - | |
| 786 | + | |
787 | 787 | | |
788 | | - | |
| 788 | + | |
789 | 789 | | |
790 | 790 | | |
791 | 791 | | |
| |||
856 | 856 | | |
857 | 857 | | |
858 | 858 | | |
859 | | - | |
| 859 | + | |
| 860 | + | |
860 | 861 | | |
861 | 862 | | |
862 | 863 | | |
| |||
899 | 900 | | |
900 | 901 | | |
901 | 902 | | |
902 | | - | |
903 | | - | |
| 903 | + | |
| 904 | + | |
904 | 905 | | |
905 | 906 | | |
906 | 907 | | |
| |||
1074 | 1075 | | |
1075 | 1076 | | |
1076 | 1077 | | |
1077 | | - | |
1078 | | - | |
| 1078 | + | |
| 1079 | + | |
1079 | 1080 | | |
1080 | 1081 | | |
1081 | 1082 | | |
| |||
1124 | 1125 | | |
1125 | 1126 | | |
1126 | 1127 | | |
1127 | | - | |
| 1128 | + | |
| 1129 | + | |
1128 | 1130 | | |
1129 | 1131 | | |
1130 | 1132 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
| 149 | + | |
149 | 150 | | |
150 | 151 | | |
151 | 152 | | |
| |||
471 | 472 | | |
472 | 473 | | |
473 | 474 | | |
474 | | - | |
| 475 | + | |
475 | 476 | | |
476 | 477 | | |
477 | 478 | | |
| |||
1108 | 1109 | | |
1109 | 1110 | | |
1110 | 1111 | | |
1111 | | - | |
| 1112 | + | |
1112 | 1113 | | |
1113 | 1114 | | |
1114 | 1115 | | |
| |||
1123 | 1124 | | |
1124 | 1125 | | |
1125 | 1126 | | |
1126 | | - | |
| 1127 | + | |
1127 | 1128 | | |
1128 | 1129 | | |
1129 | 1130 | | |
| |||
1166 | 1167 | | |
1167 | 1168 | | |
1168 | 1169 | | |
1169 | | - | |
| 1170 | + | |
1170 | 1171 | | |
1171 | 1172 | | |
1172 | 1173 | | |
1173 | 1174 | | |
1174 | | - | |
1175 | | - | |
1176 | | - | |
1177 | | - | |
1178 | | - | |
| 1175 | + | |
1179 | 1176 | | |
1180 | 1177 | | |
1181 | 1178 | | |
| |||
1192 | 1189 | | |
1193 | 1190 | | |
1194 | 1191 | | |
| 1192 | + | |
| 1193 | + | |
| 1194 | + | |
| 1195 | + | |
| 1196 | + | |
| 1197 | + | |
| 1198 | + | |
| 1199 | + | |
| 1200 | + | |
| 1201 | + | |
| 1202 | + | |
| 1203 | + | |
| 1204 | + | |
| 1205 | + | |
1195 | 1206 | | |
1196 | 1207 | | |
1197 | | - | |
| 1208 | + | |
1198 | 1209 | | |
1199 | 1210 | | |
1200 | 1211 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
474 | 474 | | |
475 | 475 | | |
476 | 476 | | |
477 | | - | |
478 | | - | |
479 | | - | |
480 | | - | |
481 | 477 | | |
482 | 478 | | |
483 | 479 | | |
| |||
501 | 497 | | |
502 | 498 | | |
503 | 499 | | |
504 | | - | |
505 | | - | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
506 | 503 | | |
507 | 504 | | |
508 | 505 | | |
| |||
559 | 556 | | |
560 | 557 | | |
561 | 558 | | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
562 | 566 | | |
563 | 567 | | |
564 | 568 | | |
| |||
580 | 584 | | |
581 | 585 | | |
582 | 586 | | |
583 | | - | |
| 587 | + | |
584 | 588 | | |
585 | 589 | | |
586 | | - | |
| 590 | + | |
587 | 591 | | |
588 | 592 | | |
589 | 593 | | |
590 | 594 | | |
591 | 595 | | |
592 | | - | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
593 | 600 | | |
594 | 601 | | |
595 | 602 | | |
596 | | - | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
597 | 607 | | |
598 | 608 | | |
599 | 609 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
5 | 7 | | |
6 | 8 | | |
7 | 9 | | |
8 | | - | |
9 | 10 | | |
| 11 | + | |
10 | 12 | | |
11 | 13 | | |
12 | 14 | | |
| |||
16 | 18 | | |
17 | 19 | | |
18 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
19 | 27 | | |
20 | 28 | | |
21 | 29 | | |
| |||
0 commit comments