Fix builtin function types for typed evm dialect.

This commit is contained in:
chriseth 2020-02-11 16:54:09 +01:00
parent aa15ea7e8e
commit 4644d4616f
2 changed files with 17 additions and 6 deletions

View File

@ -151,13 +151,13 @@ bool ScopeFiller::registerVariable(TypedName const& _name, SourceLocation const&
bool ScopeFiller::registerFunction(FunctionDefinition const& _funDef)
{
vector<Scope::YulType> arguments;
for (auto const& _argument: _funDef.parameters)
arguments.emplace_back(_argument.type.str());
vector<Scope::YulType> parameters;
for (auto const& parameter: _funDef.parameters)
parameters.emplace_back(parameter.type);
vector<Scope::YulType> returns;
for (auto const& _return: _funDef.returnVariables)
returns.emplace_back(_return.type.str());
if (!m_currentScope->registerFunction(_funDef.name, std::move(arguments), std::move(returns)))
for (auto const& returnVariable: _funDef.returnVariables)
returns.emplace_back(returnVariable.type);
if (!m_currentScope->registerFunction(_funDef.name, std::move(parameters), std::move(returns)))
{
//@TODO secondary location
m_errorReporter.declarationError(

View File

@ -221,6 +221,15 @@ EVMDialectTyped::EVMDialectTyped(langutil::EVMVersion _evmVersion, bool _objectA
boolType = "bool"_yulstring;
types = {defaultType, boolType};
// Set all types to ``defaultType``
for (auto& fun: m_functions)
{
for (auto& p: fun.second.parameters)
p = defaultType;
for (auto& r: fun.second.returns)
r = defaultType;
}
m_functions["lt"_yulstring].returns = {"bool"_yulstring};
m_functions["gt"_yulstring].returns = {"bool"_yulstring};
m_functions["slt"_yulstring].returns = {"bool"_yulstring};
@ -260,6 +269,7 @@ EVMDialectTyped::EVMDialectTyped(langutil::EVMVersion _evmVersion, bool _objectA
_visitArguments();
}));
m_functions["bool_to_u256"_yulstring].parameters = {"bool"_yulstring};
m_functions["bool_to_u256"_yulstring].returns = {"u256"_yulstring};
m_functions.insert(createFunction("u256_to_bool", 1, 1, {}, false, [](
FunctionCall const&,
AbstractAssembly& _assembly,
@ -276,6 +286,7 @@ EVMDialectTyped::EVMDialectTyped(langutil::EVMVersion _evmVersion, bool _objectA
_assembly.appendInstruction(evmasm::Instruction::INVALID);
_assembly.appendLabel(inRange);
}));
m_functions["u256_to_bool"_yulstring].parameters = {"u256"_yulstring};
m_functions["u256_to_bool"_yulstring].returns = {"bool"_yulstring};
}