aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-08-26 14:01:04 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-09-03 14:41:29 -0700
commit508e90d7b7b57d0773102cecff7a860ad168cfc1 (patch)
tree49ec0762849322220eed808d5cc636f918f689d4
parent12fec0413314c6f7d8975114a4fd8802f7a5a2c6 (diff)
track maximum function index when using dlopen support
-rwxr-xr-xemscripten.py19
-rw-r--r--src/library.js8
-rw-r--r--tests/test_core.py4
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 = '''