private string tname;
private string nspace;
private Type parent;
+ private Type nesting_type;
private Type[] interfaces;
private MethodBuilder[] methods;
private ConstructorBuilder[] ctors;
private ModuleBuilder pmodule;
private int class_size;
private PackingSize packing_size;
+ private Type created;
- public const int UnspecifiedTypeSize = -1;
+ public const int UnspecifiedTypeSize = 0;
protected override TypeAttributes GetAttributeFlagsImpl () {
return attrs;
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern void create_internal_class (TypeBuilder tb);
- internal TypeBuilder (ModuleBuilder mb, string name, TypeAttributes attr, Type parent, Type[] interfaces) {
+ internal TypeBuilder (ModuleBuilder mb, string name, TypeAttributes attr, Type parent, Type[] interfaces, PackingSize packing_size, int type_size) {
int sep_index;
this.parent = parent;
this.attrs = attr;
- packing_size = PackingSize.Unspecified;
+ this.class_size = type_size;
+ this.packing_size = packing_size;
sep_index = name.LastIndexOf('.');
if (sep_index != -1) {
this.tname = name.Substring (sep_index + 1);
}
pmodule = mb;
// skip .<Module> ?
- table_idx = mb.get_next_table_index (0x02, true);
+ table_idx = mb.get_next_table_index (this, 0x02, true);
setup_internal_class (this);
}
public override Assembly Assembly {
get {return pmodule.Assembly;}
}
- public override string AssemblyQualifiedName {get {return null;}}
+ public override string AssemblyQualifiedName {
+ get {
+ return FullName + ", " + Assembly.ToString();
+ }
+ }
public override Type BaseType {
get {
return parent;
}
}
- public override Type DeclaringType {get {return null;}}
+ public override Type DeclaringType {get {return nesting_type;}}
public override Type UnderlyingSystemType {
get {
if (fields != null) {
return f.FieldType;
}
}
- throw new InvalidOperationException ();
+ throw new InvalidOperationException (String.Format ("typebuilder: {0}", this));
}
}
public override string FullName {
get {
+ if (nesting_type != null)
+ return String.Concat (nesting_type.FullName, "+", tname);
if ((nspace != null) && (nspace.Length > 0))
return String.Concat (nspace, ".", tname);
return tname;
public PackingSize PackingSize {
get {return packing_size;}
}
- public override Type ReflectedType {get {return parent;}}
+ public override Type ReflectedType {get {return nesting_type;}}
public override MemberTypes MemberType {
get {return MemberTypes.TypeInfo;}
}
throw new NotImplementedException ();
}
- [MonoTODO]
public void AddInterfaceImplementation( Type interfaceType) {
- throw new NotImplementedException ();
+ if (interfaces != null) {
+ Type[] ifnew = new Type [interfaces.Length + 1];
+ interfaces.CopyTo (ifnew, 0);
+ ifnew [interfaces.Length] = interfaceType;
+ interfaces = ifnew;
+ } else {
+ interfaces = new Type [1];
+ interfaces [0] = interfaceType;
+ }
}
[MonoTODO]
[MonoTODO]
public TypeBuilder DefineNestedType (string name) {
// FIXME: LAMESPEC: what other attributes should we use here as default?
- return DefineNestedType (name, TypeAttributes.Public, typeof(object), null);
+ return DefineNestedType (name, TypeAttributes.Public, pmodule.assemblyb.corlib_object_type, null);
}
public TypeBuilder DefineNestedType (string name, TypeAttributes attr) {
- return DefineNestedType (name, attr, typeof(object), null);
+ return DefineNestedType (name, attr, pmodule.assemblyb.corlib_object_type, null);
}
public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent) {
return DefineNestedType (name, attr, parent, null);
}
- public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, Type[] interfaces) {
- TypeBuilder res = new TypeBuilder (pmodule, name, attr, parent, interfaces);
+ private TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, Type[] interfaces, PackingSize packsize, int typesize) {
+ TypeBuilder res = new TypeBuilder (pmodule, name, attr, parent, interfaces, packsize, typesize);
+ res.nesting_type = this;
if (subtypes != null) {
TypeBuilder[] new_types = new TypeBuilder [subtypes.Length + 1];
System.Array.Copy (subtypes, new_types, subtypes.Length);
return res;
}
- public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, int typesize) {
- return DefineNestedType (name, attr, parent, null);
+ public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, Type[] interfaces) {
+ return DefineNestedType (name, attr, parent, interfaces, PackingSize.Unspecified, UnspecifiedTypeSize);
}
- public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, PackingSize packsize) {
- return DefineNestedType (name, attr, parent, null);
+ public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, int typesize) {
+ return DefineNestedType (name, attr, parent, null, PackingSize.Unspecified, typesize);
}
- public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, PackingSize packsize, int typesize) {
- return DefineNestedType (name, attr, parent, null);
+ public TypeBuilder DefineNestedType (string name, TypeAttributes attr, Type parent, PackingSize packsize) {
+ return DefineNestedType (name, attr, parent, null, packsize, UnspecifiedTypeSize);
}
public ConstructorBuilder DefineConstructor( MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes) {
throw new NotImplementedException ();
}
+ [MethodImplAttribute(MethodImplOptions.InternalCall)]
+ private extern Type create_runtime_class (TypeBuilder tb);
+
public Type CreateType() {
+ /* handle nesting_type */
+ if (created != null)
+ throw new InvalidOperationException ("type already created");
if (methods != null) {
foreach (MethodBuilder method in methods) {
method.fixup ();
ctor.fixup ();
}
}
+ created = create_runtime_class (this);
+
return this;
}
throw new NotImplementedException ();
}
- [MonoTODO]
public override Type[] GetNestedTypes (BindingFlags bindingAttr) {
- // FIXME
- throw new NotImplementedException ();
+ bool match;
+ ArrayList result = new ArrayList ();
+
+ if (subtypes == null)
+ return Type.EmptyTypes;
+ foreach (TypeBuilder t in subtypes) {
+ match = false;
+ if ((t.attrs & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) {
+ if ((bindingAttr & BindingFlags.Public) != 0)
+ match = true;
+ } else {
+ if ((bindingAttr & BindingFlags.NonPublic) != 0)
+ match = true;
+ }
+ if (!match)
+ continue;
+ result.Add (t);
+ }
+ Type[] r = new Type [result.Count];
+ result.CopyTo (r);
+ return r;
}
public override PropertyInfo[] GetProperties( BindingFlags bindingAttr) {
}
protected override bool IsArrayImpl () {
- // FIXME
- return false;
+ return type_is_subtype_of (this, typeof (System.Array), false);
}
protected override bool IsByRefImpl () {
// FIXME
return false;
}
protected override bool IsValueTypeImpl () {
- // test this one
- return type_is_subtype_of (this, typeof (System.ValueType), false);
+ return ((type_is_subtype_of (this, pmodule.assemblyb.corlib_value_type, false) || type_is_subtype_of (this, typeof(System.ValueType), false)) &&
+ this != pmodule.assemblyb.corlib_value_type &&
+ this != pmodule.assemblyb.corlib_enum_type);
}
public override RuntimeTypeHandle TypeHandle { get { return _impl; } }
- private static int decode_len (byte[] data, int pos, out int rpos) {
- int len = 0;
- if ((data [pos] & 0x80) == 0) {
- len = (int)(data [pos++] & 0x7f);
- } else if ((data [pos] & 0x40) == 0) {
- len = ((data [pos] & 0x3f) << 8) + data [pos + 1];
- pos += 2;
- } else {
- len = ((data [pos] & 0x1f) << 24) + (data [pos + 1] << 16) + (data [pos + 2] << 8) + data [pos + 3];
- pos += 4;
- }
- rpos = pos;
- return len;
- }
-
- private static string string_from_bytes (byte[] data, int pos, int len) {
- char[] chars = new char [len];
- // FIXME: use a utf8 decoder here
- for (int i = 0; i < len; ++i)
- chars [i] = (char)data [pos + i];
- return new String (chars);
- }
-
public void SetCustomAttribute( CustomAttributeBuilder customBuilder) {
string attrname = customBuilder.Ctor.ReflectedType.FullName;
if (attrname == "System.Runtime.InteropServices.StructLayoutAttribute") {
int nnamed = (int)data [pos++];
nnamed |= ((int)data [pos++]) << 8;
for (int i = 0; i < nnamed; ++i) {
+ byte named_type = data [pos++];
byte type = data [pos++];
- int len = decode_len (data, pos, out pos);
- string named_name = string_from_bytes (data, pos, len);
+ int len = CustomAttributeBuilder.decode_len (data, pos, out pos);
+ string named_name = CustomAttributeBuilder.string_from_bytes (data, pos, len);
pos += len;
/* all the fields are integers in StructLayout */
int value = (int)data [pos++];
}
}
return;
+ } else if (attrname == "System.SerializableAttribute") {
+ attrs |= TypeAttributes.Serializable;
+ return;
}
if (cattrs != null) {
CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1];
public FieldBuilder DefineInitializedData( string name, byte[] data, FieldAttributes attributes) {
TypeBuilder datablobtype = pmodule.DefineType ("$ArrayType$"+InitializedDataCount.ToString(),
TypeAttributes.Public|TypeAttributes.ExplicitLayout|TypeAttributes.Sealed,
- typeof (System.ValueType), PackingSize.Size1, data.Length);
+ pmodule.assemblyb.corlib_value_type, PackingSize.Size1, data.Length);
datablobtype.packing_size = PackingSize.Size1;
datablobtype.class_size = data.Length;
datablobtype.CreateType ();
throw new NotImplementedException ();
}
+ public TypeToken TypeToken {
+ get {
+ return new TypeToken (0x02000000 | table_idx);
+ }
+ }
public void SetParent (Type parentType) {
parent = parentType;
}
- internal int get_next_table_index (int table, bool inc) {
- return pmodule.get_next_table_index (table, inc);
+ internal int get_next_table_index (object obj, int table, bool inc) {
+ return pmodule.get_next_table_index (obj, table, inc);
}
}