diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-11-03 13:30:13 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-11-03 13:30:13 -0700 |
commit | a2449f950efe0fb00dc5732d9a82f5baa4187865 (patch) | |
tree | 3ea0825cca4c3702ae10676052376d862e22db6d /src/parseTools.js | |
parent | 04ade3edb08382b56242725c8a13ee707281bde2 (diff) |
getFastValue|s|
Diffstat (limited to 'src/parseTools.js')
-rw-r--r-- | src/parseTools.js | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/parseTools.js b/src/parseTools.js index e7b59700..05f12f61 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -901,7 +901,7 @@ function makeCopyValues(dest, src, num, type, modifier) { // Tries to do as much as possible at compile time. function getFastValue(a, op, b) { if (isNumber(a) && isNumber(b)) { - return eval(a + op + b); + return eval(a + op + b).toString(); } if (op in set('*', '/')) { if (!a) a = '1'; @@ -937,6 +937,27 @@ function getFastValue(a, op, b) { return a + op + b; } +function getFastValues(list, op) { + assert(op == '+'); + var changed = true; + while (changed) { + changed = false; + for (var i = 0; i < list.length-1; i++) { + var fast = getFastValue(list[i], op, list[i+1]); + var raw = list[i] + op + list[i+1]; + if (fast.length < raw.length || fast.indexOf(op) < 0) { + list[i] = fast; + list.splice(i+1, 1); + i--; + changed = true; + break; + } + } + } + if (list.length == 1) return list[0]; + return list.reduce(function(a, b) { return a + op + b }); +} + function calcFastOffset(ptr, pos, noNeedFirst) { var offset = noNeedFirst ? '0' : makeGetPos(ptr); return getFastValue(offset, '+', pos); @@ -1086,10 +1107,8 @@ function getGetElementPtrIndexes(item) { } type = typeData && typeData.fields[curr] ? typeData.fields[curr] : ''; }); - var ret = indexes[0]; - for (var i = 1; i < indexes.length; i++) { - ret = getFastValue(ret, '+', indexes[i]); - } + + var ret = getFastValues(indexes, '+'); ret = handleOverflow(ret, 32); // XXX - we assume a 32-bit arch here. If you fail on this, change to 64 |