Index: tools/js2c.py |
diff --git a/tools/js2c.py b/tools/js2c.py |
index 243f5dd58e20eb6ba04bab6970af53a915aaa459..788b2e74d24729cdfa5782dae2a03fd50b705896 100755 |
--- a/tools/js2c.py |
+++ b/tools/js2c.py |
@@ -340,9 +340,9 @@ def BuildFilterChain(macro_filename, message_template_file): |
macro_filename: Name of the macro file, if any. |
Returns: |
- A function (string -> string) that reads a source file and processes it. |
+ A function (string -> string) that processes a source file. |
""" |
- filter_chain = [ReadFile] |
+ filter_chain = [] |
if macro_filename: |
(consts, macros) = ReadMacros(ReadFile(macro_filename)) |
@@ -367,7 +367,7 @@ def BuildFilterChain(macro_filename, message_template_file): |
return reduce(chain, filter_chain) |
def BuildExtraFilterChain(): |
- return lambda x: RemoveCommentsAndTrailingWhitespace(Validate(ReadFile(x))) |
+ return lambda x: RemoveCommentsAndTrailingWhitespace(Validate(x)) |
class Sources: |
def __init__(self): |
@@ -386,14 +386,14 @@ def IsMessageTemplateFile(filename): |
return filename.endswith("messages.h") |
-def PrepareSources(source_files, extra_files, emit_js): |
+def PrepareSources(source_files, native_type, emit_js): |
"""Read, prepare and assemble the list of source files. |
Args: |
source_files: List of JavaScript-ish source files. A file named macros.py |
will be treated as a list of macros. |
- extra_files: List of JavaScript-ish extra source files, passed in |
- externally from V8. Will not be minified or macro-ified. |
+ native_type: String corresponding to a NativeType enum value, allowing us |
+ to treat different types of sources differently. |
emit_js: True if we should skip the byte conversion and just leave the |
sources as JS strings. |
@@ -414,18 +414,30 @@ def PrepareSources(source_files, extra_files, emit_js): |
source_files.remove(message_template_files[0]) |
message_template_file = message_template_files[0] |
- filters = BuildFilterChain(macro_file, message_template_file) |
- extra_filters = BuildExtraFilterChain() |
+ filters = None |
+ if native_type == "EXTRA": |
+ filters = BuildExtraFilterChain() |
+ else: |
+ filters = BuildFilterChain(macro_file, message_template_file) |
# Sort 'debugger' sources first. |
source_files = sorted(source_files, |
lambda l,r: IsDebuggerFile(r) - IsDebuggerFile(l)) |
+ source_files_and_contents = [(f, ReadFile(f)) for f in source_files] |
+ |
+ # Have a single not-quite-empty source file if there are none present; |
+ # otherwise you get errors trying to compile an empty C++ array. |
+ # It cannot be empty (or whitespace, which gets trimmed to empty), as |
+ # the deserialization code assumes each file is nonempty. |
+ if not source_files_and_contents: |
+ source_files_and_contents = [("dummy.js", "void 0;")] |
+ |
result = Sources() |
- for source in source_files: |
+ for (source, contents) in source_files_and_contents: |
try: |
- lines = filters(source) |
+ lines = filters(contents) |
except Error as e: |
raise Error("In file %s:\n%s" % (source, str(e))) |
@@ -437,16 +449,6 @@ def PrepareSources(source_files, extra_files, emit_js): |
name = os.path.basename(source)[:-3] |
result.names.append(name if not is_debugger else name[:-9]) |
- for extra in extra_files: |
- try: |
- lines = extra_filters(extra) |
- except Error as e: |
- raise Error("In file %s:\n%s" % (extra, str(e))) |
- |
- result.modules.append(lines) |
- name = os.path.basename(extra)[:-3] |
- result.names.append(name) |
- |
return result |
@@ -550,8 +552,8 @@ def WriteStartupBlob(sources, startup_blob): |
output.close() |
-def JS2C(sources, extra_sources, target, native_type, raw_file, startup_blob, emitJS): |
- prepared_sources = PrepareSources(sources, extra_sources, emitJS) |
+def JS2C(sources, target, native_type, raw_file, startup_blob, emit_js): |
+ prepared_sources = PrepareSources(sources, native_type, emit_js) |
sources_output = "".join(prepared_sources.modules) |
metadata = BuildMetadata(prepared_sources, sources_output, native_type) |
@@ -566,7 +568,7 @@ def JS2C(sources, extra_sources, target, native_type, raw_file, startup_blob, em |
# Emit resulting source file. |
output = open(target, "w") |
- if emitJS: |
+ if emit_js: |
output.write(sources_output) |
else: |
output.write(HEADER_TEMPLATE % metadata) |
@@ -578,24 +580,21 @@ def main(): |
parser.add_argument("out.cc", |
help="output filename") |
parser.add_argument("type", |
- help="type parameter for NativesCollection template") |
+ help="type parameter for NativesCollection template " + |
+ "(see NativeType enum)") |
parser.add_argument("sources.js", |
help="JS internal sources or macros.py.", |
- nargs="+") |
+ nargs="*") |
parser.add_argument("--raw", |
help="file to write the processed sources array to.") |
parser.add_argument("--startup_blob", |
help="file to write the startup blob to.") |
- parser.add_argument("--extra", |
- help="extra JS sources.", |
- nargs="*") |
parser.add_argument("--js", |
help="writes a JS file output instead of a C file", |
action="store_true") |
args = vars(parser.parse_args()) |
- JS2C(args["sources.js"], args["extra"] or [], args["out.cc"], args["type"], args["raw"], args["startup_blob"], |
- args["js"]) |
+ JS2C(args["sources.js"], args["out.cc"], args["type"], args["raw"], args["startup_blob"], args["js"]) |
if __name__ == "__main__": |