private Expression ReduceMember()
{
var member = (MemberExpression)Operand;
if (member.Expression == null)
{
//static member, reduce the same as variable
return ReduceVariable();
}
else
{
ParameterExpression temp1 = Parameter(member.Expression.Type, name: null);
BinaryExpression initTemp1 = Assign(temp1, member.Expression);
member = MakeMemberAccess(temp1, member.Member);
if (IsPrefix)
{
// (op) value.member
// ... is reduced into ...
// temp1 = value
// temp1.member = op(temp1.member)
return Block(
new TrueReadOnlyCollection<ParameterExpression>(temp1),
new TrueReadOnlyCollection<Expression>(
initTemp1,
Assign(member, FunctionalOp(member))
)
);
}
// value.member (op)
// ... is reduced into ...
// temp1 = value
// temp2 = temp1.member
// temp1.member = op(temp2)
// temp2
ParameterExpression temp2 = Parameter(member.Type, name: null);
return Block(
new TrueReadOnlyCollection<ParameterExpression>(temp1, temp2),
new TrueReadOnlyCollection<Expression>(
initTemp1,
Assign(temp2, member),
Assign(member, FunctionalOp(temp2)),
temp2
)
);
}
}