ninjabackend: optimize ninja_quote

Use regular expressions to quickly weed out strings that require quoting
On a QEMU build the time spent in ninja_quote goes from 1.978s to 1.281s,
with str.replace being kicked completely out of the profile.
pull/7607/head
Paolo Bonzini 4 years ago
parent b7a4c0793c
commit 3d4fb02e29
  1. 14
      mesonbuild/backend/ninjabackend.py

@ -114,13 +114,17 @@ rsp_threshold = get_rsp_threshold()
# from, etc.), so it must not be shell quoted. # from, etc.), so it must not be shell quoted.
raw_names = {'DEPFILE_UNQUOTED', 'DESC', 'pool', 'description', 'targetdep'} raw_names = {'DEPFILE_UNQUOTED', 'DESC', 'pool', 'description', 'targetdep'}
NINJA_QUOTE_BUILD_PAT = re.compile(r"[$ :\n]")
NINJA_QUOTE_VAR_PAT = re.compile(r"[$ \n]")
def ninja_quote(text, is_build_line=False): def ninja_quote(text, is_build_line=False):
if is_build_line: if is_build_line:
qcs = ('$', ' ', ':') quote_re = NINJA_QUOTE_BUILD_PAT
else: else:
qcs = ('$', ' ') quote_re = NINJA_QUOTE_VAR_PAT
for char in qcs: # Fast path for when no quoting is necessary
text = text.replace(char, '$' + char) if not quote_re.search(text):
return text
if '\n' in text: if '\n' in text:
errmsg = '''Ninja does not support newlines in rules. The content was: errmsg = '''Ninja does not support newlines in rules. The content was:
@ -128,7 +132,7 @@ def ninja_quote(text, is_build_line=False):
Please report this error with a test case to the Meson bug tracker.'''.format(text) Please report this error with a test case to the Meson bug tracker.'''.format(text)
raise MesonException(errmsg) raise MesonException(errmsg)
return text return quote_re.sub(r'$\g<0>', text)
@unique @unique
class Quoting(Enum): class Quoting(Enum):

Loading…
Cancel
Save