1
1
//! IMPLEMENTATION DETAILS USED BY MACROS
2
-
3
2
use crate::hio::{self, HostStream};
4
- use core::fmt::{self, Write};
3
+ use core::{
4
+ fmt::{self, Write},
5
+ ptr::addr_of_mut,
6
+ };
5
7
6
8
static mut HSTDOUT: Option<HostStream> = None;
7
9
static mut HSTDERR: Option<HostStream> = None;
@@ -11,42 +13,46 @@ mod machine {
11
13
use super::*;
12
14
13
15
pub fn hstdout_str(s: &str) {
14
- let _result = critical_section::with(|_| unsafe {
15
- if HSTDOUT.is_none() {
16
- HSTDOUT = Some(hio::hstdout()?);
16
+ let _result = critical_section::with(|_| {
17
+ let hstdout = unsafe { &mut *addr_of_mut!(HSTDOUT) };
18
+ if hstdout.is_none() {
19
+ *hstdout = Some(hio::hstdout()?);
17
20
}
18
21
19
- HSTDOUT .as_mut().unwrap().write_str(s).map_err(drop)
22
+ hstdout .as_mut().unwrap().write_str(s).map_err(drop)
20
23
});
21
24
}
22
25
23
26
pub fn hstdout_fmt(args: fmt::Arguments) {
24
- let _result = critical_section::with(|_| unsafe {
25
- if HSTDOUT.is_none() {
26
- HSTDOUT = Some(hio::hstdout()?);
27
+ let _result = critical_section::with(|_| {
28
+ let hstdout = unsafe { &mut *addr_of_mut!(HSTDOUT) };
29
+ if hstdout.is_none() {
30
+ *hstdout = Some(hio::hstdout()?);
27
31
}
28
32
29
- HSTDOUT .as_mut().unwrap().write_fmt(args).map_err(drop)
33
+ hstdout .as_mut().unwrap().write_fmt(args).map_err(drop)
30
34
});
31
35
}
32
36
33
37
pub fn hstderr_str(s: &str) {
34
- let _result = critical_section::with(|_| unsafe {
35
- if HSTDERR.is_none() {
36
- HSTDERR = Some(hio::hstderr()?);
38
+ let _result = critical_section::with(|_| {
39
+ let hstderr = unsafe { &mut *addr_of_mut!(HSTDERR) };
40
+ if hstderr.is_none() {
41
+ *hstderr = Some(hio::hstderr()?);
37
42
}
38
43
39
- HSTDERR .as_mut().unwrap().write_str(s).map_err(drop)
44
+ hstderr .as_mut().unwrap().write_str(s).map_err(drop)
40
45
});
41
46
}
42
47
43
48
pub fn hstderr_fmt(args: fmt::Arguments) {
44
- let _result = critical_section::with(|_| unsafe {
45
- if HSTDERR.is_none() {
46
- HSTDERR = Some(hio::hstderr()?);
49
+ let _result = critical_section::with(|_| {
50
+ let hstderr = unsafe { &mut *addr_of_mut!(HSTDERR) };
51
+ if hstderr.is_none() {
52
+ *hstderr = Some(hio::hstderr()?);
47
53
}
48
54
49
- HSTDERR .as_mut().unwrap().write_fmt(args).map_err(drop)
55
+ hstderr .as_mut().unwrap().write_fmt(args).map_err(drop)
50
56
});
51
57
}
52
58
}
@@ -59,41 +65,45 @@ mod user {
59
65
60
66
pub fn hstdout_str(s: &str) {
61
67
let _result = unsafe {
62
- if HSTDOUT.is_none() {
63
- HSTDOUT = Some(hio::hstdout().unwrap());
68
+ let hstdout = &mut *addr_of_mut!(HSTDOUT);
69
+ if hstdout.is_none() {
70
+ *hstdout = Some(hio::hstdout().unwrap());
64
71
}
65
72
66
- HSTDOUT .as_mut().unwrap().write_str(s).map_err(drop)
73
+ hstdout .as_mut().unwrap().write_str(s).map_err(drop)
67
74
};
68
75
}
69
76
70
77
pub fn hstdout_fmt(args: fmt::Arguments) {
71
78
let _result = unsafe {
72
- if HSTDOUT.is_none() {
73
- HSTDOUT = Some(hio::hstdout().unwrap());
79
+ let hstdout = &mut *addr_of_mut!(HSTDOUT);
80
+ if hstdout.is_none() {
81
+ *hstdout = Some(hio::hstdout().unwrap());
74
82
}
75
83
76
- HSTDOUT .as_mut().unwrap().write_fmt(args).map_err(drop)
84
+ hstdout .as_mut().unwrap().write_fmt(args).map_err(drop)
77
85
};
78
86
}
79
87
80
88
pub fn hstderr_str(s: &str) {
81
89
let _result = unsafe {
82
- if HSTDERR.is_none() {
83
- HSTDERR = Some(hio::hstderr().unwrap());
90
+ let hstderr = &mut *addr_of_mut!(HSTDERR);
91
+ if hstderr.is_none() {
92
+ *hstderr = Some(hio::hstderr().unwrap());
84
93
}
85
94
86
- HSTDERR .as_mut().unwrap().write_str(s).map_err(drop)
95
+ hstderr .as_mut().unwrap().write_str(s).map_err(drop)
87
96
};
88
97
}
89
98
90
99
pub fn hstderr_fmt(args: fmt::Arguments) {
91
100
let _result = unsafe {
92
- if HSTDERR.is_none() {
93
- HSTDERR = Some(hio::hstderr().unwrap());
101
+ let hstderr = &mut *addr_of_mut!(HSTDERR);
102
+ if hstderr.is_none() {
103
+ *hstderr = Some(hio::hstderr().unwrap());
94
104
}
95
105
96
- HSTDERR .as_mut().unwrap().write_fmt(args).map_err(drop)
106
+ hstderr .as_mut().unwrap().write_fmt(args).map_err(drop)
97
107
};
98
108
}
99
109
}
0 commit comments