summaryrefslogtreecommitdiffstats
path: root/llvm/utils/lit
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2013-08-14 15:24:58 +0000
committerDaniel Dunbar <daniel@zuster.org>2013-08-14 15:24:58 +0000
commitcf0702601a1b2ef2430c7af2a5c4b3c4b21608b0 (patch)
tree127aaeb9dc980016cde76f932fab3acd6d7adecc /llvm/utils/lit
parentede1aa2d3123f52ad99d951d4b8e8ac8a342b1f0 (diff)
downloadbcm5719-llvm-cf0702601a1b2ef2430c7af2a5c4b3c4b21608b0.tar.gz
bcm5719-llvm-cf0702601a1b2ef2430c7af2a5c4b3c4b21608b0.zip
[lit] Support parsing scripts with inconsistent or invalid encodings.
- For whatever reason, we have a lot of test files with bogus unicode characters. This patch allows those scripts to still be parsed on Python3 by changing the parsing logic to work on binary files, and only require the actual script commands to be convertible to ascii. llvm-svn: 188376
Diffstat (limited to 'llvm/utils/lit')
-rw-r--r--llvm/utils/lit/lit/TestRunner.py54
-rw-r--r--llvm/utils/lit/tests/shtest-encoding.py3
2 files changed, 45 insertions, 12 deletions
diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index 068e4991b21..8a9bddd2a23 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -305,24 +305,54 @@ def isExpectedFail(test, xfails):
return False
-def parseIntegratedTestScriptCommands(sourcepath):
+def parseIntegratedTestScriptCommands(source_path):
"""
parseIntegratedTestScriptCommands(source_path) -> commands
Parse the commands in an integrated test script file into a list of
(line_number, command_type, line).
"""
- line_number = 0
- for ln in open(sourcepath):
- line_number += 1
- if 'RUN:' in ln:
- yield (line_number, 'RUN', ln[ln.index('RUN:')+4:])
- elif 'XFAIL:' in ln:
- yield (line_number, 'XFAIL', ln[ln.index('XFAIL:') + 6:])
- elif 'REQUIRES:' in ln:
- yield (line_number, 'REQUIRES', ln[ln.index('REQUIRES:') + 9:])
- elif 'END.' in ln:
- yield (line_number, 'END', ln[ln.index('END.') + 4:])
+
+ # This code is carefully written to be dual compatible with Python 2.5+ and
+ # Python 3 without requiring input files to always have valid codings. The
+ # trick we use is to open the file in binary mode and use the regular
+ # expression library to find the commands, with it scanning strings in
+ # Python2 and bytes in Python3.
+ #
+ # Once we find a match, we do require each script line to be decodable to
+ # ascii, so we convert the outputs to ascii before returning. This way the
+ # remaining code can work with "strings" agnostic of the executing Python
+ # version.
+
+ def to_bytes(str):
+ # Encode to Latin1 to get binary data.
+ return str.encode('ISO-8859-1')
+ keywords = ('RUN:', 'XFAIL:', 'REQUIRES:', 'END.')
+ keywords_re = re.compile(
+ to_bytes("(%s)(.*)\n" % ("|".join(k for k in keywords),)))
+
+ f = open(source_path, 'rb')
+ try:
+ # Read the entire file contents.
+ data = f.read()
+
+ # Iterate over the matches.
+ line_number = 1
+ last_match_position = 0
+ for match in keywords_re.finditer(data):
+ # Compute the updated line number by counting the intervening
+ # newlines.
+ match_position = match.start()
+ line_number += data.count(to_bytes('\n'), last_match_position,
+ match_position)
+ last_match_position = match_position
+
+ # Convert the keyword and line to ascii and yield the command.
+ keyword,ln = match.groups()
+ yield (line_number, keyword[:-1].decode('ascii'),
+ ln.decode('ascii'))
+ finally:
+ f.close()
def parseIntegratedTestScript(test, normalize_slashes=False,
extra_substitutions=[]):
diff --git a/llvm/utils/lit/tests/shtest-encoding.py b/llvm/utils/lit/tests/shtest-encoding.py
new file mode 100644
index 00000000000..dfc987f6df7
--- /dev/null
+++ b/llvm/utils/lit/tests/shtest-encoding.py
@@ -0,0 +1,3 @@
+# RUN: true
+
+# Here is a string that cannot be decoded in line mode: Â.
OpenPOWER on IntegriCloud