mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Introduce member access statements on address types.
This commit is contained in:
parent
bec78e58bf
commit
66ee8a647e
@ -431,6 +431,7 @@ string ExpressionStmtGenerator::visit()
|
|||||||
auto randomType = TypeProvider{state}.type();
|
auto randomType = TypeProvider{state}.type();
|
||||||
pair<SolidityTypePtr, string> randomTypeName = {randomType, {}};
|
pair<SolidityTypePtr, string> randomTypeName = {randomType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(randomTypeName);
|
auto expression = exprGen.rLValueOrLiteral(randomTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
if (expression.has_value())
|
if (expression.has_value())
|
||||||
return indentation() + expression.value().second + ";\n";
|
return indentation() + expression.value().second + ";\n";
|
||||||
else
|
else
|
||||||
@ -443,6 +444,7 @@ string VarDeclStmtGenerator::visit()
|
|||||||
auto randomType = TypeProvider{state}.type();
|
auto randomType = TypeProvider{state}.type();
|
||||||
pair<SolidityTypePtr, string> randomTypeName = {randomType, {}};
|
pair<SolidityTypePtr, string> randomTypeName = {randomType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(randomTypeName);
|
auto expression = exprGen.rLValueOrLiteral(randomTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
string varName = state->currentFunctionState()->addLocal(randomTypeName.first);
|
string varName = state->currentFunctionState()->addLocal(randomTypeName.first);
|
||||||
string varDeclStmt = indentation() +
|
string varDeclStmt = indentation() +
|
||||||
std::visit(
|
std::visit(
|
||||||
@ -475,6 +477,7 @@ string IfStmtGenerator::conditionalStmt(Condition _cond)
|
|||||||
auto boolType = make_shared<BoolType>();
|
auto boolType = make_shared<BoolType>();
|
||||||
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
solAssert(expression.has_value(), "");
|
solAssert(expression.has_value(), "");
|
||||||
if (_cond == Condition::IF)
|
if (_cond == Condition::IF)
|
||||||
condStmt << indentation()
|
condStmt << indentation()
|
||||||
@ -540,6 +543,7 @@ string WhileStmtGenerator::visit()
|
|||||||
auto boolType = make_shared<BoolType>();
|
auto boolType = make_shared<BoolType>();
|
||||||
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
solAssert(expression.has_value(), "");
|
solAssert(expression.has_value(), "");
|
||||||
bool doWhile = uRandDist()->probable(2);
|
bool doWhile = uRandDist()->probable(2);
|
||||||
if (doWhile)
|
if (doWhile)
|
||||||
@ -608,6 +612,7 @@ string ForStmtGenerator::visit()
|
|||||||
auto boolType = make_shared<BoolType>();
|
auto boolType = make_shared<BoolType>();
|
||||||
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
if (expression.has_value())
|
if (expression.has_value())
|
||||||
forCondition = expression.value().second + ";\n";
|
forCondition = expression.value().second + ";\n";
|
||||||
else
|
else
|
||||||
@ -623,6 +628,7 @@ string ForStmtGenerator::visit()
|
|||||||
auto randomType = TypeProvider{state}.type();
|
auto randomType = TypeProvider{state}.type();
|
||||||
pair<SolidityTypePtr, string> randomTypeName = {randomType, {}};
|
pair<SolidityTypePtr, string> randomTypeName = {randomType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(randomTypeName);
|
auto expression = exprGen.rLValueOrLiteral(randomTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
if (expression.has_value())
|
if (expression.has_value())
|
||||||
postStmt = expression.value().second;
|
postStmt = expression.value().second;
|
||||||
}
|
}
|
||||||
@ -936,6 +942,32 @@ optional<pair<SolidityTypePtr, string>> ExpressionGenerator::incDecOperation(
|
|||||||
return lResult;
|
return lResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
optional<pair<SolidityTypePtr, string>> ExpressionGenerator::memberAccessExpr(
|
||||||
|
pair<SolidityTypePtr, string>& _typeName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
solAssert(
|
||||||
|
holds_alternative<shared_ptr<IntegerType>>(_typeName.first) ||
|
||||||
|
holds_alternative<shared_ptr<BytesType>>(_typeName.first) ||
|
||||||
|
holds_alternative<shared_ptr<FixedBytesType>>(_typeName.first),
|
||||||
|
""
|
||||||
|
);
|
||||||
|
ExpressionGenerator exprGen{state};
|
||||||
|
auto addressType = make_shared<AddressType>();
|
||||||
|
pair<SolidityTypePtr, string> addressTypeName = {addressType, {}};
|
||||||
|
auto expression = exprGen.rLValueOrLiteral(addressTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
|
solAssert(expression.has_value(), "");
|
||||||
|
// TODO: Clean this up
|
||||||
|
if (holds_alternative<shared_ptr<IntegerType>>(_typeName.first))
|
||||||
|
expression.value().second += ".balance";
|
||||||
|
else if (holds_alternative<shared_ptr<FixedBytesType>>(_typeName.first))
|
||||||
|
expression.value().second += ".codehash";
|
||||||
|
else
|
||||||
|
expression.value().second += ".code";
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
|
||||||
ExpressionGenerator::RLValueExpr ExpressionGenerator::expressionType(SolidityTypePtr& _typePtr)
|
ExpressionGenerator::RLValueExpr ExpressionGenerator::expressionType(SolidityTypePtr& _typePtr)
|
||||||
{
|
{
|
||||||
vector<RLValueExpr> permittedTypes;
|
vector<RLValueExpr> permittedTypes;
|
||||||
@ -965,10 +997,14 @@ ExpressionGenerator::RLValueExpr ExpressionGenerator::expressionType(SolidityTyp
|
|||||||
RLValueExpr::BITXOR,
|
RLValueExpr::BITXOR,
|
||||||
RLValueExpr::BITOR,
|
RLValueExpr::BITOR,
|
||||||
};
|
};
|
||||||
|
auto bytesType = get<shared_ptr<FixedBytesType>>(_typePtr);
|
||||||
|
if (bytesType->numBytes == 32)
|
||||||
|
permittedTypes.emplace_back(RLValueExpr::MEMBERACCESS);
|
||||||
}
|
}
|
||||||
else if (holds_alternative<shared_ptr<IntegerType>>(_typePtr))
|
else if (holds_alternative<shared_ptr<IntegerType>>(_typePtr))
|
||||||
{
|
{
|
||||||
bool signedType = get<shared_ptr<IntegerType>>(_typePtr)->signedType;
|
auto integerType = get<shared_ptr<IntegerType>>(_typePtr);
|
||||||
|
bool signedType = integerType->signedType;
|
||||||
if (signedType)
|
if (signedType)
|
||||||
permittedTypes = {
|
permittedTypes = {
|
||||||
RLValueExpr::VARREF,
|
RLValueExpr::VARREF,
|
||||||
@ -989,6 +1025,7 @@ ExpressionGenerator::RLValueExpr ExpressionGenerator::expressionType(SolidityTyp
|
|||||||
RLValueExpr::BITOR
|
RLValueExpr::BITOR
|
||||||
};
|
};
|
||||||
else
|
else
|
||||||
|
{
|
||||||
permittedTypes = {
|
permittedTypes = {
|
||||||
RLValueExpr::VARREF,
|
RLValueExpr::VARREF,
|
||||||
RLValueExpr::LIT,
|
RLValueExpr::LIT,
|
||||||
@ -1009,6 +1046,17 @@ ExpressionGenerator::RLValueExpr ExpressionGenerator::expressionType(SolidityTyp
|
|||||||
RLValueExpr::BITXOR,
|
RLValueExpr::BITXOR,
|
||||||
RLValueExpr::BITOR
|
RLValueExpr::BITOR
|
||||||
};
|
};
|
||||||
|
if (integerType->numBits == 256)
|
||||||
|
permittedTypes.emplace_back(RLValueExpr::MEMBERACCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (holds_alternative<shared_ptr<BytesType>>(_typePtr))
|
||||||
|
{
|
||||||
|
permittedTypes = {
|
||||||
|
RLValueExpr::VARREF,
|
||||||
|
RLValueExpr::LIT,
|
||||||
|
RLValueExpr::MEMBERACCESS
|
||||||
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1320,6 +1368,8 @@ optional<pair<SolidityTypePtr, string>> ExpressionGenerator::rOrLValueExpression
|
|||||||
}
|
}
|
||||||
case RLValueExpr::LIT:
|
case RLValueExpr::LIT:
|
||||||
return literal(_typeName.first);
|
return literal(_typeName.first);
|
||||||
|
case RLValueExpr::MEMBERACCESS:
|
||||||
|
return memberAccessExpr(_typeName);
|
||||||
default:
|
default:
|
||||||
solAssert(false, "");
|
solAssert(false, "");
|
||||||
}
|
}
|
||||||
@ -1609,6 +1659,7 @@ string MagicStmtGenerator::visit()
|
|||||||
auto boolType = make_shared<BoolType>();
|
auto boolType = make_shared<BoolType>();
|
||||||
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
solAssert(expression.has_value(), "");
|
solAssert(expression.has_value(), "");
|
||||||
return indentation() +
|
return indentation() +
|
||||||
"assert(" +
|
"assert(" +
|
||||||
@ -1621,6 +1672,7 @@ string MagicStmtGenerator::visit()
|
|||||||
auto boolType = make_shared<BoolType>();
|
auto boolType = make_shared<BoolType>();
|
||||||
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
pair<SolidityTypePtr, string> boolTypeName = {boolType, {}};
|
||||||
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
auto expression = exprGen.rLValueOrLiteral(boolTypeName);
|
||||||
|
exprGen.resetNestingDepth();
|
||||||
solAssert(expression.has_value(), "");
|
solAssert(expression.has_value(), "");
|
||||||
return indentation() +
|
return indentation() +
|
||||||
"require(" +
|
"require(" +
|
||||||
|
|||||||
@ -811,6 +811,7 @@ struct ExpressionGenerator
|
|||||||
AND,
|
AND,
|
||||||
OR,
|
OR,
|
||||||
LIT,
|
LIT,
|
||||||
|
MEMBERACCESS,
|
||||||
RLMAX
|
RLMAX
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -842,6 +843,9 @@ struct ExpressionGenerator
|
|||||||
std::optional<std::pair<SolidityTypePtr, std::string>> rLValueOrLiteral(
|
std::optional<std::pair<SolidityTypePtr, std::string>> rLValueOrLiteral(
|
||||||
std::pair<SolidityTypePtr, std::string>& _typeName
|
std::pair<SolidityTypePtr, std::string>& _typeName
|
||||||
);
|
);
|
||||||
|
std::optional<std::pair<SolidityTypePtr, std::string>> memberAccessExpr(
|
||||||
|
std::pair<SolidityTypePtr, std::string>& _typeName
|
||||||
|
);
|
||||||
RLValueExpr expressionType(SolidityTypePtr& _typePtr);
|
RLValueExpr expressionType(SolidityTypePtr& _typePtr);
|
||||||
|
|
||||||
void incrementNestingDepth()
|
void incrementNestingDepth()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user