Merge pull request #141 from chriseth/fixExternalTypes

Do not include function in interface list if there are errors.
This commit is contained in:
chriseth 2015-10-16 15:20:25 +02:00
commit fd8eb2d074

View File

@ -115,29 +115,26 @@ vector<pair<FixedHash<4>, FunctionTypePointer>> const& ContractDefinition::inter
m_interfaceFunctionList.reset(new vector<pair<FixedHash<4>, FunctionTypePointer>>()); m_interfaceFunctionList.reset(new vector<pair<FixedHash<4>, FunctionTypePointer>>());
for (ContractDefinition const* contract: annotation().linearizedBaseContracts) for (ContractDefinition const* contract: annotation().linearizedBaseContracts)
{ {
vector<FunctionTypePointer> functions;
for (ASTPointer<FunctionDefinition> const& f: contract->definedFunctions()) for (ASTPointer<FunctionDefinition> const& f: contract->definedFunctions())
if (f->isPartOfExternalInterface())
functions.push_back(make_shared<FunctionType>(*f, false));
for (ASTPointer<VariableDeclaration> const& v: contract->stateVariables())
if (v->isPartOfExternalInterface())
functions.push_back(make_shared<FunctionType>(*v));
for (FunctionTypePointer const& fun: functions)
{ {
if (!f->isPartOfExternalInterface()) if (!fun->interfaceFunctionType())
// Fails hopefully because we already registered the error
continue; continue;
string functionSignature = f->externalSignature(); string functionSignature = fun->externalSignature();
if (signaturesSeen.count(functionSignature) == 0) if (signaturesSeen.count(functionSignature) == 0)
{ {
functionsSeen.insert(f->name());
signaturesSeen.insert(functionSignature); signaturesSeen.insert(functionSignature);
FixedHash<4> hash(dev::sha3(functionSignature)); FixedHash<4> hash(dev::sha3(functionSignature));
m_interfaceFunctionList->push_back(make_pair(hash, make_shared<FunctionType>(*f, false))); m_interfaceFunctionList->push_back(make_pair(hash, fun));
} }
} }
for (ASTPointer<VariableDeclaration> const& v: contract->stateVariables())
if (functionsSeen.count(v->name()) == 0 && v->isPartOfExternalInterface())
{
FunctionType ftype(*v);
solAssert(!!v->annotation().type.get(), "");
functionsSeen.insert(v->name());
FixedHash<4> hash(dev::sha3(ftype.externalSignature()));
m_interfaceFunctionList->push_back(make_pair(hash, make_shared<FunctionType>(*v)));
}
} }
} }
return *m_interfaceFunctionList; return *m_interfaceFunctionList;