Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Unified Diff: Source/bindings/scripts/blink_idl_parser.py

Issue 184233005: Pre-cache PLY yacc parse table and use optimized mode (45% build time improvement) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Reupload Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/bindings/scripts/blink_idl_parser.py
diff --git a/Source/bindings/scripts/blink_idl_parser.py b/Source/bindings/scripts/blink_idl_parser.py
index bbc302138f52452c4f9ca02f2edf3e18bdcda601..30d625bad11ad0c38b98f6bf3f43c35c52999a96 100644
--- a/Source/bindings/scripts/blink_idl_parser.py
+++ b/Source/bindings/scripts/blink_idl_parser.py
@@ -402,14 +402,47 @@ class BlinkIDLParser(IDLParser):
keys.remove(production_name)
return list(keys)
- def __init__(self, lexer=None, verbose=False, debug=False, mute_error=False, outputdir=''):
+ def __init__(self,
+ # common parameters
+ debug=False,
+ # idl_parser parameters
+ lexer=None, verbose=False, mute_error=False,
+ # yacc parameters
+ outputdir='', optimize=True, write_tables=False,
+ picklefile=None):
+ if debug:
+ # Turn off optimization and caching, and write out tables,
+ # to help debugging
+ optimize = False
+ outputdir = None
+ picklefile = None
+ write_tables = True
+ if outputdir:
+ picklefile = picklefile or os.path.join(outputdir, 'parsetab.pickle')
+
lexer = lexer or BlinkIDLLexer()
self.lexer = lexer
self.tokens = lexer.KnownTokens()
# Using SLR (instead of LALR) generates the table faster,
# but produces the same output. This is ok b/c Web IDL (and Blink IDL)
# is an SLR grammar (as is often the case for simple LL(1) grammars).
- self.yaccobj = yacc.yacc(module=self, start=STARTING_SYMBOL, method='SLR', debug=debug, outputdir=outputdir)
+ #
+ # Optimized mode substantially decreases startup time (by disabling
+ # error checking), and also allows use of Python's optimized mode.
+ # See: Using Python's Optimized Mode
+ # http://www.dabeaz.com/ply/ply.html#ply_nn38
+ #
+ # |picklefile| allows simpler importing than |tabmodule| (parsetab.py),
+ # as we don't need to modify sys.path; virtually identical speed.
+ # See: CHANGES, Version 3.2
+ # http://ply.googlecode.com/svn/trunk/CHANGES
+ self.yaccobj = yacc.yacc(module=self,
+ start=STARTING_SYMBOL,
+ method='SLR',
+ debug=debug,
+ optimize=optimize,
+ write_tables=write_tables,
+ picklefile=picklefile)
self.parse_debug = debug
self.verbose = verbose
self.mute_error = mute_error
@@ -420,6 +453,17 @@ class BlinkIDLParser(IDLParser):
self._last_error_pos = 0
-# If run by itself, attempt to build the parser
+################################################################################
+
+def main(argv):
+ # If file itself executed, cache parse table
+ try:
+ outputdir = argv[1]
+ except IndexError as err:
+ print 'Usage: %s OUTPUT_DIR' % argv[0]
+ return 1
+ parser = BlinkIDLParser(outputdir=outputdir)
+
+
if __name__ == '__main__':
- parser = BlinkIDLParser()
+ sys.exit(main(sys.argv))

Powered by Google App Engine
This is Rietveld 408576698