diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-05-16 11:26:34 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-05-16 11:26:34 -0700 |
commit | 4de54e3bece9a51a69bd46076acaa7746c1fa996 (patch) | |
tree | 29e8c9012bc808aa805c59799290578aeae0ab6c /src | |
parent | ce33f9c21230d619b2b5d42358592f204410eab4 (diff) |
when not aliasing tables, keep them all at full size to avoid aliasing through the &M mask in a small table
Diffstat (limited to 'src')
-rw-r--r-- | src/modules.js | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/modules.js b/src/modules.js index 8e029b27..e4093078 100644 --- a/src/modules.js +++ b/src/modules.js @@ -301,6 +301,7 @@ var Functions = { } var generated = false; var wrapped = {}; + var maxTable = 0; for (var t in tables) { if (t == 'pre') continue; generated = true; @@ -355,13 +356,21 @@ var Functions = { j += 10; } } + maxTable = Math.max(maxTable, table.length); + } + if (ASM_JS) maxTable = ceilPowerOfTwo(maxTable); + for (var t in tables) { + if (t == 'pre') continue; + var table = tables[t]; if (ASM_JS) { // asm function table mask must be power of two - var fullSize = ceilPowerOfTwo(table.length); + // if nonaliasing, then standardize function table size, to avoid aliasing pointers through the &M mask (in a small table using a big index) + var fullSize = ALIASING_FUNCTION_POINTERS ? ceilPowerOfTwo(table.length) : maxTable; for (var i = table.length; i < fullSize; i++) { table[i] = 0; } } + // finalize table var indices = table.toString().replace('"', ''); if (BUILD_AS_SHARED_LIB) { // Shared libraries reuse the parent's function table. |