return local;
}
- public void EmitLoad (Expression expression)
+ public void EmitLoadAddress (Expression expression)
+ {
+ ig.Emit (OpCodes.Ldloca, EmitStored (expression));
+ }
+
+ public void EmitLoadSubject (Expression expression)
{
if (expression.Type.IsValueType) {
- var local = EmitStored (expression);
- ig.Emit (OpCodes.Ldloca, local);
- } else
- expression.Emit (this);
+ EmitLoadAddress (expression);
+ return;
+ }
+
+ Emit (expression);
+ }
+
+ public void EmitLoadSubject (LocalBuilder local)
+ {
+ if (local.LocalType.IsValueType) {
+ EmitLoadAddress (local);
+ return;
+ }
+
+ EmitLoad (local);
+ }
+
+ public void EmitLoadAddress (LocalBuilder local)
+ {
+ ig.Emit (OpCodes.Ldloca, local);
}
public void EmitLoad (LocalBuilder local)
public void EmitCall (LocalBuilder local, ReadOnlyCollection<Expression> arguments, MethodInfo method)
{
- EmitLoad (local);
+ EmitLoadSubject (local);
EmitArguments (method, arguments);
EmitCall (method);
}
+ public void EmitCall (LocalBuilder local, MethodInfo method)
+ {
+ EmitLoadSubject (local);
+ EmitCall (method);
+ }
+
public void EmitCall (Expression expression, MethodInfo method)
{
if (!method.IsStatic)
- EmitLoad (expression);
+ EmitLoadSubject (expression);
EmitCall (method);
}
public void EmitCall (Expression expression, ReadOnlyCollection<Expression> arguments, MethodInfo method)
{
if (!method.IsStatic)
- EmitLoad (expression);
+ EmitLoadSubject (expression);
EmitArguments (method, arguments);
EmitCall (method);
{
var getter = property.GetGetMethod (true);
if (!getter.IsStatic)
- ec.EmitLoad (expression);
+ ec.EmitLoadSubject (expression);
ec.EmitCall (getter);
}
void EmitFieldAccess (EmitContext ec, FieldInfo field)
{
if (!field.IsStatic) {
- ec.EmitLoad (expression);
+ ec.EmitLoadSubject (expression);
ec.ig.Emit (OpCodes.Ldfld, field);
} else
ec.ig.Emit (OpCodes.Ldsfld, field);
var has_value = ig.DefineLabel ();
var done = ig.DefineLabel ();
- ig.Emit (OpCodes.Ldloca, from);
- ig.Emit (OpCodes.Call, from.LocalType.GetMethod ("get_HasValue"));
+ ec.EmitCall (from, from.LocalType.GetMethod ("get_HasValue"));
ig.Emit (OpCodes.Brtrue, has_value);
// if not has value
ig.MarkLabel (has_value);
// if has value
- ig.Emit (OpCodes.Ldloca, from);
- ig.Emit (OpCodes.Call, from.LocalType.GetMethod ("GetValueOrDefault", Type.EmptyTypes));
+ ec.EmitCall (from, from.LocalType.GetMethod ("GetValueOrDefault", Type.EmptyTypes));
ig.Emit (OpCodes.Newobj, to.LocalType.GetConstructor (
new [] { GetNotNullableOf (to.LocalType) }));