aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemcc58
-rwxr-xr-xtests/runner.py4
2 files changed, 36 insertions, 26 deletions
diff --git a/emcc b/emcc
index 0b8024ce..41a640b9 100755
--- a/emcc
+++ b/emcc
@@ -832,7 +832,8 @@ try:
if DEBUG: print >> sys.stderr, 'emcc: setting up files'
code = ''
- code += '''
+ if final_suffix == 'html':
+ code += '''
var BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : console.log("warning: cannot build blobs"));
var URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : console.log("warning: cannot create object URLs");
var hasBlobConstructor;
@@ -845,8 +846,8 @@ try:
}
'''
- code += 'var preloadedImages = {}; // maps url to image data\n'
- code += 'var preloadedAudios = {}; // maps url to audio data\n'
+ code += 'var preloadedImages = {}; // maps url to image data\n'
+ code += 'var preloadedAudios = {}; // maps url to audio data\n'
# Expand directories into individual files
def add(mode, dirname, names):
@@ -877,23 +878,24 @@ try:
code += '''FS.createFolder('/%s', '%s', true, false);\n''' % (os.path.sep.join(parts[:i]), parts[i])
partial_dirs.append(partial)
- if Compression.on:
- # Compress all datafiles into one archive
+ if final_suffix == 'html':
+ # Bundle all datafiles into one archive. Avoids doing lots of simultaneous XHRs which has overhead.
data = open(data_target, 'wb')
start = 0
for file_ in data_files:
- file_['compression_start'] = start
+ file_['data_start'] = start
curr = open(file_['name']).read()
- file_['compression_end'] = start + len(curr)
+ file_['data_end'] = start + len(curr)
start += len(curr)
data.write(curr)
data.close()
- Compression.compress(data_target)
+ if Compression.on:
+ Compression.compress(data_target)
- # Decompression requests have a similar API to XHRs
+ # Data requests - for getting a block of data out of the big archive - have a similar API to XHRs
code += '''
- function DecompressionRequest() {}
- DecompressionRequest.prototype = {
+ function DataRequest() {}
+ DataRequest.prototype = {
requests: {},
open: function(mode, name) {
this.requests[name] = this;
@@ -910,6 +912,8 @@ try:
code += '''FS.createDataFile('/', '%s', %s, true, true);\n''' % (os.path.basename(filename), str(map(ord, open(filename, 'rb').read())))
elif file_['mode'] == 'preload':
# Preload
+ assert final_suffix == 'html', 'Can only preload files when generating HTML'
+
varname = 'filePreload%d' % counter
counter += 1
image = filename.endswith(IMAGE_SUFFIXES)
@@ -976,7 +980,7 @@ try:
addRunDependency();
%(varname)s.send(null);
''' % {
- 'request': 'XMLHttpRequest' if not Compression.on else 'DecompressionRequest',
+ 'request': 'DataRequest', # In the past we also supported XHRs here
'varname': varname,
'filename': filename,
'netname': file_['net_name'],
@@ -987,15 +991,25 @@ try:
else:
assert 0
- if Compression.on:
- use_decompressed = ''
+ if final_suffix == 'html':
+ # Get the big archive and split it up
+ use_data = ''
for file_ in data_files:
if file_['mode'] == 'preload':
- use_decompressed += '''
- curr = DecompressionRequest.prototype.requests['%s'];
+ use_data += '''
+ curr = DataRequest.prototype.requests['%s'];
curr.response = byteArray.subarray(%d,%d);
curr.onload();
- ''' % (file_['name'], file_['compression_start'], file_['compression_end'])
+ ''' % (file_['name'], file_['data_start'], file_['data_end'])
+ use_data += ' removeRunDependency();\n'
+
+ if Compression.on:
+ use_data = '''
+ Module["decompress"](byteArray, function(decompressed) {
+ byteArray = new Uint8Array(decompressed);
+ %s
+ });
+ ''' % use_data
code += '''
var dataFile = new XMLHttpRequest();
@@ -1005,17 +1019,13 @@ try:
var arrayBuffer = dataFile.response;
assert(arrayBuffer, 'Loading data file failed.');
var byteArray = new Uint8Array(arrayBuffer);
- Module["decompress"](byteArray, function(decompressed) {
- byteArray = new Uint8Array(decompressed);
- var curr;
- %s
- removeRunDependency();
- });
+ var curr;
+ %s
};
addRunDependency();
dataFile.send(null);
if (Module['setStatus']) Module['setStatus']('Downloading...');
- ''' % (Compression.compressed_name(data_target), use_decompressed)
+ ''' % (Compression.compressed_name(data_target) if Compression.on else data_target, use_data)
src = open(final).read().replace('// {{PRE_RUN_ADDITIONS}}', code)
final += '.files.js'
diff --git a/tests/runner.py b/tests/runner.py
index 40c3f54c..796948b2 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -6326,11 +6326,11 @@ f.close()
# by individual files
Popen(['python', EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', 'subdirr/data1.txt', '--preload-file', 'subdirr/moar/data2.txt', '-o', 'page.html']).communicate()
self.run_browser('page.html', 'You should see two cool numbers', '/report_result?1')
-
os.remove('page.html')
- # by directory
+ # by directory, and remove files to make sure
Popen(['python', EMCC, os.path.join(self.get_dir(), 'main.cpp'), '--preload-file', 'subdirr', '-o', 'page.html']).communicate()
+ shutil.rmtree(os.path.join(self.get_dir(), 'subdirr'))
self.run_browser('page.html', 'You should see two cool numbers', '/report_result?1')
def test_compressed_file(self):