зеркало из https://github.com/mono/ikvm-fork.git
According to Marek, Mono requires the PropertyMap table to be sorted.
This commit is contained in:
Родитель
6395aaffb6
Коммит
af092c964f
|
@ -264,10 +264,12 @@ namespace IKVM.Reflection.Emit
|
||||||
|
|
||||||
foreach (ModuleBuilder moduleBuilder in modules)
|
foreach (ModuleBuilder moduleBuilder in modules)
|
||||||
{
|
{
|
||||||
if (string.Compare(moduleBuilder.fileName, assemblyFileName, StringComparison.OrdinalIgnoreCase) == 0)
|
moduleBuilder.PopulatePropertyAndEventTables();
|
||||||
|
|
||||||
|
if (manifestModule == null
|
||||||
|
&& string.Compare(moduleBuilder.fileName, assemblyFileName, StringComparison.OrdinalIgnoreCase) == 0)
|
||||||
{
|
{
|
||||||
manifestModule = moduleBuilder;
|
manifestModule = moduleBuilder;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,6 +113,17 @@ namespace IKVM.Reflection.Emit
|
||||||
types.Add(moduleType);
|
types.Add(moduleType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void PopulatePropertyAndEventTables()
|
||||||
|
{
|
||||||
|
// LAMESPEC the PropertyMap and EventMap tables are not required to be sorted by the CLI spec,
|
||||||
|
// but .NET sorts them and Mono requires them to be sorted, so we have to populate the
|
||||||
|
// tables in the right order
|
||||||
|
foreach (TypeBuilder type in types)
|
||||||
|
{
|
||||||
|
type.PopulatePropertyAndEventTables();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal void WriteTypeDefTable(MetadataWriter mw)
|
internal void WriteTypeDefTable(MetadataWriter mw)
|
||||||
{
|
{
|
||||||
int fieldList = 1;
|
int fieldList = 1;
|
||||||
|
@ -1176,6 +1187,7 @@ namespace IKVM.Reflection.Emit
|
||||||
|
|
||||||
public void __Save(PortableExecutableKinds portableExecutableKind, ImageFileMachine imageFileMachine)
|
public void __Save(PortableExecutableKinds portableExecutableKind, ImageFileMachine imageFileMachine)
|
||||||
{
|
{
|
||||||
|
PopulatePropertyAndEventTables();
|
||||||
IList<CustomAttributeData> attributes = asm.GetCustomAttributesData(null);
|
IList<CustomAttributeData> attributes = asm.GetCustomAttributesData(null);
|
||||||
if (attributes.Count > 0)
|
if (attributes.Count > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -658,6 +658,29 @@ namespace IKVM.Reflection.Emit
|
||||||
{
|
{
|
||||||
mb.Bake();
|
mb.Bake();
|
||||||
}
|
}
|
||||||
|
if (declarativeSecurity != null)
|
||||||
|
{
|
||||||
|
this.ModuleBuilder.AddDeclarativeSecurity(token, declarativeSecurity);
|
||||||
|
}
|
||||||
|
if (baseType != null)
|
||||||
|
{
|
||||||
|
extends = this.ModuleBuilder.GetTypeToken(baseType).Token;
|
||||||
|
}
|
||||||
|
if (interfaces != null)
|
||||||
|
{
|
||||||
|
foreach (Type interfaceType in interfaces)
|
||||||
|
{
|
||||||
|
InterfaceImplTable.Record rec = new InterfaceImplTable.Record();
|
||||||
|
rec.Class = token;
|
||||||
|
rec.Interface = this.ModuleBuilder.GetTypeToken(interfaceType).Token;
|
||||||
|
this.ModuleBuilder.InterfaceImpl.AddRecord(rec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new BakedType(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void PopulatePropertyAndEventTables()
|
||||||
|
{
|
||||||
if (properties != null)
|
if (properties != null)
|
||||||
{
|
{
|
||||||
PropertyMapTable.Record rec = new PropertyMapTable.Record();
|
PropertyMapTable.Record rec = new PropertyMapTable.Record();
|
||||||
|
@ -680,25 +703,6 @@ namespace IKVM.Reflection.Emit
|
||||||
eb.Bake();
|
eb.Bake();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (declarativeSecurity != null)
|
|
||||||
{
|
|
||||||
this.ModuleBuilder.AddDeclarativeSecurity(token, declarativeSecurity);
|
|
||||||
}
|
|
||||||
if (baseType != null)
|
|
||||||
{
|
|
||||||
extends = this.ModuleBuilder.GetTypeToken(baseType).Token;
|
|
||||||
}
|
|
||||||
if (interfaces != null)
|
|
||||||
{
|
|
||||||
foreach (Type interfaceType in interfaces)
|
|
||||||
{
|
|
||||||
InterfaceImplTable.Record rec = new InterfaceImplTable.Record();
|
|
||||||
rec.Class = token;
|
|
||||||
rec.Interface = this.ModuleBuilder.GetTypeToken(interfaceType).Token;
|
|
||||||
this.ModuleBuilder.InterfaceImpl.AddRecord(rec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new BakedType(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Type BaseType
|
public override Type BaseType
|
||||||
|
|
Загрузка…
Ссылка в новой задаче