@@ -70,8 +70,6 @@ pub fn macro_registrar(register: |Name, SyntaxExtension|) {
7070 None ) ) ;
7171}
7272
73- use std:: ascii:: AsciiCast ;
74-
7573pub fn expand_syntax_ext( cx: & mut ExtCtxt , sp : Span , tts : & [ ast:: TokenTree ] ) -> base:: MacResult {
7674 let ( expr, endian) = parse_tts ( cx, tts) ;
7775
@@ -93,9 +91,7 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) ->
9391 ast:: ExprLit ( lit) => match lit. node {
9492 // string literal
9593 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 {
9995 cx. span_err ( expr. span , "string literal with len != 4 in fourcc!" ) ;
10096 }
10197 s
@@ -112,14 +108,19 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) ->
112108 } ;
113109
114110 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+ } ;
123124 }
124125 let e = cx. expr_lit ( sp, ast:: LitUint ( val as u64 , ast:: TyU32 ) ) ;
125126 MRExpr ( e)
0 commit comments