Index: tools/js2c.py |
diff --git a/tools/js2c.py b/tools/js2c.py |
index 8211ec5880249e1ccaea1c5f5add65da7347801c..a2ea8eacc79186313e3af025f98c67e429294578 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,11 +219,14 @@ HEADER_TEMPLATE = """\ |
#include "v8.h" |
#include "natives.h" |
+#include "utils.h" |
namespace v8 { |
namespace internal { |
-%(source_lines)s\ |
+ static const byte sources[] = { %(sources_data)s }; |
+ |
+%(raw_sources_declaration)s\ |
template <> |
int NativesCollection<%(type)s>::GetBuiltinsCount() { |
@@ -235,8 +245,13 @@ namespace internal { |
} |
template <> |
- Vector<const char> NativesCollection<%(type)s>::GetScriptSource(int index) { |
-%(get_script_source_cases)s\ |
+ int NativesCollection<%(type)s>::GetRawScriptsSize() { |
+ return %(raw_total_length)i; |
+ } |
+ |
+ template <> |
+ Vector<const char> NativesCollection<%(type)s>::GetRawScriptSource(int index) { |
+%(get_raw_script_source_cases)s\ |
return Vector<const char>("", 0); |
} |
@@ -246,27 +261,43 @@ namespace internal { |
return Vector<const char>("", 0); |
} |
+ template <> |
+ Vector<const byte> NativesCollection<%(type)s>::GetScriptsSource() { |
+ return Vector<const byte>(sources, %(total_length)i); |
+ } |
+ |
+ template <> |
+ void NativesCollection<%(type)s>::SetRawScriptsSource(Vector<const char> raw_source) { |
+ ASSERT(%(raw_total_length)i == raw_source.length()); |
+ raw_sources = raw_source.start(); |
+ } |
+ |
} // internal |
} // v8 |
""" |
-SOURCE_DECLARATION = """\ |
- static const char %(id)s[] = { %(data)s }; |
+RAW_SOURCES_COMPRESSION_DECLARATION = """\ |
+ static const char* raw_sources = NULL; |
+""" |
+ |
+ |
+RAW_SOURCES_DECLARATION = """\ |
+ static const char* raw_sources = reinterpret_cast<const char*>(sources); |
""" |
-GET_DEBUGGER_INDEX_CASE = """\ |
+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_SOURCE_CASE = """\ |
+ if (index == %(i)i) return Vector<const char>(raw_sources + %(offset)i, %(raw_length)i); |
""" |
-GET_DEBUGGER_SCRIPT_NAME_CASE = """\ |
+GET_SCRIPT_NAME_CASE = """\ |
if (index == %(i)i) return Vector<const char>("%(name)s", %(length)i); |
""" |
@@ -283,11 +314,10 @@ def JS2C(source, target, env): |
else: |
modules.append(s) |
- # Build source code lines |
- source_lines = [ ] |
- |
minifier = jsmin.JavaScriptMinifier() |
+ module_offset = 0 |
+ all_sources = [] |
for module in modules: |
filename = str(module) |
debugger = filename.endswith('-debugger.js') |
@@ -296,49 +326,46 @@ def JS2C(source, target, env): |
lines = ExpandMacros(lines, macros) |
Validate(lines, filename) |
lines = minifier.JSMinify(lines) |
- data = ToCArray(lines) |
id = (os.path.split(filename)[1])[:-3] |
if debugger: id = id[:-9] |
+ raw_length = len(lines) |
if debugger: |
- debugger_ids.append((id, len(lines))) |
+ debugger_ids.append((id, raw_length, module_offset)) |
else: |
- ids.append((id, len(lines))) |
- source_lines.append(SOURCE_DECLARATION % { 'id': id, 'data': data }) |
+ ids.append((id, raw_length, module_offset)) |
+ all_sources.append(lines) |
+ module_offset += raw_length |
+ total_length = raw_total_length = module_offset |
+ |
+ if env['COMPRESSION'] == 'off': |
+ raw_sources_declaration = RAW_SOURCES_DECLARATION |
+ sources_data = ToCAsciiArray("".join(all_sources)) |
+ else: |
+ raw_sources_declaration = RAW_SOURCES_COMPRESSION_DECLARATION |
+ if env['COMPRESSION'] == 'bz2': |
+ all_sources = bz2.compress("".join(all_sources)) |
+ total_length = len(all_sources) |
+ sources_data = ToCArray(all_sources) |
# Build debugger support functions |
get_index_cases = [ ] |
- get_script_source_cases = [ ] |
+ get_raw_script_source_cases = [ ] |
get_script_name_cases = [ ] |
i = 0 |
- for (id, 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 |
- }); |
- i = i + 1 |
- |
- for (id, length) in ids: |
+ for (id, raw_length, module_offset) in debugger_ids + 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 |
- }); |
+ get_index_cases.append(GET_INDEX_CASE % { 'id': id, 'i': i }) |
+ get_raw_script_source_cases.append(GET_RAW_SCRIPT_SOURCE_CASE % { |
+ 'offset': module_offset, |
+ 'raw_length': raw_length, |
+ 'i': i |
+ }) |
+ get_script_name_cases.append(GET_SCRIPT_NAME_CASE % { |
+ 'name': native_name, |
+ 'length': len(native_name), |
+ 'i': i |
+ }) |
i = i + 1 |
# Emit result |
@@ -346,9 +373,12 @@ def JS2C(source, target, env): |
output.write(HEADER_TEMPLATE % { |
'builtin_count': len(ids) + len(debugger_ids), |
'debugger_count': len(debugger_ids), |
- 'source_lines': "\n".join(source_lines), |
+ 'sources_data': sources_data, |
+ 'raw_sources_declaration': raw_sources_declaration, |
+ 'raw_total_length': raw_total_length, |
+ 'total_length': total_length, |
'get_index_cases': "".join(get_index_cases), |
- 'get_script_source_cases': "".join(get_script_source_cases), |
+ 'get_raw_script_source_cases': "".join(get_raw_script_source_cases), |
'get_script_name_cases': "".join(get_script_name_cases), |
'type': env['TYPE'] |
}) |
@@ -357,8 +387,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() |