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

Unified Diff: tools/js2c.py

Issue 7066048: Compress sources of JS libraries in addition to the snapshot. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 7 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
« src/mksnapshot.cc ('K') | « tools/gyp/v8.gyp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()
« src/mksnapshot.cc ('K') | « tools/gyp/v8.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698