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