diff options
| author | Alon Zakai <alonzakai@gmail.com> | 2013-02-27 08:04:06 -0800 | 
|---|---|---|
| committer | Alon Zakai <alonzakai@gmail.com> | 2013-02-27 08:04:06 -0800 | 
| commit | 5e6e6f889c7aef090ea1d5aad25b29083afb1036 (patch) | |
| tree | b4c441ccd1dbd3f81e34bab81a89b76d0f51a04b /src/parseTools.js | |
| parent | 5516f8fa58d73bc96a7e4ab01d677cdb3eb25bd1 (diff) | |
| parent | 31186ef9edb06e9bc695fca2c3a14677e8f137a1 (diff) | |
Merge pull request #884 from vvuk/check-heap-align
Add CHECK_HEAP_ALIGN to perform runtime alignment checks
Diffstat (limited to 'src/parseTools.js')
| -rw-r--r-- | src/parseTools.js | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/src/parseTools.js b/src/parseTools.js index 6e0d6e32..117c4987 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -984,18 +984,24 @@ function checkSafeHeap() {  function getHeapOffset(offset, type, forceAsm) {    if (USE_TYPED_ARRAYS !== 2) {      return offset; -  } else { -    if (Runtime.getNativeFieldSize(type) > 4) { -      type = 'i32'; // XXX we emulate 64-bit values as 32 -    } -    var shifts = Math.log(Runtime.getNativeTypeSize(type))/Math.LN2; -    offset = '(' + offset + ')'; -    if (shifts != 0) { -      return '(' + offset + '>>' + shifts + ')'; +  } + +  if (Runtime.getNativeFieldSize(type) > 4) { +    type = 'i32'; // XXX we emulate 64-bit values as 32 +  } + +  var sz = Runtime.getNativeTypeSize(type); +  var shifts = Math.log(sz)/Math.LN2; +  offset = '(' + offset + ')'; +  if (shifts != 0) { +    if (CHECK_HEAP_ALIGN) { +      return '(CHECK_ALIGN_' + sz + '(' + offset + ')>>' + shifts + ')';      } else { -      // we need to guard against overflows here, HEAP[U]8 expects a guaranteed int -      return isJSVar(offset) ? offset : '(' + offset + '|0)'; +      return '(' + offset + '>>' + shifts + ')';      } +  } else { +    // we need to guard against overflows here, HEAP[U]8 expects a guaranteed int +    return isJSVar(offset) ? offset : '(' + offset + '|0)';    }  }  | 
