using System.Reflection.Emit;
namespace CIR {
- public class Assign : Expression {
+ public class Assign : ExpressionStatement {
Expression target, source;
Location l;
}
}
- public override Expression Resolve (TypeContainer tc)
+ public override Expression DoResolve (EmitContext ec)
{
- target = target.Resolve (tc);
- source = source.Resolve (tc);
+ target = target.Resolve (ec);
+ source = source.Resolve (ec);
if (target == null || source == null)
return null;
Type target_type = target.Type;
- Type source_type = source.Type;
+ Type source_type = source.Type;
+
if (target_type != source_type){
- source = ConvertImplicitRequired (tc, source, target_type, l);
+ source = ConvertImplicitRequired (ec, source, target_type, l);
if (source == null)
return null;
}
if (!(target is LValue)){
- tc.RootContext.Report.Error (131, "Left hand of an assignment must be a variable, a property or an indexer");
+ Report.Error (131, "Left hand of an assignment must be a variable, a property or an indexer");
}
type = target_type;
+ eclass = ExprClass.Value;
return this;
}
- public override bool Emit (EmitContext ec)
+ void Emit (EmitContext ec, bool is_statement)
{
+ ILGenerator ig = ec.ig;
+
if (target.ExprClass == ExprClass.Variable){
//
FieldExpr fe = (FieldExpr) target;
if (!fe.FieldInfo.IsStatic)
- ec.ig.Emit (OpCodes.Ldarg_0);
+ ig.Emit (OpCodes.Ldarg_0);
}
-
+
source.Emit (ec);
- ((LValue) target).Store (ec.ig);
+ if (!is_statement)
+ ig.Emit (OpCodes.Dup);
+
+ ((LValue) target).Store (ec);
} else if (target.ExprClass == ExprClass.PropertyAccess){
// FIXME
throw new Exception ("Can not assign to properties yet");
// FIXME
throw new Exception ("Can not assign to indexers yet");
}
+ }
+
+ public override void Emit (EmitContext ec)
+ {
+ Emit (ec, false);
+ }
- return false;
+ public override void EmitStatement (EmitContext ec)
+ {
+ Emit (ec, true);
}
}
}
+