| Index: tools/js2c.py
|
| diff --git a/tools/js2c.py b/tools/js2c.py
|
| index 327e7d916c3141e1044e0c81c279e6c33aa9f307..c72afbc5d66a9b8d34e81abf75b2ec2b3b203cb4 100755
|
| --- a/tools/js2c.py
|
| +++ b/tools/js2c.py
|
| @@ -69,6 +69,7 @@ def ReadFile(filename):
|
|
|
| EVAL_PATTERN = re.compile(r'\beval\s*\(')
|
| WITH_PATTERN = re.compile(r'\bwith\s*\(')
|
| +INVALID_ERROR_MESSAGE_PATTERN = re.compile(r'Make\w*Error\((k\w+),')
|
|
|
| def Validate(lines):
|
| # Because of simplified context setup, eval and with is not
|
| @@ -77,7 +78,9 @@ def Validate(lines):
|
| raise Error("Eval disallowed in natives.")
|
| if WITH_PATTERN.search(lines):
|
| raise Error("With statements disallowed in natives.")
|
| -
|
| + invalid_error = INVALID_ERROR_MESSAGE_PATTERN.search(lines)
|
| + if invalid_error:
|
| + raise Error("Unknown error message template '%s'" % invalid_error.group(1))
|
| # Pass lines through unchanged.
|
| return lines
|
|
|
| @@ -188,6 +191,21 @@ def ReadMacros(lines):
|
| raise Error("Illegal line: " + line)
|
| return (constants, macros)
|
|
|
| +
|
| +TEMPLATE_PATTERN = re.compile(r'^\s+T\(([a-zA-Z]+), ".+"\)')
|
| +
|
| +def ReadMessageTemplates(lines):
|
| + templates = []
|
| + index = 0
|
| + for line in lines.split('\n'):
|
| + template_match = TEMPLATE_PATTERN.match(line)
|
| + if template_match:
|
| + name = "k%s" % template_match.group(1)
|
| + value = index
|
| + index = index + 1
|
| + templates.append((re.compile("\\b%s\\b" % name), value))
|
| + return templates
|
| +
|
| INLINE_MACRO_PATTERN = re.compile(r'macro\s+([a-zA-Z0-9_]+)\s*\(([^)]*)\)\s*\n')
|
| INLINE_MACRO_END_PATTERN = re.compile(r'endmacro\s*\n')
|
|
|
| @@ -311,7 +329,7 @@ GET_SCRIPT_NAME_CASE = """\
|
| """
|
|
|
|
|
| -def BuildFilterChain(macro_filename):
|
| +def BuildFilterChain(macro_filename, message_template_file):
|
| """Build the chain of filter functions to be applied to the sources.
|
|
|
| Args:
|
| @@ -327,6 +345,10 @@ def BuildFilterChain(macro_filename):
|
| filter_chain.append(lambda l: ExpandConstants(l, consts))
|
| filter_chain.append(lambda l: ExpandMacros(l, macros))
|
|
|
| + if message_template_file:
|
| + message_templates = ReadMessageTemplates(ReadFile(message_template_file))
|
| + filter_chain.append(lambda l: ExpandConstants(l, message_templates))
|
| +
|
| filter_chain.extend([
|
| RemoveCommentsAndTrailingWhitespace,
|
| ExpandInlineMacros,
|
| @@ -354,6 +376,9 @@ def IsDebuggerFile(filename):
|
| def IsMacroFile(filename):
|
| return filename.endswith("macros.py")
|
|
|
| +def IsMessageTemplateFile(filename):
|
| + return filename.endswith("messages.h")
|
| +
|
|
|
| def PrepareSources(source_files):
|
| """Read, prepare and assemble the list of source files.
|
| @@ -372,7 +397,14 @@ def PrepareSources(source_files):
|
| source_files.remove(macro_files[0])
|
| macro_file = macro_files[0]
|
|
|
| - filters = BuildFilterChain(macro_file)
|
| + message_template_file = None
|
| + message_template_files = filter(IsMessageTemplateFile, source_files)
|
| + assert len(message_template_files) in [0, 1]
|
| + if message_template_files:
|
| + source_files.remove(message_template_files[0])
|
| + message_template_file = message_template_files[0]
|
| +
|
| + filters = BuildFilterChain(macro_file, message_template_file)
|
|
|
| # Sort 'debugger' sources first.
|
| source_files = sorted(source_files,
|
|
|