X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Reflection.Emit%2FTypeBuilder.cs;h=edcf429d9cc55167a63c75ed876ab94c314b6d44;hb=98a86ecd4ba2d3b4631d98ac5a4abf23f4e6c3e3;hp=ee5bf6146205cf77ed09ad84c4d15798e7c347dc;hpb=88a57683fec395e9314ec463021ebb128dbe785b;p=mono.git diff --git a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs index ee5bf614620..edcf429d9cc 100644 --- a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs @@ -7,6 +7,29 @@ // (C) 2001 Ximian, Inc. http://www.ximian.com // +// +// 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.Text; using System.Reflection; @@ -36,12 +59,16 @@ namespace System.Reflection.Emit { private EventBuilder[] events; private CustomAttributeBuilder[] cattrs; internal TypeBuilder[] subtypes; - private TypeAttributes attrs; + internal TypeAttributes attrs; private int table_idx; private ModuleBuilder pmodule; private int class_size; private PackingSize packing_size; - private MonoGenericParam[] generic_params; +#if NET_2_0 || BOOTSTRAP_NET_2_0 + private GenericTypeParameterBuilder[] generic_params; +#else + private Object generic_params; /* so offsets don't change */ +#endif private RefEmitPermissionSet[] permissions; #endregion private Type created; @@ -68,8 +95,9 @@ namespace System.Reflection.Emit { internal TypeBuilder (ModuleBuilder mb, TypeAttributes attr) { this.parent = null; this.attrs = attr; - this.class_size = -1; + this.class_size = 0; fullname = this.tname = ""; + this.table_idx = 1; this.nspace = ""; pmodule = mb; setup_internal_class (this); @@ -353,7 +381,7 @@ namespace System.Reflection.Emit { return DefineConstructor (attributes, callingConvention, parameterTypes, null, null); } -#if NET_1_2 +#if NET_2_0 || BOOTSTRAP_NET_2_0 public #else internal @@ -422,7 +450,7 @@ namespace System.Reflection.Emit { return DefineMethod (name, attributes, callingConvention, returnType, null, null, parameterTypes, null, null); } -#if NET_1_2 +#if NET_2_0 || BOOTSTRAP_NET_2_0 public #else internal @@ -447,7 +475,7 @@ namespace System.Reflection.Emit { return DefinePInvokeMethod (name, dllName, entryName, attributes, callingConvention, returnType, null, null, parameterTypes, null, null, nativeCallConv, nativeCharSet); } -#if NET_1_2 +#if NET_2_0 || BOOTSTRAP_NET_2_0 public #else internal @@ -518,7 +546,7 @@ namespace System.Reflection.Emit { return DefineField (fieldName, type, null, null, attributes); } -#if NET_1_2 +#if NET_2_0 || BOOTSTRAP_NET_2_0 public #else internal @@ -960,7 +988,7 @@ namespace System.Reflection.Emit { public override Type[] GetNestedTypes (BindingFlags bindingAttr) { bool match; ArrayList result = new ArrayList (); - + if (subtypes == null) return Type.EmptyTypes; foreach (TypeBuilder t in subtypes) { @@ -1104,8 +1132,19 @@ namespace System.Reflection.Emit { for (int i = 0; i < nnamed; ++i) { byte named_type = data [pos++]; byte type = data [pos++]; - int len = CustomAttributeBuilder.decode_len (data, pos, out pos); - string named_name = CustomAttributeBuilder.string_from_bytes (data, pos, len); + int len; + string named_name; + + if (type == 0x55) { + len = CustomAttributeBuilder.decode_len (data, pos, out pos); + string named_typename = CustomAttributeBuilder.string_from_bytes (data, pos, len); + pos += len; + // FIXME: Check that 'named_type' and 'named_typename' match, etc. + // See related code/FIXME in mono/mono/metadata/reflection.c + } + + len = CustomAttributeBuilder.decode_len (data, pos, out pos); + named_name = CustomAttributeBuilder.string_from_bytes (data, pos, len); pos += len; /* all the fields are integers in StructLayout */ int value = (int)data [pos++]; @@ -1219,6 +1258,8 @@ namespace System.Reflection.Emit { throw not_after_created (); parent = parentType; + // will just set the parent-related bits if called a second time + setup_internal_class (this); } internal int get_next_table_index (object obj, int table, bool inc) { return pmodule.get_next_table_index (obj, table, inc); @@ -1258,7 +1299,32 @@ namespace System.Reflection.Emit { throw new ArgumentException (argName, "Illegal name."); } -#if NET_1_2 + public override String ToString () + { + return FullName; + } + + [MonoTODO] + public override bool IsAssignableFrom (Type c) + { + return base.IsAssignableFrom (c); + } + + [MonoTODO] + public override bool IsSubclassOf (Type c) + { + return base.IsSubclassOf (c); + } + +#if NET_2_0 || BOOTSTRAP_NET_2_0 + public override Type[] GetGenericArguments () + { + if (generic_params != null) + return generic_params; + + throw new InvalidOperationException (); + } + public override Type GetGenericTypeDefinition () { setup_generic_class (this); @@ -1295,29 +1361,14 @@ namespace System.Reflection.Emit { } } - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern MonoGenericParam define_generic_parameter (string name, int index); - - public Type DefineGenericParameter (string name) + public GenericTypeParameterBuilder[] DefineGenericParameters (string[] names) { - int index; - if (generic_params != null) { - MonoGenericParam[] new_generic_params = new MonoGenericParam [generic_params.Length+1]; - System.Array.Copy (generic_params, new_generic_params, generic_params.Length); - index = generic_params.Length; - generic_params = new_generic_params; - } else { - generic_params = new MonoGenericParam [1]; - index = 0; - } - - generic_params [index] = define_generic_parameter (name, index); - return generic_params [index]; - } + generic_params = new GenericTypeParameterBuilder [names.Length]; + for (int i = 0; i < names.Length; i++) + generic_params [i] = new GenericTypeParameterBuilder ( + this, null, names [i], i); - public void SetGenericParameterConstraints (int index, Type[] constraints, bool has_ctor_constraint) - { - generic_params [index].SetConstraints (constraints, has_ctor_constraint); + return generic_params; } public MethodBuilder DefineGenericMethod (string name, MethodAttributes attributes)