the contract interfaces should take overloaded function into consideration TODO:

This commit is contained in:
Lu Guanqun 2015-03-01 11:34:12 +08:00
parent 068bb5d731
commit e008f3f808

View File

@ -106,8 +106,12 @@ eth::AssemblyItem CompilerContext::getVirtualFunctionEntryLabel(FunctionDefiniti
solAssert(!m_inheritanceHierarchy.empty(), "No inheritance hierarchy set."); solAssert(!m_inheritanceHierarchy.empty(), "No inheritance hierarchy set.");
for (ContractDefinition const* contract: m_inheritanceHierarchy) for (ContractDefinition const* contract: m_inheritanceHierarchy)
for (ASTPointer<FunctionDefinition> const& function: contract->getDefinedFunctions()) for (ASTPointer<FunctionDefinition> const& function: contract->getDefinedFunctions())
if (!function->isConstructor() && function->getName() == _function.getName()) {
if (!function->isConstructor() &&
dynamic_cast<FunctionType const&>(*function->getType()).getCanonicalSignature() ==
dynamic_cast<FunctionType const&>(*_function.getType()).getCanonicalSignature())
return getFunctionEntryLabel(*function); return getFunctionEntryLabel(*function);
}
solAssert(false, "Virtual function " + _function.getName() + " not found."); solAssert(false, "Virtual function " + _function.getName() + " not found.");
return m_asm.newTag(); // not reached return m_asm.newTag(); // not reached
} }
@ -117,7 +121,7 @@ eth::AssemblyItem CompilerContext::getSuperFunctionEntryLabel(string const& _nam
auto it = getSuperContract(_base); auto it = getSuperContract(_base);
for (; it != m_inheritanceHierarchy.end(); ++it) for (; it != m_inheritanceHierarchy.end(); ++it)
for (ASTPointer<FunctionDefinition> const& function: (*it)->getDefinedFunctions()) for (ASTPointer<FunctionDefinition> const& function: (*it)->getDefinedFunctions())
if (!function->isConstructor() && function->getName() == _name) if (!function->isConstructor() && function->getName() == _name) // TODO: add a test case for this!
return getFunctionEntryLabel(*function); return getFunctionEntryLabel(*function);
solAssert(false, "Super function " + _name + " not found."); solAssert(false, "Super function " + _name + " not found.");
return m_asm.newTag(); // not reached return m_asm.newTag(); // not reached