diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-11-28 17:29:12 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-12-07 14:23:19 -0800 |
commit | 90288fb4ad3eddfaac63a634e11ab612c789b63c (patch) | |
tree | 1ee3ce0789dda13e1903a7f79af7607b7fa56e58 | |
parent | 4a1ac20dd8a12a19f92f6c0c0ce344eb203dcff7 (diff) |
export function tables
-rwxr-xr-x | emscripten.py | 80 | ||||
-rw-r--r-- | src/modules.js | 7 |
2 files changed, 43 insertions, 44 deletions
diff --git a/emscripten.py b/emscripten.py index 065d17ea..e63defe0 100755 --- a/emscripten.py +++ b/emscripten.py @@ -241,42 +241,6 @@ def emscript(infile, settings, outfile, libraries=[]): funcs_js = ''.join([output[0] for output in outputs]) - if settings.get('ASM_JS'): - # calculate exports - exports = [] - for export in exported_implemented_functions: - exports.append("'%s': %s" % (export, export)) - exports = '{ ' + ', '.join(exports) + ' }' - # caculate globals - global_vars = forwarded_json['Variables']['globals'].keys() - global_funcs = ['_' + x for x in forwarded_json['Functions']['libraryFunctions'].keys()] - asm_globals = ''.join([' var ' + g + '=env.' + g + ';\n' for g in global_funcs]) - # sent data - basics = ['buffer', 'Int8Array', 'Int16Array', 'Int32Array', 'Uint8Array', 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'] - sending = '{ ' + ', '.join([s + ': ' + s for s in basics + global_funcs]) + ' }' - # received - receiving = ';\n'.join(['var ' + s + ' = Module["' + s + '"] = asm.' + s for s in exported_implemented_functions]) - # finalize - funcs_js = ''' -var asm = (function(env, buffer) { - 'use asm'; - var HEAP8 = new env.Int8Array(buffer); - var HEAP16 = new env.Int16Array(buffer); - var HEAP32 = new env.Int32Array(buffer); - var HEAPU8 = new env.Uint8Array(buffer); - var HEAPU16 = new env.Uint16Array(buffer); - var HEAPU32 = new env.Uint32Array(buffer); - var HEAPF32 = new env.Float32Array(buffer); - var HEAPF64 = new env.Float64Array(buffer); -''' + asm_globals + '\n' + funcs_js.replace('\n', '\n ') + ''' - - {{{ FUNCTION_TABLES }}} - - return %s; -})(%s, buffer); -%s; -''' % (exports, sending, receiving) - outputs = None if DEBUG: print >> sys.stderr, ' emscript: phase 2b took %s seconds' % (time.time() - t) if DEBUG: t = time.time() @@ -314,13 +278,49 @@ var asm = (function(env, buffer) { post_file = temp_files.get('.post.ll').name open(post_file, 'w').write('\n') # no input, just processing of forwarded data out = shared.run_js(compiler, shared.COMPILER_ENGINE, [settings_file, post_file, 'post', forwarded_file] + libraries, stdout=subprocess.PIPE, cwd=path_from_root('src')) - post, forwarded_data = out.split('//FORWARDED_DATA:') - forwarded_json = json.loads(forwarded_data) + post, last_forwarded_data = out.split('//FORWARDED_DATA:') + last_forwarded_json = json.loads(last_forwarded_data) + function_tables_defs = '\n'.join([table for table in last_forwarded_json['Functions']['tables'].itervalues()]) if settings.get('ASM_JS'): - funcs_js = funcs_js.replace('{{{ FUNCTION_TABLES }}}', forwarded_json['Functions']['tables'].replace('\n', '\n ')) + # calculate exports + function_tables = ['FUNCTION_TABLE_' + table for table in last_forwarded_json['Functions']['tables'].iterkeys()] + exported_implemented_functions = list(exported_implemented_functions) + exports = [] + for export in exported_implemented_functions + function_tables: + exports.append("'%s': %s" % (export, export)) + exports = '{ ' + ', '.join(exports) + ' }' + # calculate globals + global_vars = forwarded_json['Variables']['globals'].keys() + global_funcs = ['_' + x for x in forwarded_json['Functions']['libraryFunctions'].keys()] + asm_globals = ''.join([' var ' + g + '=env.' + g + ';\n' for g in global_funcs]) + # sent data + basics = ['buffer', 'Int8Array', 'Int16Array', 'Int32Array', 'Uint8Array', 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'] + sending = '{ ' + ', '.join([s + ': ' + s for s in basics + global_funcs]) + ' }' + # received + receiving = ';\n'.join(['var ' + s + ' = Module["' + s + '"] = asm.' + s for s in exported_implemented_functions + function_tables]) + # finalize + funcs_js = ''' +var asm = (function(env, buffer) { + 'use asm'; + var HEAP8 = new env.Int8Array(buffer); + var HEAP16 = new env.Int16Array(buffer); + var HEAP32 = new env.Int32Array(buffer); + var HEAPU8 = new env.Uint8Array(buffer); + var HEAPU16 = new env.Uint16Array(buffer); + var HEAPU32 = new env.Uint32Array(buffer); + var HEAPF32 = new env.Float32Array(buffer); + var HEAPF64 = new env.Float64Array(buffer); +''' + asm_globals + '\n' + funcs_js.replace('\n', '\n ') + ''' + + %s + + return %s; +})(%s, buffer); +%s; +''' % (function_tables_defs.replace('\n', '\n '), exports, sending, receiving) else: - outfile.write(forwarded_json['Functions']['tables']) + outfile.write(function_tables_defs) outfile.write(blockaddrsize(indexize(funcs_js))) funcs_js = None diff --git a/src/modules.js b/src/modules.js index f03953f3..7bdceb90 100644 --- a/src/modules.js +++ b/src/modules.js @@ -275,7 +275,6 @@ var Functions = { tables[sig][this.indexedFunctions[ident]] = ident; } // Resolve multi-level aliases all the way down - var ret = ''; for (var t in tables) { var table = tables[t]; for (var i = 0; i < table.length; i++) { @@ -288,12 +287,12 @@ var Functions = { var indices = table.toString().replace('"', ''); if (BUILD_AS_SHARED_LIB) { // Shared libraries reuse the parent's function table. - ret += Functions.getTable(t) + '.push.apply(' + Functions.getTable(t) + ', [' + indices + ']);\n'; + tables[t] = Functions.getTable(t) + '.push.apply(' + Functions.getTable(t) + ', [' + indices + ']);\n'; } else { - ret += 'var ' + Functions.getTable(t) + ' = [' + indices + '];\n'; + tables[t] = 'var ' + Functions.getTable(t) + ' = [' + indices + '];\n'; } } - Functions.tables = ret; + Functions.tables = tables; } }; |