Clenup few checks.
[mono.git] / mcs / mcs / eval.cs
index 66fc039a53ee0ff2a5d76777cc3b8b8dabe2ec06..6782d573a406830981cd1b06a90daff32eae586c 100644 (file)
@@ -57,7 +57,7 @@ namespace Mono.CSharp {
 
                static List<NamespaceEntry.UsingAliasEntry> using_alias_list = new List<NamespaceEntry.UsingAliasEntry> ();
                internal static List<NamespaceEntry.UsingEntry> using_list = new List<NamespaceEntry.UsingEntry> ();
-               static Dictionary<string, FieldInfo> fields = new Dictionary<string, FieldInfo> ();
+               static Dictionary<string, Tuple<FieldSpec, FieldInfo>> fields = new Dictionary<string, Tuple<FieldSpec, FieldInfo>> ();
 
                static TypeSpec interactive_base_class;
                static Driver driver;
@@ -128,10 +128,11 @@ namespace Mono.CSharp {
                                CompilerCallableEntryPoint.Reset ();
                                RootContext.ToplevelTypes = new ModuleCompiled (ctx, true);
                                /*var ctypes = */TypeManager.InitCoreTypes ();
-                               TypeManager.InitExpressionTypes ();
 
                                Import.Initialize ();
                                driver.LoadReferences ();
+                               TypeManager.InitOptionalCoreTypes (ctx);
+
                                RootContext.EvalMode = true;
                                inited = true;
 
@@ -166,7 +167,7 @@ namespace Mono.CSharp {
                        //
 //                     if (!TypeManager.InitCoreTypes (ctx, null))
 //                             throw new Exception ("Failed to InitCoreTypes");
-                       TypeManager.InitOptionalCoreTypes (ctx);
+//                     TypeManager.InitOptionalCoreTypes (ctx);
                        
                        Location.AddFile (null, "{interactive}");
                        Location.Initialize ();
@@ -197,16 +198,17 @@ namespace Mono.CSharp {
                                if (interactive_base_class != null)
                                        return interactive_base_class;
 
-                               return interactive_base_class = Import.ImportType (typeof (InteractiveBase));
+                               return Import.ImportType (typeof (InteractiveBase));
                        }
+               }
 
-                       set {
-                               if (value == null)
-                                       throw new ArgumentNullException ();
+               public static void SetInteractiveBaseClass (Type type)
+               {
+                       if (type == null)
+                               throw new ArgumentNullException ();
 
-                               lock (evaluator_lock)
-                                       interactive_base_class = value;
-                       }
+                       lock (evaluator_lock)
+                               interactive_base_class = Import.ImportType (type);
                }
 
                /// <summary>
@@ -756,25 +758,27 @@ namespace Mono.CSharp {
                        // Pull the FieldInfos from the type, and keep track of them
                        foreach (Field field in queued_fields){
                                FieldInfo fi = tt.GetField (field.Name);
-                               
-                               FieldInfo old;
+
+                               Tuple<FieldSpec, FieldInfo> old;
                                
                                // If a previous value was set, nullify it, so that we do
                                // not leak memory
-                               if (fields.TryGetValue (field.Name, out old)){
-                                       if (old.FieldType.IsValueType){
+                               if (fields.TryGetValue (field.Name, out old)) {
+                                       if (old.Item1.MemberType.IsStruct) {
                                                //
                                                // TODO: Clear fields for structs
                                                //
                                        } else {
                                                try {
-                                                       old.SetValue (null, null);
+                                                       old.Item2.SetValue (null, null);
                                                } catch {
                                                }
                                        }
+
+                                       fields [field.Name] = Tuple.Create (old.Item1, fi);
+                               } else {
+                                       fields.Add (field.Name, Tuple.Create (field.Spec, fi));
                                }
-                               
-                               fields [field.Name] = fi;
                        }
                        //types.Add (tb);
 
@@ -797,12 +801,10 @@ namespace Mono.CSharp {
                public class NoValueSet {
                }
 
-               static internal FieldInfo LookupField (string name)
+               static internal Tuple<FieldSpec, FieldInfo> LookupField (string name)
                {
-                       FieldInfo fi;
-                       if (!fields.TryGetValue (name, out fi))
-                               return null;
-
+                       Tuple<FieldSpec, FieldInfo> fi;
+                       fields.TryGetValue (name, out fi);
                        return fi;
                }
 
@@ -866,25 +868,18 @@ namespace Mono.CSharp {
                                StringBuilder sb = new StringBuilder ();
                                
                                foreach (var de in fields){
-                                       FieldInfo fi = LookupField (de.Key);
-                                       object value = null;
-                                       //bool error = false;
-                                       
+                                       var fi = LookupField (de.Key);
+                                       object value;
                                        try {
-                                               if (value == null)
-                                                       value = "null";
-                                               value = fi.GetValue (null);
+                                               value = fi.Item2.GetValue (null);
                                                if (value is string)
                                                        value = Quote ((string)value);
                                        } catch {
-                                               //error = true;
+                                               value = "<error reading value>";
                                        }
 
-                                       throw new NotImplementedException ("net");
-                                       //if (error)
-                                       //    sb.Append (String.Format ("{0} {1} <error reading value>", TypeManager.CSharpName(fi.FieldType), de.Key));
-                                       //else
-                                       //    sb.Append (String.Format ("{0} {1} = {2}", TypeManager.CSharpName(fi.FieldType), de.Key, value));
+                                       sb.AppendFormat ("{0} {1} = {2}", fi.Item1.MemberType.GetSignatureForError (), de.Key, value);
+                                       sb.AppendLine ();
                                }
                                
                                return sb.ToString ();
@@ -1055,17 +1050,17 @@ namespace Mono.CSharp {
                /// </summary>
                static public string help {
                        get {
-                               return  "Static methods:\n"+
-                                       "  Describe(obj)      - Describes the object's type\n" + 
-                                       "  LoadPackage (pkg); - Loads the given Package (like -pkg:FILE)\n" +
-                                       "  LoadAssembly (ass) - Loads the given assembly (like -r:ASS)\n" + 
-                                       "  ShowVars ();       - Shows defined local variables.\n" +
-                                       "  ShowUsing ();      - Show active using decltions.\n" +
-                                       "  Prompt             - The prompt used by the C# shell\n" +
-                                       "  ContinuationPrompt - The prompt for partial input\n" +
-                                       "  Time(() -> { })    - Times the specified code\n" +
-                                       "  quit;\n" +
-                                       "  help;\n";
+                               return "Static methods:\n" +
+                                       "  Describe (object)       - Describes the object's type\n" +
+                                       "  LoadPackage (package);  - Loads the given Package (like -pkg:FILE)\n" +
+                                       "  LoadAssembly (assembly) - Loads the given assembly (like -r:ASSEMBLY)\n" +
+                                       "  ShowVars ();            - Shows defined local variables.\n" +
+                                       "  ShowUsing ();           - Show active using declarations.\n" +
+                                       "  Prompt                  - The prompt used by the C# shell\n" +
+                                       "  ContinuationPrompt      - The prompt for partial input\n" +
+                                       "  Time(() -> { })         - Times the specified code\n" +
+                                       "  quit;                   - You'll never believe it - this quits the repl!\n" +
+                                       "  help;                   - This help text\n";
                        }
                }
 
@@ -1093,14 +1088,12 @@ namespace Mono.CSharp {
                static public string Describe (object x)
                {
                        if (x == null)
-                               return "";
-                       
-                       TypeSpec t = x as TypeSpec;
-//                     if (t == null)
-//                             t = x.GetType ();
+                               return "<null>";
+
+                       var type = x as Type ?? x.GetType ();
 
                        StringWriter sw = new StringWriter ();
-                       new Outline (t.GetMetaInfo (), sw, true, false, false).OutlineType ();
+                       new Outline (type, sw, true, false, false).OutlineType ();
                        return sw.ToString ();
                }
 #endif
@@ -1194,7 +1187,7 @@ namespace Mono.CSharp {
                                        }
                                        
                                        Arguments args = new Arguments (1);
-                                       args.Add (new Argument (new TypeOf (source, Location)));
+                                       args.Add (new Argument (new TypeOf ((TypeExpr) clone, Location)));
                                        source = new Invocation (new SimpleName ("Describe", Location), args).Resolve (ec);
                                }
                                Evaluator.SetPrinter (old_printer);