2001-10-12 Ravi Pratap <ravi@ximian.com>
[mono.git] / mcs / mcs / assign.cs
index c34f70d1cf8cfd35985fc0ef20ff4f0d03678100..36081efe19fa5bf07bf9e464354075ccedf5a1a4 100755 (executable)
@@ -6,15 +6,20 @@
 //
 // (C) 2001 Ximian, Inc.
 //
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
 
 namespace CIR {
-       public class Assign : Expression {
+       public class Assign : ExpressionStatement {
                Expression target, source;
+               Location l;
                
-               public Assign (Expression target, Expression source)
+               public Assign (Expression target, Expression source, Location l)
                {
                        this.target = target;
                        this.source = source;
+                       this.l = l;
                }
 
                public Expression Target {
@@ -36,5 +41,76 @@ namespace CIR {
                                source = value;
                        }
                }
+
+               public override Expression DoResolve (EmitContext ec)
+               {
+                       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;
+
+                       if (target_type != source_type){
+                               source = ConvertImplicitRequired (ec, source, target_type, l);
+                               if (source == null)
+                                       return null;
+                       }
+                       
+                       if (!(target is LValue)){
+                               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;
+               }
+
+               void Emit (EmitContext ec, bool is_statement)
+               {
+                       ILGenerator ig = ec.ig;
+                       
+                       if (target.ExprClass == ExprClass.Variable){
+
+                               //
+                               // If it is an instance field, load the this pointer
+                               //
+                               if (target is FieldExpr){
+                                       FieldExpr fe = (FieldExpr) target;
+                                       
+                                       if (!fe.FieldInfo.IsStatic)
+                                               ig.Emit (OpCodes.Ldarg_0);
+                               }
+
+                               source.Emit (ec);
+
+                               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");
+                       } else if (target.ExprClass == ExprClass.IndexerAccess){
+                               // FIXME
+                               throw new Exception ("Can not assign to indexers yet");
+                       }
+               }
+               
+               public override void Emit (EmitContext ec)
+               {
+                       Emit (ec, false);
+               }
+
+               public override void EmitStatement (EmitContext ec)
+               {
+                       Emit (ec, true);
+               }
        }
 }
+
+
+
+