diff --git a/src/helpers/util.js b/src/helpers/util.js index 143dbace90..408523cbd2 100644 --- a/src/helpers/util.js +++ b/src/helpers/util.js @@ -44,34 +44,31 @@ module.exports = { /* Binary Search: Assumes that @arg array is sorted increasingly - returns the smallest i such that target >= changes[i] - returns arary.length - 1 (if all elements in array are smaller than target) - returns 0 (if target is smaller than the first element of array || if array is empty) + return smallest i such that changes[i] <= target does not hold, + or changes.length if all elements are < target. + It returns the index where target could be inserted to maintain the order of the array */ findLowerBound: function (target, array) { - if (array.length === 0) { - return 0 - } - return findLowerBoundInternal(target, array, 0, array.length - 1) + return findLowerBoundInternal(target, array, 0, array.length) + }, + + findLowerBoundValue: function (target, array) { + var index = this.findLowerBound(target, array) + return array[index] } } -function findLowerBoundInternal (target, array, lowerbound, higherbound) { - if (array[higherbound] < target) { - return higherbound - } else if (array[lowerbound] > target) { - return lowerbound - } - var middle - while (lowerbound + 1 !== higherbound) { - middle = Math.floor((higherbound + lowerbound) / 2) - if (array[middle] > target) { - higherbound = middle - } else if (array[middle] < target) { +function findLowerBoundInternal (target, array, lowerbound, length) { + while (length > 1) { + var half = length >> 1 + var middle = lowerbound + half + if (array[middle] < target) { + length = length - (middle - lowerbound) lowerbound = middle - higherbound = array.length - 1 } else if (array[middle] === target) { return middle + } else { + length = half } } return lowerbound diff --git a/src/index.js b/src/index.js index 6a17480e35..2325fe9d97 100644 --- a/src/index.js +++ b/src/index.js @@ -9,9 +9,6 @@ var SourceMappingDecoder = require('./util/sourceMappingDecoder') if (typeof (module) !== 'undefined' && typeof (module.exports) !== 'undefined') { module.exports = modules() } -if (typeof (window) !== 'undefined') { - window.remix = modules() -} function modules () { return { diff --git a/src/trace/traceManager.js b/src/trace/traceManager.js index 4347ef3c27..0440808b55 100644 --- a/src/trace/traceManager.js +++ b/src/trace/traceManager.js @@ -80,8 +80,7 @@ TraceManager.prototype.getStorageAt = function (stepIndex, tx, callback, address return callback(check, null) } if (!address) { - var stoChangeIndex = util.findLowerBound(stepIndex, this.traceCache.storageChanges) - var stoChange = this.traceCache.storageChanges[stoChangeIndex] + var stoChange = util.findLowerBoundValue(stepIndex, this.traceCache.storageChanges) if (stoChange === undefined) return callback('no storage found', null) address = this.traceCache.sstore[stoChange].address } @@ -124,8 +123,7 @@ TraceManager.prototype.getCallDataAt = function (stepIndex, callback) { if (check) { return callback(check, null) } - var callDataChangeIndex = util.findLowerBound(stepIndex, this.traceCache.callDataChanges) - var callDataChange = this.traceCache.callDataChanges[callDataChangeIndex] + var callDataChange = util.findLowerBoundValue(stepIndex, this.traceCache.callDataChanges) if (callDataChange === undefined) return callback('no calldata found', null) callback(null, [this.traceCache.callsData[callDataChange]]) } @@ -135,8 +133,7 @@ TraceManager.prototype.getCallStackAt = function (stepIndex, callback) { if (check) { return callback(check, null) } - var callStackChangeIndex = util.findLowerBound(stepIndex, this.traceCache.callChanges) - var callStackChange = this.traceCache.callChanges[callStackChangeIndex] + var callStackChange = util.findLowerBoundValue(stepIndex, this.traceCache.callChanges) if (callStackChange === undefined) return callback('no callstack found', null) callback(null, this.traceCache.callStack[callStackChange].callStack) } @@ -161,8 +158,7 @@ TraceManager.prototype.getLastCallChangeSince = function (stepIndex, callback) { if (check) { return callback(check, null) } - var callChangeIndex = util.findLowerBound(stepIndex, this.traceCache.callChanges) - var callChange = this.traceCache.callChanges[callChangeIndex] + var callChange = util.findLowerBoundValue(stepIndex, this.traceCache.callChanges) if (callChange === undefined) { callback(null, 0) } else { @@ -208,8 +204,7 @@ TraceManager.prototype.getMemoryAt = function (stepIndex, callback) { if (check) { return callback(check, null) } - var lastChangesIndex = util.findLowerBound(stepIndex, this.traceCache.memoryChanges) - var lastChanges = this.traceCache.memoryChanges[lastChangesIndex] + var lastChanges = util.findLowerBoundValue(stepIndex, this.traceCache.memoryChanges) if (lastChanges === undefined) return callback('no memory found', null) callback(null, this.trace[lastChanges].memory) } diff --git a/src/util/sourceMappingDecoder.js b/src/util/sourceMappingDecoder.js index 697a1e47fa..188bde0a93 100644 --- a/src/util/sourceMappingDecoder.js +++ b/src/util/sourceMappingDecoder.js @@ -77,15 +77,6 @@ SourceMappingDecoder.prototype.getLinebreakPositions = function (source) { ret.push(pos) } return ret - /* - var lines = source.split('\n') - var currentPos = 0 - var ret = [] - for (var k in lines) { - ret.push(currentPos + lines[k].length) - currentPos += lines[k].length + 1 - } - return ret*/ } /** @@ -93,7 +84,7 @@ SourceMappingDecoder.prototype.getLinebreakPositions = function (source) { * * @param {Object} sourceLocation - object containing attributes {source} and {length} * @param {Array} lineBreakPositions - array returned by the function 'getLinebreakPositions' - * @@return {Object} returns an object {start: {line, column}, end: {line, column}} + * @@return {Object} returns an object {start: {line, column}, end: {line, column}} (line count start at 0) */ SourceMappingDecoder.prototype.convertOffsetToLineColumn = function (sourceLocation, lineBreakPositions) { if (sourceLocation.start >= 0 && sourceLocation.length >= 0) { @@ -109,22 +100,15 @@ SourceMappingDecoder.prototype.convertOffsetToLineColumn = function (sourceLocat } } -function convertFromCharPosition (pos, lineColumnLayout) { - var lowerBound = util.findLowerBound(pos, lineColumnLayout) - var line - if (lowerBound === 0) { - line = 0 - } else if (lowerBound < pos) { - line = lowerBound + 1 - } else { - line = lowerBound - } - var column - if (lowerBound === 0) { - column = pos - } else { - column = pos - 1 - lineColumnLayout[line - 1] +function convertFromCharPosition (pos, lineBreakPositions) { + var line = util.findLowerBound(pos, lineBreakPositions) + + if (lineBreakPositions[line] < pos) { + line = line + 1 } + + var column = lineBreakPositions[line - 1] ? (pos - lineBreakPositions[line - 1] - 1) : pos + return { line: line, column: column