@@ -70,8 +70,6 @@ pub fn macro_registrar(register: |Name, SyntaxExtension|) {
70
70
None ) ) ;
71
71
}
72
72
73
- use std:: ascii:: AsciiCast ;
74
-
75
73
pub fn expand_syntax_ext( cx: & mut ExtCtxt , sp : Span , tts : & [ ast:: TokenTree ] ) -> base:: MacResult {
76
74
let ( expr, endian) = parse_tts ( cx, tts) ;
77
75
@@ -93,9 +91,7 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) ->
93
91
ast:: ExprLit ( lit) => match lit. node {
94
92
// string literal
95
93
ast:: LitStr ( ref s, _) => {
96
- if !s. get ( ) . is_ascii ( ) {
97
- cx. span_err ( expr. span , "non-ascii string literal in fourcc!" ) ;
98
- } else if s. get ( ) . len ( ) != 4 {
94
+ if s. get ( ) . char_len ( ) != 4 {
99
95
cx. span_err ( expr. span , "string literal with len != 4 in fourcc!" ) ;
100
96
}
101
97
s
@@ -112,14 +108,19 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) ->
112
108
} ;
113
109
114
110
let mut val = 0u32 ;
115
- if little {
116
- for byte in s. get ( ) . bytes_rev ( ) . take ( 4 ) {
117
- val = ( val << 8 ) | ( byte as u32 ) ;
118
- }
119
- } else {
120
- for byte in s. get ( ) . bytes ( ) . take ( 4 ) {
121
- val = ( val << 8 ) | ( byte as u32 ) ;
122
- }
111
+ for codepoint in s. get ( ) . chars ( ) . take ( 4 ) {
112
+ let byte = if codepoint as u32 > 0xFF {
113
+ cx. span_err ( expr. span , "fourcc! literal character out of range 0-255" ) ;
114
+ 0u8
115
+ } else {
116
+ codepoint as u8
117
+ } ;
118
+
119
+ val = if little {
120
+ ( val >> 8 ) | ( ( byte as u32 ) << 24 )
121
+ } else {
122
+ ( val << 8 ) | ( byte as u32 )
123
+ } ;
123
124
}
124
125
let e = cx. expr_lit ( sp, ast:: LitUint ( val as u64 , ast:: TyU32 ) ) ;
125
126
MRExpr ( e)
0 commit comments