28
28
#[ crate_type = "dylib" ] ;
29
29
#[ license = "MIT/ASL2" ] ;
30
30
31
+ use std:: cell:: Cell ;
31
32
use std:: { os, path} ;
32
33
use std:: io:: fs;
33
34
use std:: path:: is_sep;
@@ -342,22 +343,24 @@ impl Pattern {
342
343
}
343
344
344
345
fn matches_from ( & self ,
345
- mut prev_char : Option < char > ,
346
+ prev_char : Option < char > ,
346
347
mut file : & str ,
347
348
i : uint ,
348
349
options : MatchOptions ) -> MatchResult {
349
350
351
+ let prev_char = Cell :: new ( prev_char) ;
352
+
350
353
let require_literal = |c| {
351
354
( options. require_literal_separator && is_sep ( c) ) ||
352
355
( options. require_literal_leading_dot && c == '.'
353
- && is_sep ( prev_char. unwrap_or ( '/' ) ) )
356
+ && is_sep ( prev_char. get ( ) . unwrap_or ( '/' ) ) )
354
357
} ;
355
358
356
359
for ( ti, token) in self . tokens . slice_from ( i) . iter ( ) . enumerate ( ) {
357
360
match * token {
358
361
AnySequence => {
359
362
loop {
360
- match self . matches_from ( prev_char, file, i + ti + 1 , options) {
363
+ match self . matches_from ( prev_char. get ( ) , file, i + ti + 1 , options) {
361
364
SubPatternDoesntMatch => ( ) , // keep trying
362
365
m => return m,
363
366
}
@@ -370,7 +373,7 @@ impl Pattern {
370
373
if require_literal ( c) {
371
374
return SubPatternDoesntMatch ;
372
375
}
373
- prev_char = Some ( c) ;
376
+ prev_char. set ( Some ( c) ) ;
374
377
file = next;
375
378
}
376
379
}
@@ -400,7 +403,7 @@ impl Pattern {
400
403
if !matches {
401
404
return SubPatternDoesntMatch ;
402
405
}
403
- prev_char = Some ( c) ;
406
+ prev_char. set ( Some ( c) ) ;
404
407
file = next;
405
408
}
406
409
}
0 commit comments