Merge pull request #200 from ethereum/fixState

Fix solidity state / locals
pull/7/head
yann300 8 years ago committed by GitHub
commit 5508a81b85
  1. 22
      src/solidity/astHelper.js
  2. 16
      test/solidity/decodeInfo.js

@ -10,14 +10,18 @@ var AstWalker = require('../util/astWalker')
function extractContractDefinitions (sourcesList) {
var ret = {
contractsById: {},
contractsByName: {}
contractsByName: {},
sourcesByContract: {}
}
var walker = new AstWalker()
walker.walkAstList(sourcesList, { 'ContractDefinition': function (node) {
ret.contractsById[node.id] = node
ret.contractsByName[node.attributes.name] = node
return false
}})
for (var k in sourcesList) {
walker.walk(sourcesList[k].AST, { 'ContractDefinition': function (node) {
ret.contractsById[node.id] = node
ret.sourcesByContract[node.id] = k
ret.contractsByName[k + ':' + node.attributes.name] = node
return false
}})
}
return ret
}
@ -83,7 +87,11 @@ function extractStatesDefinitions (sourcesList, contracts) {
var ret = {}
for (var contract in contracts.contractsById) {
var name = contracts.contractsById[contract].attributes.name
ret[name] = extractStateDefinitions(name, sourcesList, contracts)
var source = contracts.sourcesByContract[contract]
var fullName = source + ':' + name
var state = extractStateDefinitions(fullName, sourcesList, contracts)
ret[fullName] = state
ret[name] = state // solc < 0.4.9
}
return ret
}

@ -9,7 +9,7 @@ tape('solidity', function (t) {
t.test('astHelper, decodeInfo', function (st) {
var output = compiler.compile(contracts, 0)
var state = index.solidity.astHelper.extractStateDefinitions('contractUint', output.sources)
var state = index.solidity.astHelper.extractStateDefinitions(':contractUint', output.sources)
var states = index.solidity.astHelper.extractStatesDefinitions(output.sources)
var stateDef = state.stateDefinitions
var decodeInfo = index.solidity.decodeInfo.parseType(stateDef[0].attributes.type, states, 'contractUint')
@ -21,7 +21,7 @@ tape('solidity', function (t) {
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[4].attributes.type, states, 'contractUint')
checkDecodeInfo(st, decodeInfo, 1, 16, 'bytes16')
state = index.solidity.astHelper.extractStateDefinitions('contractStructAndArray', output.sources)
state = index.solidity.astHelper.extractStateDefinitions(':contractStructAndArray', output.sources)
stateDef = state.stateDefinitions
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[1].attributes.type, states, 'contractStructAndArray')
checkDecodeInfo(st, decodeInfo, 2, 32, 'struct contractStructAndArray.structDef')
@ -30,7 +30,7 @@ tape('solidity', function (t) {
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[3].attributes.type, states, 'contractStructAndArray')
checkDecodeInfo(st, decodeInfo, 2, 32, 'bytes12[4]')
state = index.solidity.astHelper.extractStateDefinitions('contractArray', output.sources)
state = index.solidity.astHelper.extractStateDefinitions(':contractArray', output.sources)
stateDef = state.stateDefinitions
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[0].attributes.type, states, 'contractArray')
checkDecodeInfo(st, decodeInfo, 1, 32, 'uint32[5]')
@ -39,12 +39,12 @@ tape('solidity', function (t) {
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[2].attributes.type, states, 'contractArray')
checkDecodeInfo(st, decodeInfo, 4, 32, 'int16[][3][][4]')
state = index.solidity.astHelper.extractStateDefinitions('contractEnum', output.sources)
state = index.solidity.astHelper.extractStateDefinitions(':contractEnum', output.sources)
stateDef = state.stateDefinitions
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[1].attributes.type, states, 'contractEnum')
checkDecodeInfo(st, decodeInfo, 1, 2, 'enum')
state = index.solidity.astHelper.extractStateDefinitions('contractSmallVariable', output.sources)
state = index.solidity.astHelper.extractStateDefinitions(':contractSmallVariable', output.sources)
stateDef = state.stateDefinitions
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[0].attributes.type, states, 'contractSmallVariable')
checkDecodeInfo(st, decodeInfo, 1, 1, 'int8')
@ -61,7 +61,7 @@ tape('solidity', function (t) {
output = compiler.compile(simplecontracts, 0)
state = index.solidity.astHelper.extractStateDefinitions('simpleContract', output.sources)
state = index.solidity.astHelper.extractStateDefinitions(':simpleContract', output.sources)
states = index.solidity.astHelper.extractStatesDefinitions(output.sources)
stateDef = state.stateDefinitions
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[2].attributes.type, states, 'simpleContract')
@ -71,12 +71,12 @@ tape('solidity', function (t) {
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[4].attributes.type, states, 'simpleContract')
checkDecodeInfo(st, decodeInfo, 1, 1, 'enum')
state = index.solidity.astHelper.extractStateDefinitions('test2', output.sources)
state = index.solidity.astHelper.extractStateDefinitions(':test2', output.sources)
stateDef = state.stateDefinitions
decodeInfo = index.solidity.decodeInfo.parseType(stateDef[0].attributes.type, states, 'test1')
checkDecodeInfo(st, decodeInfo, 0, 32, 'struct test1.str')
state = index.solidity.stateDecoder.extractStateVariables('test2', output.sources)
state = index.solidity.stateDecoder.extractStateVariables(':test2', output.sources)
checkDecodeInfo(st, decodeInfo, 0, 32, 'struct test1.str')
st.end()

Loading…
Cancel
Save