Skip to content

Commit

Permalink
Merge pull request #223 from rust-lang-nursery/fix-186
Browse files Browse the repository at this point in the history
Fix #186.
  • Loading branch information
BurntSushi committed May 1, 2016
2 parents 090655b + 445c834 commit 4458410
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/dfa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,19 @@ impl<'a> Fsm<'a> {
self.last_match_si = next_si;
prev_si = next_si;

// This permits short-circuiting when matching a regex set.
// In particular, if this DFA state contains only match states,
// then it's impossible to extend the set of matches since
// match states are final. Therefore, we can quit.
if self.prog.matches.len() > 1 {
let state = self.state(next_si);
let just_matches = state.insts.iter()
.all(|&ip| self.prog[ip as usize].is_match());
if just_matches {
return result;
}
}

// Another inner loop! If the DFA stays in this particular
// match state, then we can rip through all of the input
// very quickly, and only recording the match location once
Expand Down
10 changes: 10 additions & 0 deletions src/prog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,16 @@ pub enum Inst {
Bytes(InstBytes),
}

impl Inst {
/// Returns true if and only if this is a match instruction.
pub fn is_match(&self) -> bool {
match *self {
Inst::Match(_) => true,
_ => false,
}
}
}

/// Representation of the Save instruction.
#[derive(Clone, Debug)]
pub struct InstSave {
Expand Down

0 comments on commit 4458410

Please sign in to comment.