void LoadAddress(Expression expression)
{
if (expression.NodeType == NodeType.SelfLiteralExpression && expression.ExpressionType.IsValueType)
{
_il.Emit(OpCodes.Ldarg_0);
return;
}
var entity = expression.Entity;
if (entity != null)
{
switch (entity.EntityType)
{
case EntityType.Local:
{
var local = ((InternalLocal) entity);
_il.Emit(!local.Type.IsPointer ? OpCodes.Ldloca : OpCodes.Ldloc, local.LocalBuilder);
return;
}
case EntityType.Parameter:
{
var param = (InternalParameter)entity;
if (param.Parameter.IsByRef)
LoadParam(param);
else
_il.Emit(OpCodes.Ldarga, param.Index);
return;
}
case EntityType.Field:
{
var field = (IField)entity;
if (!field.IsLiteral)
{
EmitLoadFieldAddress(expression, field);
return;
}
break;
}
}
}
if (IsValueTypeArraySlicing(expression))
{
LoadArrayElementAddress((SlicingExpression)expression);
return;
}
Visit(expression);
if (!AstUtil.IsIndirection(expression))
{
// declare local to hold value type
var temp = _il.DeclareLocal(GetSystemType(PopType()));
_il.Emit(OpCodes.Stloc, temp);
_il.Emit(OpCodes.Ldloca, temp);
}
}