Merge pull request #820 from ethereum/yann300-patch-28

Fix getting parentScope while debugging
pull/813/head
yann300 4 years ago committed by GitHub
commit c0e9da3b31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      libs/remix-debug/src/solidity-decoder/internalCallTree.ts
  2. 21
      libs/remix-debug/src/source/sourceLocationTracker.ts
  3. 30
      libs/remix-debug/test/sourceLocationTracker.ts

@ -108,8 +108,7 @@ export class InternalCallTree {
}
parentScope (scopeId) {
const matched = scopeId.match(/(.\d|\d)$/)
return scopeId.replace(matched[1], '')
return scopeId.replace(/(.\d|\d)$/, '')
}
findScopeId (vmtraceIndex) {

@ -59,6 +59,19 @@ export class SourceLocationTracker {
return null
}
/**
* Returns the total amount of sources from a specific @arg address and @arg contracts
*
* @param {String} address - contract address from which has generated sources
* @param {Object} contracts - AST of compiled contracts
*/
getTotalAmountOfSources (address, contracts) {
let sourcesLength = Object.keys(contracts).length
const generatedSources = this.getGeneratedSourcesFromAddress(address)
if (generatedSources) sourcesLength = sourcesLength + Object.keys(generatedSources).length
return sourcesLength
}
/**
* Return a valid source location associated with the given @arg vmTraceIndex
*
@ -67,8 +80,14 @@ export class SourceLocationTracker {
* @param {Object} contractDetails - AST of compiled contracts
*/
async getValidSourceLocationFromVMTraceIndex (address, vmtraceStepIndex, contracts) {
const amountOfSources = this.getTotalAmountOfSources(address, contracts)
let map: Record<string, number> = { file: -1 }
while (vmtraceStepIndex >= 0 && map.file === -1) {
/*
(map.file === -1) this indicates that it isn't associated with a known source code
(map.file > amountOfSources - 1) this indicates the current file index exceed the total number of files.
this happens when generated sources should not be considered.
*/
while (vmtraceStepIndex >= 0 && (map.file === -1 || map.file > amountOfSources - 1)) {
map = await this.getSourceLocationFromVMTraceIndex(address, vmtraceStepIndex, contracts)
vmtraceStepIndex = vmtraceStepIndex - 1
}

@ -54,9 +54,37 @@ tape('SourceLocationTracker', function (t) {
traceManager.resolveTrace(tx).then(async () => {
const sourceLocationTracker = new SourceLocationTracker(codeManager, { debugWithGeneratedSources: false })
try {
// with debugWithGeneratedSources: false
const sourceLocationTracker = new SourceLocationTracker(codeManager, { debugWithGeneratedSources: false })
let map = await sourceLocationTracker.getSourceLocationFromVMTraceIndex('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', 0, output.contracts)
console.log(map)
st.equal(map['file'], 0)
st.equal(map['start'], 35)
map = await sourceLocationTracker.getSourceLocationFromVMTraceIndex('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', 45, output.contracts)
st.equal(map['file'], 1) // 1 refers to the generated source (pragma experimental ABIEncoderV2)
map = await sourceLocationTracker.getValidSourceLocationFromVMTraceIndex('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', 45, output.contracts)
st.equal(map['file'], 0) // 1 refers to the generated source (pragma experimental ABIEncoderV2)
st.equal(map['start'], 303)
st.equal(map['length'], 448)
map = await sourceLocationTracker.getValidSourceLocationFromVMTraceIndex('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', 36, output.contracts)
st.equal(map['file'], 0) // 0 refers to the initial solidity code. see source below (ABIEncoderV2)
st.equal(map['start'], 303)
st.equal(map['length'], 448)
} catch (e) {
console.log(e)
}
try {
// with debugWithGeneratedSources: true
const sourceLocationTracker = new SourceLocationTracker(codeManager, { debugWithGeneratedSources: true })
let map = await sourceLocationTracker.getSourceLocationFromVMTraceIndex('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', 0, output.contracts)
console.log(map)
st.equal(map['file'], 0)

Loading…
Cancel
Save