2004-12-08 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / System.Runtime.Serialization.Formatters.Binary / CodeGenerator.cs
index 55d4e90e49c61d12bc76d227109be68d013fc420..f03da9b74d14fcde3eb25e158b17fce13c018dc0 100644 (file)
@@ -5,6 +5,29 @@
 //
 // (C) 2004 Novell, Inc
 
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System;
 using System.IO;
 using System.Collections;
@@ -32,7 +55,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                                AssemblyName myAsmName = new AssemblyName();
                                                myAsmName.Name = "__MetadataTypes";
                                           
-                                               AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly (myAsmName, AssemblyBuilderAccess.Run);
+                                               AssemblyBuilder myAsmBuilder = myDomain.DefineInternalDynamicAssembly (myAsmName, AssemblyBuilderAccess.Run);
                                                _module = myAsmBuilder.DefineDynamicModule("__MetadataTypesModule", true);
                                        }
                                }
@@ -227,7 +250,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                if (t == typeof(Enum))
                                        ig.Emit (OpCodes.Ldind_Ref);
                                else
-                                       LoadFromPtr (ig, t.UnderlyingSystemType);
+                                       LoadFromPtr (ig, EnumToUnderlying (t));
                        } else if (t.IsValueType)
                                ig.Emit (OpCodes.Ldobj, t);
                        else
@@ -336,6 +359,40 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        break;
                        }
                }
+               
+               //
+               // This is needed, because enumerations from assemblies
+               // do not report their underlyingtype, but they report
+               // themselves
+               //
+               public static Type EnumToUnderlying (Type t)
+               {
+                       TypeCode tc = Type.GetTypeCode (t);
+       
+                       switch (tc){
+                       case TypeCode.Boolean:
+                               return typeof (bool);
+                       case TypeCode.Byte:
+                               return typeof (byte);
+                       case TypeCode.SByte:
+                               return typeof (sbyte);
+                       case TypeCode.Char:
+                               return typeof (char);
+                       case TypeCode.Int16:
+                               return typeof (short);
+                       case TypeCode.UInt16:
+                               return typeof (ushort);
+                       case TypeCode.Int32:
+                               return typeof (int);
+                       case TypeCode.UInt32:
+                               return typeof (uint);
+                       case TypeCode.Int64:
+                               return typeof (long);
+                       case TypeCode.UInt64:
+                               return typeof (ulong);
+                       }
+                       throw new Exception ("Unhandled typecode in enum " + tc + " from " + t.AssemblyQualifiedName);
+               }
        }
  }