diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-08-26 14:01:04 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-09-03 14:41:29 -0700 |
commit | 508e90d7b7b57d0773102cecff7a860ad168cfc1 (patch) | |
tree | 49ec0762849322220eed808d5cc636f918f689d4 | |
parent | 12fec0413314c6f7d8975114a4fd8802f7a5a2c6 (diff) |
track maximum function index when using dlopen support
-rwxr-xr-x | emscripten.py | 19 | ||||
-rw-r--r-- | src/library.js | 8 | ||||
-rw-r--r-- | tests/test_core.py | 4 |
3 files changed, 22 insertions, 9 deletions
diff --git a/emscripten.py b/emscripten.py index c5e235d8..9f54e07f 100755 --- a/emscripten.py +++ b/emscripten.py @@ -612,17 +612,22 @@ Runtime.stackRestore = function(top) { asm['stackRestore'](top) }; ''' % (pre_tables + '\n'.join(function_tables_impls) + '\n' + function_tables_defs.replace('\n', '\n '), exports, the_global, sending, receiving)] # Set function table masks - def function_table_maskize(js): - masks = {} - default = None - for sig, table in last_forwarded_json['Functions']['tables'].iteritems(): - masks[sig] = str(table.count(',')) - default = sig + masks = {} + max_mask = 0 + for sig, table in last_forwarded_json['Functions']['tables'].iteritems(): + mask = table.count(',') + masks[sig] = str(mask) + max_mask = max(mask, max_mask) + def function_table_maskize(js, masks): def fix(m): sig = m.groups(0)[0] return masks[sig] return re.sub(r'{{{ FTM_([\w\d_$]+) }}}', lambda m: fix(m), js) # masks[m.groups(0)[0]] - funcs_js = map(function_table_maskize, funcs_js) + funcs_js = map(lambda js: function_table_maskize(js, masks), funcs_js) + if settings.get('DLOPEN_SUPPORT'): + funcs_js.append(''' + asm.maxFunctionIndex = %d; +''' % max_mask) else: function_tables_defs = '\n'.join([table for table in last_forwarded_json['Functions']['tables'].itervalues()]) outfile.write(function_tables_defs) diff --git a/src/library.js b/src/library.js index f953bc33..b0035f21 100644 --- a/src/library.js +++ b/src/library.js @@ -5048,7 +5048,13 @@ LibraryManager.library = { } try { - var lib_module = eval(lib_data)({{{ Functions.getTable('x') }}}.length); + var lib_module = eval(lib_data)( +#if ASM_JS + asm.maxFunctionIndex +#else + {{{ Functions.getTable('x') }}}.length +#endif + ); } catch (e) { #if ASSERTIONS Module.printErr('Error in loading dynamic library: ' + e); diff --git a/tests/test_core.py b/tests/test_core.py index 7481b4a7..5e801646 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5587,7 +5587,9 @@ The current type of b is: 9 self.emcc_args = self.emcc_args[:i] + self.emcc_args[i+2:] break - if not Settings.ASM_JS: + if Settings.ASM_JS: + Settings.DLOPEN_SUPPORT = 1 + else: Settings.NAMED_GLOBALS = 1 lib_src = ''' |