diff --git a/libs/remix-debug/src/solidity-decoder/internalCallTree.ts b/libs/remix-debug/src/solidity-decoder/internalCallTree.ts index 652576a188..673de776a0 100644 --- a/libs/remix-debug/src/solidity-decoder/internalCallTree.ts +++ b/libs/remix-debug/src/solidity-decoder/internalCallTree.ts @@ -309,19 +309,22 @@ async function buildTree (tree, step, scopeId, isCreation, functionDefinition?, // from now on we'll be waiting for a change in the source location which will mark the beginning of the constructor execution. // constructorsStartExecution allows to keep track on which constructor has already been executed. } - if (constructorExecutionStarts || isInternalTxInstrn || (functionDefinition && previousSourceLocation.jump === 'i')) { + const internalfunctionCall = functionDefinition && previousSourceLocation.jump === 'i' + if (constructorExecutionStarts || isInternalTxInstrn || internalfunctionCall) { try { const newScopeId = scopeId === '' ? subScope.toString() : scopeId + '.' + subScope - tree.scopeStarts[step + 1] = newScopeId - tree.scopes[newScopeId] = { firstStep: step + 1, locals: {}, isCreation, gasCost: 0 } + tree.scopeStarts[step] = newScopeId + tree.scopes[newScopeId] = { firstStep: step, locals: {}, isCreation, gasCost: 0 } + // for the ctor we we are at the start of its trace, we have to replay this step in order to catch all the locals: + let nextStep = constructorExecutionStarts ? step : step + 1 if (constructorExecutionStarts) { tree.constructorsStartExecution[tree.pendingConstructorId] = tree.pendingConstructorExecutionAt tree.pendingConstructorExecutionAt = -1 - tree.pendingConstructorId = -1 + tree.pendingConstructorId = -1 await registerFunctionParameters(tree, tree.pendingConstructor, step, newScopeId, contractObj, previousValidSourceLocation) tree.pendingConstructor = null - } - const externalCallResult = await buildTree(tree, step + 1, newScopeId, isCreateInstrn, functionDefinition, contractObj, sourceLocation, validSourceLocation) + } + const externalCallResult = await buildTree(tree, nextStep, newScopeId, isCreateInstrn, functionDefinition, contractObj, sourceLocation, validSourceLocation) if (externalCallResult.error) { return { outStep: step, error: 'InternalCallTree - ' + externalCallResult.error } } else {