Chromium Code Reviews| Index: tools/js2c.py |
| diff --git a/tools/js2c.py b/tools/js2c.py |
| index 8211ec5880249e1ccaea1c5f5add65da7347801c..25c1600883d56a5a33a760185c1ba7ad9f3f99c7 100644 |
| --- a/tools/js2c.py |
| +++ b/tools/js2c.py |
| @@ -33,15 +33,22 @@ |
| import os, re, sys, string |
| import jsmin |
| +import bz2 |
| -def ToCArray(lines): |
| +def ToCAsciiArray(lines): |
| result = [] |
| for chr in lines: |
| value = ord(chr) |
| assert value < 128 |
| result.append(str(value)) |
| - result.append("0") |
| + return ", ".join(result) |
| + |
| + |
| +def ToCArray(lines): |
| + result = [] |
| + for chr in lines: |
| + result.append(str(ord(chr))) |
| return ", ".join(result) |
| @@ -87,8 +94,8 @@ def ParseValue(string): |
| return string |
| -EVAL_PATTERN = re.compile(r'\beval\s*\('); |
| -WITH_PATTERN = re.compile(r'\bwith\s*\('); |
| +EVAL_PATTERN = re.compile(r'\beval\s*\(') |
| +WITH_PATTERN = re.compile(r'\bwith\s*\(') |
| def Validate(lines, file): |
| @@ -212,12 +219,15 @@ HEADER_TEMPLATE = """\ |
| #include "v8.h" |
| #include "natives.h" |
| +#include "utils.h" |
| namespace v8 { |
| namespace internal { |
| %(source_lines)s\ |
| +%(raw_source_lines)s\ |
| + |
| template <> |
| int NativesCollection<%(type)s>::GetBuiltinsCount() { |
| return %(builtin_count)i; |
| @@ -235,8 +245,14 @@ namespace internal { |
| } |
| template <> |
| - Vector<const char> NativesCollection<%(type)s>::GetScriptSource(int index) { |
| -%(get_script_source_cases)s\ |
| + int NativesCollection<%(type)s>::GetRawScriptSize(int index) { |
| +%(get_raw_script_size_cases)s\ |
| + return -1; |
| + } |
| + |
| + template <> |
| + Vector<const char> NativesCollection<%(type)s>::GetRawScriptSource(int index) { |
| +%(get_raw_script_source_cases)s\ |
| return Vector<const char>("", 0); |
| } |
| @@ -246,30 +262,67 @@ namespace internal { |
| return Vector<const char>("", 0); |
| } |
| + template <> |
| + Vector<const byte> NativesCollection<%(type)s>::GetScriptSource(int index) { |
| +%(get_script_source_cases)s\ |
| + static const byte empty[] = { 0 }; |
| + return Vector<const byte>(empty, 0); |
| + } |
| + |
| + template <> |
| + void NativesCollection<%(type)s>::SetRawScriptSource(int index, Vector<const char> raw_source) { |
| +%(set_raw_script_source_cases)s\ |
| + } |
| + |
| } // internal |
| } // v8 |
| """ |
| SOURCE_DECLARATION = """\ |
| - static const char %(id)s[] = { %(data)s }; |
| + static const byte %(id)s[] = { %(data)s }; |
| """ |
| -GET_DEBUGGER_INDEX_CASE = """\ |
| +RAW_SOURCE_COMPRESSION_DECLARATION = """\ |
| + static const char* %(raw_id)s = NULL; |
| +""" |
| + |
| + |
| +RAW_SOURCE_DECLARATION = """\ |
| + static const char* %(raw_id)s = reinterpret_cast<const char*>(%(id)s); |
| +""" |
| + |
| + |
| +GET_INDEX_CASE = """\ |
| if (strcmp(name, "%(id)s") == 0) return %(i)i; |
| """ |
| -GET_DEBUGGER_SCRIPT_SOURCE_CASE = """\ |
| - if (index == %(i)i) return Vector<const char>(%(id)s, %(length)i); |
| +GET_RAW_SCRIPT_SIZE_CASE = """\ |
| + if (index == %(i)i) return %(raw_length)i; |
| """ |
| -GET_DEBUGGER_SCRIPT_NAME_CASE = """\ |
| +GET_RAW_SCRIPT_SOURCE_CASE = """\ |
| + if (index == %(i)i) return Vector<const char>(%(raw_id)s, %(raw_length)i); |
| +""" |
| + |
| + |
| +GET_SCRIPT_NAME_CASE = """\ |
| if (index == %(i)i) return Vector<const char>("%(name)s", %(length)i); |
| """ |
| + |
| +GET_SCRIPT_SOURCE_CASE = """\ |
| + if (index == %(i)i) return Vector<const byte>(%(id)s, %(length)i); |
| +""" |
| + |
| + |
| +SET_RAW_SOURCE_CASE = """\ |
| + if (index == %(i)i) { ASSERT(%(raw_length)i == raw_source.length()); %(raw_id)s = raw_source.start(); } |
| +""" |
| + |
| def JS2C(source, target, env): |
| ids = [] |
| debugger_ids = [] |
| @@ -285,6 +338,7 @@ def JS2C(source, target, env): |
| # Build source code lines |
| source_lines = [ ] |
| + raw_source_lines = [ ] |
| minifier = jsmin.JavaScriptMinifier() |
| @@ -296,49 +350,94 @@ def JS2C(source, target, env): |
| lines = ExpandMacros(lines, macros) |
| Validate(lines, filename) |
| lines = minifier.JSMinify(lines) |
| - data = ToCArray(lines) |
| + raw_length = len(lines) |
| + if env['COMPRESSION'] == 'bz2': |
|
Vitaly Repeshko
2011/06/06 10:08:23
I think we can get better compression by gluing to
mnaganov (inactive)
2011/06/06 13:40:18
Good idea! This also simplifies code.
|
| + lines = bz2.compress(lines, 9) |
|
Vitaly Repeshko
2011/06/06 10:08:23
9 seems to be the default compression level so we
mnaganov (inactive)
2011/06/06 13:40:18
Done.
|
| + length = len(lines) |
| + if env['COMPRESSION'] == 'off': |
| + data = ToCAsciiArray(lines) |
| + else: |
| + data = ToCArray(lines) |
| id = (os.path.split(filename)[1])[:-3] |
| if debugger: id = id[:-9] |
| if debugger: |
| - debugger_ids.append((id, len(lines))) |
| + debugger_ids.append((id, raw_length, length)) |
| else: |
| - ids.append((id, len(lines))) |
| + ids.append((id, raw_length, length)) |
| + raw_id = 'raw_' + id |
| source_lines.append(SOURCE_DECLARATION % { 'id': id, 'data': data }) |
| + if env['COMPRESSION'] == 'off': |
| + raw_source_lines.append(RAW_SOURCE_DECLARATION % { 'raw_id': raw_id, 'id': id }) |
|
Vitaly Repeshko
2011/06/06 10:08:23
Let's at least fit the code lines in 80 cols.
mnaganov (inactive)
2011/06/06 13:40:18
Done.
|
| + else: |
| + raw_source_lines.append(RAW_SOURCE_COMPRESSION_DECLARATION % { 'raw_id': raw_id, 'id': id }) |
| # Build debugger support functions |
| get_index_cases = [ ] |
| - get_script_source_cases = [ ] |
| + get_raw_script_size_cases = [ ] |
| + get_raw_script_source_cases = [ ] |
| get_script_name_cases = [ ] |
| + get_script_source_cases = [ ] |
| + set_raw_script_source_cases = [ ] |
| i = 0 |
| - for (id, length) in debugger_ids: |
| + for (id, raw_length, length) in debugger_ids: |
| native_name = "native %s.js" % id |
| - get_index_cases.append(GET_DEBUGGER_INDEX_CASE % { 'id': id, 'i': i }) |
| - get_script_source_cases.append(GET_DEBUGGER_SCRIPT_SOURCE_CASE % { |
| - 'id': id, |
| - 'length': length, |
| - 'i': i |
| - }) |
| - get_script_name_cases.append(GET_DEBUGGER_SCRIPT_NAME_CASE % { |
| - 'name': native_name, |
| - 'length': len(native_name), |
| - 'i': i |
| - }); |
| + raw_id = 'raw_' + id |
| + get_index_cases.append(GET_INDEX_CASE % { 'id': id, 'i': i }) |
| + get_raw_script_size_cases.append(GET_RAW_SCRIPT_SIZE_CASE % { |
| + 'raw_length': raw_length, |
| + 'i': i |
| + }) |
| + get_raw_script_source_cases.append(GET_RAW_SCRIPT_SOURCE_CASE % { |
| + 'raw_id': raw_id, |
| + 'raw_length': raw_length, |
| + 'i': i |
| + }) |
| + get_script_name_cases.append(GET_SCRIPT_NAME_CASE % { |
| + 'name': native_name, |
| + 'length': len(native_name), |
| + 'i': i |
| + }) |
| + get_script_source_cases.append(GET_SCRIPT_SOURCE_CASE % { |
| + 'id': id, |
| + 'length': length, |
| + 'i': i |
| + }) |
| + set_raw_script_source_cases.append(SET_RAW_SOURCE_CASE % { |
| + 'raw_id': raw_id, |
| + 'raw_length': raw_length, |
| + 'i': i |
| + }) |
| i = i + 1 |
| - for (id, length) in ids: |
| + for (id, raw_length, length) in ids: |
| native_name = "native %s.js" % id |
| - get_index_cases.append(GET_DEBUGGER_INDEX_CASE % { 'id': id, 'i': i }) |
| - get_script_source_cases.append(GET_DEBUGGER_SCRIPT_SOURCE_CASE % { |
| - 'id': id, |
| - 'length': length, |
| - 'i': i |
| - }) |
| - get_script_name_cases.append(GET_DEBUGGER_SCRIPT_NAME_CASE % { |
| - 'name': native_name, |
| - 'length': len(native_name), |
| - 'i': i |
| - }); |
| + raw_id = 'raw_' + id |
| + get_index_cases.append(GET_INDEX_CASE % { 'id': id, 'i': i }) |
| + get_raw_script_size_cases.append(GET_RAW_SCRIPT_SIZE_CASE % { |
| + 'raw_length': raw_length, |
| + 'i': i |
| + }) |
| + get_raw_script_source_cases.append(GET_RAW_SCRIPT_SOURCE_CASE % { |
| + 'raw_id': raw_id, |
| + 'raw_length': raw_length, |
| + 'i': i |
| + }) |
| + get_script_name_cases.append(GET_SCRIPT_NAME_CASE % { |
| + 'name': native_name, |
| + 'length': len(native_name), |
| + 'i': i |
| + }) |
| + get_script_source_cases.append(GET_SCRIPT_SOURCE_CASE % { |
| + 'id': id, |
| + 'length': length, |
| + 'i': i |
| + }) |
| + set_raw_script_source_cases.append(SET_RAW_SOURCE_CASE % { |
| + 'raw_id': raw_id, |
| + 'raw_length': raw_length, |
| + 'i': i |
| + }) |
| i = i + 1 |
| # Emit result |
| @@ -347,9 +446,13 @@ def JS2C(source, target, env): |
| 'builtin_count': len(ids) + len(debugger_ids), |
| 'debugger_count': len(debugger_ids), |
| 'source_lines': "\n".join(source_lines), |
| + 'raw_source_lines': "\n".join(raw_source_lines), |
| 'get_index_cases': "".join(get_index_cases), |
| - 'get_script_source_cases': "".join(get_script_source_cases), |
| + 'get_raw_script_size_cases': "".join(get_raw_script_size_cases), |
| + 'get_raw_script_source_cases': "".join(get_raw_script_source_cases), |
| 'get_script_name_cases': "".join(get_script_name_cases), |
| + 'get_script_source_cases': "".join(get_script_source_cases), |
| + 'set_raw_script_source_cases': "".join(set_raw_script_source_cases), |
| 'type': env['TYPE'] |
| }) |
| output.close() |
| @@ -357,8 +460,9 @@ def JS2C(source, target, env): |
| def main(): |
| natives = sys.argv[1] |
| type = sys.argv[2] |
| - source_files = sys.argv[3:] |
| - JS2C(source_files, [natives], { 'TYPE': type }) |
| + compression = sys.argv[3] |
| + source_files = sys.argv[4:] |
| + JS2C(source_files, [natives], { 'TYPE': type, 'COMPRESSION': compression }) |
| if __name__ == "__main__": |
| main() |