@@ -16,13 +16,58 @@ use ext::base::*;
16
16
use ext:: base;
17
17
use ext:: build:: { mk_u8, mk_slice_vec_e} ;
18
18
19
- pub fn expand_syntax_ext ( cx : @ext_ctxt , sp : span , tts : & [ ast:: token_tree ] )
20
- -> base :: MacResult {
21
- let var = get_single_str_from_tts ( cx, sp , tts, "bytes!" ) ;
19
+ pub fn expand_syntax_ext ( cx : @ext_ctxt , sp : span , tts : & [ ast:: token_tree ] ) -> base :: MacResult {
20
+ // Gather all argument expressions
21
+ let exprs = get_exprs_from_tts ( cx, tts) ;
22
22
let mut bytes = ~[ ] ;
23
- for var. each |byte| {
24
- bytes. push ( mk_u8 ( cx, sp, byte) ) ;
23
+
24
+ for exprs. each |expr| {
25
+ match expr. node {
26
+ // expression is a literal
27
+ ast:: expr_lit( lit) => match lit. node {
28
+ // string literal, push each byte to vector expression
29
+ ast:: lit_str( s) => {
30
+ for s. each |byte| {
31
+ bytes. push ( mk_u8 ( cx, sp, byte) ) ;
32
+ }
33
+ }
34
+
35
+ // u8 literal, push to vector expression
36
+ ast:: lit_uint( v, ast:: ty_u8) => {
37
+ if v > 0xFF {
38
+ cx. span_err ( sp, "Too large u8 literal in bytes!" )
39
+ } else {
40
+ bytes. push ( mk_u8 ( cx, sp, v as u8 ) ) ;
41
+ }
42
+ }
43
+
44
+ // integer literal, push to vector expression
45
+ ast:: lit_int_unsuffixed( v) => {
46
+ if v > 0xFF {
47
+ cx. span_err ( sp, "Too large integer literal in bytes!" )
48
+ } else if v < 0 {
49
+ cx. span_err ( sp, "Negative integer literal in bytes!" )
50
+ } else {
51
+ bytes. push ( mk_u8 ( cx, sp, v as u8 ) ) ;
52
+ }
53
+ }
54
+
55
+ // char literal, push to vector expression
56
+ ast:: lit_int( v, ast:: ty_char) => {
57
+ if ( v as char ) . is_ascii ( ) {
58
+ bytes. push ( mk_u8 ( cx, sp, v as u8 ) ) ;
59
+ } else {
60
+ cx. span_err ( sp, "Non-ascii char literal in bytes!" )
61
+ }
62
+ }
63
+
64
+ _ => cx. span_err ( sp, "Unsupported literal in bytes!" )
65
+ } ,
66
+
67
+ _ => cx. span_err ( sp, "Non-literal in bytes!" )
68
+ }
25
69
}
70
+
26
71
let e = mk_slice_vec_e ( cx, sp, bytes) ;
27
72
MRExpr ( e)
28
73
}
0 commit comments