Merge pull request #10266 from ethereum/fixCalldataIndexAccess

Fix calldata index access.
This commit is contained in:
chriseth 2020-11-11 19:03:19 +01:00 committed by GitHub
commit 571e1e5269
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 10 deletions

View File

@ -2000,28 +2000,27 @@ void IRGeneratorForStatements::endVisit(IndexAccess const& _indexAccess)
}
case DataLocation::CallData:
{
IRVariable var(m_context.newYulVariable(), *arrayType.baseType());
define(var) <<
m_utils.calldataArrayIndexAccessFunction(arrayType) <<
"(" <<
IRVariable(_indexAccess.baseExpression()).commaSeparatedList() <<
", " <<
expressionAsType(*_indexAccess.indexExpression(), *TypeProvider::uint256()) <<
string const indexAccessFunctionCall =
m_utils.calldataArrayIndexAccessFunction(arrayType) +
"(" +
IRVariable(_indexAccess.baseExpression()).commaSeparatedList() +
", " +
expressionAsType(*_indexAccess.indexExpression(), *TypeProvider::uint256()) +
")\n";
if (arrayType.isByteArray())
define(_indexAccess) <<
m_utils.cleanupFunction(*arrayType.baseType()) <<
"(calldataload(" <<
var.name() <<
indexAccessFunctionCall <<
"))\n";
else if (arrayType.baseType()->isValueType())
define(_indexAccess) <<
m_utils.readFromCalldata(*arrayType.baseType()) <<
"(" <<
var.commaSeparatedList() <<
indexAccessFunctionCall <<
")\n";
else
define(_indexAccess, var);
define(_indexAccess) << indexAccessFunctionCall;
break;
}
}

View File

@ -25,6 +25,8 @@ contract C {
return reenc ? this.f_reenc(a) : this.f(a);
}
}
// ====
// compileViaYul: also
// ----
// g(bool): false -> 23, 37, 71
// g(bool): true -> 23, 37, 71