bool BindPointerArithmeticOperator(BinaryExpression node, IType left, IType right)
{
if (!left.IsPointer || !TypeSystemServices.IsPrimitiveNumber(right))
return false;
switch (node.Operator)
{
case BinaryOperatorType.Addition:
case BinaryOperatorType.Subtraction:
if (node.ContainsAnnotation("pointerSizeNormalized"))
return true;
BindExpressionType(node, left);
int size = TypeSystemServices.SizeOf(left);
if (size == 1)
return true; //no need for normalization
//normalize RHS wrt size of pointer
IntegerLiteralExpression literal = node.Right as IntegerLiteralExpression;
Expression normalizedRhs = (null != literal)
? (Expression)
new IntegerLiteralExpression(literal.Value * size)
: (Expression)
new BinaryExpression(BinaryOperatorType.Multiply,
node.Right,
new IntegerLiteralExpression(size));
node.Replace(node.Right, normalizedRhs);
Visit(node.Right);
node.Annotate("pointerSizeNormalized", size);
return true;
}
return false;
}