Skip to content

Commit

Permalink
Match compiler: Support match patterns with escaped quotes
Browse files Browse the repository at this point in the history
This allows us to compile patterns like 'extern "C"'.
Fixes long standing open issues in the MC unit test.
  • Loading branch information
thomasjfox committed Jan 9, 2015
1 parent d110d71 commit 5b4f543
Showing 2 changed files with 28 additions and 17 deletions.
4 changes: 2 additions & 2 deletions tools/matchcompiler.py
Original file line number Diff line number Diff line change
@@ -396,7 +396,7 @@ def _replaceTokenMatch(self, line):
if len(res) == 4:
varId = res[3]

res = re.match(r'\s*"([^"]*)"\s*$', raw_pattern)
res = re.match(r'\s*"((?:.|\\")*?)"\s*$', raw_pattern)
if res is None:
break # Non-const pattern - bailout

@@ -550,7 +550,7 @@ def _replaceTokenFindMatch(self, line):
elif varId is None and len(res) == 4:
endToken = res[3]

res = re.match(r'\s*"([^"]*)"\s*$', pattern)
res = re.match(r'\s*"((?:.|\\")*?)"\s*$', pattern)
if res is None:
break # Non-const pattern - bailout

41 changes: 26 additions & 15 deletions tools/test_matchcompiler.py
Original file line number Diff line number Diff line change
@@ -47,10 +47,21 @@ def test_replaceTokenMatch(self):

input = 'if (Token::Match(tok, "foo\"special\"bar %num%")) {'
output = self.mc._replaceTokenMatch(input)
# FIXME: Currently detected as non-static pattern
self.assertEqual(
output, 'if (Token::Match(tok, "foo"special"bar %num%")) {')
# self.assertEqual(3, len(self.mc._matchStrs))
output, 'if (match3(tok)) {')
self.assertEqual(2, len(self.mc._matchStrs))

# test that non-static patterns get passed on unmatched
input = 'if (Token::Match(tok, "struct " + varname)) {'
output = self.mc._replaceTokenMatch(input)
self.assertEqual(
output, 'if (Token::Match(tok, "struct " + varname)) {')

# test that non-static patterns get passed on unmatched
input = 'if (Token::Match(tok, "extern \"C\" " + varname)) {'
output = self.mc._replaceTokenMatch(input)
self.assertEqual(
output, 'if (Token::Match(tok, "extern \"C\" " + varname)) {')

def test_replaceTokenMatchWithVarId(self):
input = 'if (Token::Match(tok, "foobar %varid%", 123)) {'
@@ -66,22 +77,22 @@ def test_replaceTokenMatchWithVarId(self):

input = 'if (Token::Match(tok, "foo\"special\"bar %type% %varid%", my_varid_cache)) {'
output = self.mc._replaceTokenMatch(input)
# FIXME: Currently detected as non-static pattern
self.assertEqual(
output, 'if (Token::Match(tok, "foo"special"bar %type% %varid%", my_varid_cache)) {')
# self.assertEqual(1, len(self.mc._matchStrs))
output, 'if (match3(tok, my_varid_cache)) {')
self.assertEqual(2, len(self.mc._matchStrs))
self.assertEqual(2, self.mc._matchStrs['foo"special"bar'])

# test caching: reuse existing matchX()
input = 'if (Token::Match(tok, "foobar %varid%", 123)) {'
output = self.mc._replaceTokenMatch(input)
self.assertEqual(output, 'if (match1(tok, 123)) {')
self.assertEqual(1, len(self.mc._matchStrs))
self.assertEqual(2, len(self.mc._matchStrs))

# two in one line
input = 'if (Token::Match(tok, "foobar2 %varid%", 123) || Token::Match(tok, "%type% %varid%", 123)) {'
output = self.mc._replaceTokenMatch(input)
self.assertEqual(output, 'if (match3(tok, 123) || match4(tok, 123)) {')
self.assertEqual(2, len(self.mc._matchStrs))
self.assertEqual(output, 'if (match4(tok, 123) || match5(tok, 123)) {')
self.assertEqual(3, len(self.mc._matchStrs))

def test_replaceTokenSimpleMatch(self):
input = 'if (Token::simpleMatch(tok, "foobar")) {'
@@ -98,10 +109,10 @@ def test_replaceTokenSimpleMatch(self):

input = 'if (Token::simpleMatch(tok, "foo\"special\"bar")) {'
output = self.mc._replaceTokenMatch(input)
# FIXME: Currently detected as non-static pattern
self.assertEqual(
output, 'if (Token::simpleMatch(tok, "foo\"special\"bar")) {')
self.assertEqual(1, len(self.mc._matchStrs))
output, 'if (match2(tok)) {')
self.assertEqual(2, len(self.mc._matchStrs))
self.assertEqual(2, self.mc._matchStrs['foo\"special\"bar'])

def test_replaceTokenFindSimpleMatch(self):
input = 'if (Token::findsimplematch(tok, "foobar")) {'
@@ -119,10 +130,10 @@ def test_replaceTokenFindSimpleMatch(self):

input = 'if (Token::findsimplematch(tok, "foo\"special\"bar")) {'
output = self.mc._replaceTokenFindMatch(input)
# FIXME: Currently detected as non-static pattern
self.assertEqual(
output, 'if (Token::findsimplematch(tok, "foo\"special\"bar")) {')
self.assertEqual(1, len(self.mc._matchStrs))
output, 'if (findmatch3(tok)) {')
self.assertEqual(2, len(self.mc._matchStrs))
self.assertEqual(2, self.mc._matchStrs['foo\"special\"bar'])

def test_replaceTokenFindMatch(self):
input = 'if (Token::findmatch(tok, "foobar")) {'

0 comments on commit 5b4f543

Please sign in to comment.