summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/Scripts/generate-js-builtins.py
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/Scripts/generate-js-builtins.py
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/Scripts/generate-js-builtins.py')
-rw-r--r--Source/JavaScriptCore/Scripts/generate-js-builtins.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/Scripts/generate-js-builtins.py b/Source/JavaScriptCore/Scripts/generate-js-builtins.py
new file mode 100644
index 000000000..554a72ccc
--- /dev/null
+++ b/Source/JavaScriptCore/Scripts/generate-js-builtins.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2014, 2015 Apple Inc. All rights reserved.
+# Copyright (c) 2014 University of Washington. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+# This script generates C++ bindings for JavaScript builtins.
+# Generators for individual files are located in the builtins/ directory.
+
+import fnmatch
+import logging
+import optparse
+import os
+
+logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.ERROR)
+log = logging.getLogger('global')
+
+from lazywriter import LazyFileWriter
+
+import builtins
+from builtins import *
+
+
+def generate_bindings_for_builtins_files(builtins_files=[],
+ output_path=None,
+ concatenate_output=False,
+ combined_output=False,
+ framework_name="",
+ force_output=False):
+
+ generators = []
+
+ model = BuiltinsCollection(framework_name=framework_name)
+
+ for filepath in builtins_files:
+ with open(filepath, "r") as file:
+ file_text = file.read()
+ file_name = os.path.basename(filepath)
+
+ # If this is a test file, then rewrite the filename to remove the
+ # test running options encoded into the filename.
+ if file_name.startswith(framework_name):
+ (_, object_name, _) = file_name.split('-')
+ file_name = object_name + '.js'
+ model.parse_builtins_file(file_name, file_text)
+
+ if combined_output:
+ log.debug("Using generator style: combined files for all builtins.")
+ generators.append(BuiltinsCombinedHeaderGenerator(model))
+ generators.append(BuiltinsCombinedImplementationGenerator(model))
+ else:
+ log.debug("Using generator style: single files for each builtin.")
+ for object in model.objects:
+ generators.append(BuiltinsSeparateHeaderGenerator(model, object))
+ generators.append(BuiltinsSeparateImplementationGenerator(model, object))
+
+ log.debug("")
+ log.debug("Generating bindings for builtins.")
+
+ test_result_file_contents = []
+
+ for generator in generators:
+ output_filepath = os.path.join(output_path, generator.output_filename())
+ log.debug("Generating output file: %s" % generator.output_filename())
+ output = generator.generate_output()
+
+ log.debug("---")
+ log.debug("\n" + output)
+ log.debug("---")
+ if concatenate_output:
+ test_result_file_contents.append('### Begin File: %s' % generator.output_filename())
+ test_result_file_contents.append(output)
+ test_result_file_contents.append('### End File: %s' % generator.output_filename())
+ test_result_file_contents.append('')
+ else:
+ log.debug("Writing file: %s" % output_filepath)
+ output_file = LazyFileWriter(output_filepath, force_output)
+ output_file.write(output)
+ output_file.close()
+
+ if concatenate_output:
+ filename = os.path.join(os.path.basename(builtins_files[0]) + '-result')
+ output_filepath = os.path.join(output_path, filename)
+ log.debug("Writing file: %s" % output_filepath)
+ output_file = LazyFileWriter(output_filepath, force_output)
+ output_file.write('\n'.join(test_result_file_contents))
+ output_file.close()
+
+if __name__ == '__main__':
+ allowed_framework_names = ['JavaScriptCore', 'WebCore']
+ cli_parser = optparse.OptionParser(usage="usage: %prog [options] Builtin1.js [, Builtin2.js, ...]")
+ cli_parser.add_option("-i", "--input-directory", help="If specified, generates builtins from all JavaScript files in the specified directory in addition to specific files passed as arguments.")
+ cli_parser.add_option("-o", "--output-directory", help="Directory where generated files should be written.")
+ cli_parser.add_option("--framework", type="choice", choices=allowed_framework_names, help="Destination framework for generated files.")
+ cli_parser.add_option("--force", action="store_true", help="Force output of generated scripts, even if nothing changed.")
+ cli_parser.add_option("--combined", action="store_true", help="Produce one .h/.cpp file instead of producing one per builtin object.")
+ cli_parser.add_option("-v", "--debug", action="store_true", help="Log extra output for debugging the generator itself.")
+ cli_parser.add_option("-t", "--test", action="store_true", help="Enable test mode.")
+
+ arg_options, arg_values = cli_parser.parse_args()
+ if len(arg_values) is 0 and not arg_options.input_directory:
+ raise ParseException("At least one input file or directory expected.")
+
+ if not arg_options.output_directory:
+ raise ParseException("Missing output directory.")
+
+ if arg_options.debug:
+ log.setLevel(logging.DEBUG)
+
+ input_filepaths = arg_values[:]
+ if arg_options.input_directory:
+ for filepath in os.listdir(arg_options.input_directory):
+ input_filepaths.append(os.path.join(arg_options.input_directory, filepath))
+
+ input_filepaths = filter(lambda name: fnmatch.fnmatch(name, '*.js'), input_filepaths)
+
+ options = {
+ 'output_path': arg_options.output_directory,
+ 'framework_name': arg_options.framework,
+ 'combined_output': arg_options.combined,
+ 'force_output': arg_options.force,
+ 'concatenate_output': arg_options.test,
+ }
+
+ log.debug("Generating code for builtins.")
+ log.debug("Parsed options:")
+ for option, value in options.items():
+ log.debug(" %s: %s" % (option, value))
+ log.debug("")
+ log.debug("Input files:")
+ for filepath in input_filepaths:
+ log.debug(" %s" % filepath)
+ log.debug("")
+
+ try:
+ generate_bindings_for_builtins_files(builtins_files=input_filepaths, **options)
+ except ParseException as e:
+ if arg_options.test:
+ log.error(e.message)
+ else:
+ raise # Force the build to fail.