@@ -23,7 +23,7 @@ use super::*;
23
23
/// See `SpanData` for the info on span fields in decoded representation.
24
24
#[ derive( Clone , Copy , PartialEq , Eq , Hash ) ]
25
25
#[ repr( packed) ]
26
- pub struct Span ( u32 ) ;
26
+ pub struct Span ( u64 ) ;
27
27
28
28
/// Dummy span, both position and length are zero, syntax context is zero as well.
29
29
/// This span is kept inline and encoded with format 0.
@@ -45,9 +45,9 @@ impl Span {
45
45
}
46
46
47
47
// Tags
48
- const TAG_INLINE : u32 = 0 ;
49
- const TAG_INTERNED : u32 = 1 ;
50
- const TAG_MASK : u32 = 1 ;
48
+ const TAG_INLINE : u64 = 0 ;
49
+ const TAG_INTERNED : u64 = 1 ;
50
+ const TAG_MASK : u64 = 1 ;
51
51
52
52
// Fields indexes
53
53
const BASE_INDEX : usize = 0 ;
@@ -56,39 +56,39 @@ const CTXT_INDEX: usize = 2;
56
56
57
57
// Tag = 0, inline format.
58
58
// -----------------------------------
59
- // | base 31:8 | len 7 :1 | tag 0:0 |
59
+ // | base 63:39 | len 38:15 | ctxt 14 :1 | tag 0:0 |
60
60
// -----------------------------------
61
- const INLINE_SIZES : [ u32 ; 3 ] = [ 24 , 7 , 0 ] ;
62
- const INLINE_OFFSETS : [ u32 ; 3 ] = [ 8 , 1 , 1 ] ;
61
+ const INLINE_SIZES : [ u64 ; 3 ] = [ 25 , 24 , 14 ] ;
62
+ const INLINE_OFFSETS : [ u64 ; 3 ] = [ 39 , 15 , 1 ] ;
63
63
64
64
// Tag = 1, interned format.
65
65
// ------------------------
66
- // | index 31 :1 | tag 0:0 |
66
+ // | index 63 :1 | tag 0:0 |
67
67
// ------------------------
68
- const INTERNED_INDEX_SIZE : u32 = 31 ;
69
- const INTERNED_INDEX_OFFSET : u32 = 1 ;
68
+ const INTERNED_INDEX_SIZE : u64 = 63 ;
69
+ const INTERNED_INDEX_OFFSET : u64 = 1 ;
70
70
71
71
fn encode ( sd : & SpanData ) -> Span {
72
- let ( base, len, ctxt) = ( sd. lo . 0 , sd. hi . 0 - sd. lo . 0 , sd. ctxt . 0 ) ;
72
+ let ( base, len, ctxt) = ( sd. lo . 0 as u64 , ( sd. hi . 0 - sd. lo . 0 ) as u64 , sd. ctxt . 0 as u64 ) ;
73
73
74
74
let val = if ( base >> INLINE_SIZES [ BASE_INDEX ] ) == 0 &&
75
75
( len >> INLINE_SIZES [ LEN_INDEX ] ) == 0 &&
76
76
( ctxt >> INLINE_SIZES [ CTXT_INDEX ] ) == 0 {
77
77
( base << INLINE_OFFSETS [ BASE_INDEX ] ) | ( len << INLINE_OFFSETS [ LEN_INDEX ] ) |
78
78
( ctxt << INLINE_OFFSETS [ CTXT_INDEX ] ) | TAG_INLINE
79
79
} else {
80
- let index = with_span_interner ( |interner| interner. intern ( sd) ) ;
80
+ let index = with_span_interner ( |interner| interner. intern ( sd) ) as u64 ;
81
81
( index << INTERNED_INDEX_OFFSET ) | TAG_INTERNED
82
82
} ;
83
83
Span ( val)
84
84
}
85
85
86
86
fn decode ( span : Span ) -> SpanData {
87
- let val = span. 0 ;
87
+ let val = span. 0 as u64 ;
88
88
89
89
// Extract a field at position `pos` having size `size`.
90
- let extract = |pos : u32 , size : u32 | {
91
- let mask = ( ( ! 0u32 ) as u64 >> ( 32 - size) ) as u32 ; // Can't shift u32 by 32
90
+ let extract = |pos : u64 , size : u64 | {
91
+ let mask = ( ! 0u64 ) >> ( 64 - size) ;
92
92
( val >> pos) & mask
93
93
} ;
94
94
@@ -98,9 +98,13 @@ fn decode(span: Span) -> SpanData {
98
98
extract ( INLINE_OFFSETS [ CTXT_INDEX ] , INLINE_SIZES [ CTXT_INDEX ] ) ,
99
99
) } else {
100
100
let index = extract ( INTERNED_INDEX_OFFSET , INTERNED_INDEX_SIZE ) ;
101
- return with_span_interner ( |interner| * interner. get ( index) ) ;
101
+ return with_span_interner ( |interner| * interner. get ( index as u32 ) ) ;
102
102
} ;
103
- SpanData { lo : BytePos ( base) , hi : BytePos ( base + len) , ctxt : SyntaxContext ( ctxt) }
103
+ SpanData {
104
+ lo : BytePos ( base as u32 ) ,
105
+ hi : BytePos ( ( base + len) as u32 ) ,
106
+ ctxt : SyntaxContext ( ctxt as u32 )
107
+ }
104
108
}
105
109
106
110
#[ derive( Default ) ]
0 commit comments