}\r
return 0;\r
}\r
- \r
+
}\r
/**************************************************************************/ \r
\r
fields.Add(field);\r
return field;\r
}\r
-\r
+
+ public void SetFieldOrder (ArrayList fields)
+ {
+ this.fields = fields;
+ }
+
/// <summary>\r
/// Add a method to this class\r
/// </summary>\r
md.AddToTable(MDTable.PropertyMap,new MapElem(this,\r
((Property)properties[0]).Row,MDTable.Property));\r
}\r
- DoCustomAttributes (md);\r
// Console.WriteLine("End of building tables");\r
done = true;\r
}\r
\r
internal sealed override void BuildTables(MetaData md) {\r
BinaryWriter bw = new BinaryWriter(new MemoryStream());\r
- bw.Write((ushort)1);\r
+ bw.Write(byteVal);\r
md.AddToTable(MDTable.CustomAttribute, this);\r
MemoryStream str = (MemoryStream)bw.BaseStream;\r
valIx = md.AddToBlobHeap(str.ToArray());\r
}\r
\r
private void WriteSDataSection() {\r
+ long size = sdata.Size ();
+ long start = BaseStream.Position;
for (int i=0; i < data.Count; i++) {\r
((DataConstant)data[i]).Write(this);\r
- }\r
+ }
+ while (BaseStream.Position < (start + size))
+ Write ((byte) 0);
}\r
\r
private void WriteRsrcSection() {\r
public MSCorLib mscorlib;\r
private TypeSpec[] systemTypeSpecs = new TypeSpec[PrimitiveType.NumSystemTypes];\r
long mdStart;\r
-\r
+ private ArrayList cattr_list;
+
internal MetaData(FileImage file) {\r
// tilde = new MetaDataStream(tildeName,false,0);\r
this.file = file;\r
return blob.Add(val,true);\r
}\r
\r
-\r
+ internal void AddCustomAttribute (CustomAttribute cattr)
+ {
+ if (cattr_list == null)
+ cattr_list = new ArrayList ();
+ cattr_list.Add (cattr);
+ }
+
private ArrayList GetTable(MDTable tableIx) {\r
int tabIx = (int)tableIx;\r
if (metaDataTables[tabIx] == null) {\r
BuildTable(metaDataTables[(int)MDTable.GenericParam]);\r
BuildTable(metaDataTables[(int)MDTable.MethodSpec]);\r
BuildTable(metaDataTables[(int)MDTable.GenericParamConstraint]);\r
- BuildTable(metaDataTables[(int)MDTable.CustomAttribute]);\r
+
+ if (cattr_list != null) {
+ foreach (CustomAttribute cattr in cattr_list)
+ cattr.BuildTables (this);
+ }
+
/* for (int i=0; i < metaDataTables.Length; i++) {\r
ArrayList table = metaDataTables[i];\r
if (table != null) {\r
}\r
}\r
*/\r
+
SetIndexSizes();\r
for (int i=1; i < numStreams; i++) {\r
streams[i].EndStream();\r
} \r
// customAttributes.Add(new CustomAttribute(this,ctorMeth,cVals));\r
}\r
-\r
- internal void DoCustomAttributes(MetaData md) {\r
- if (customAttributes != null) {\r
- for (int i=0; i < customAttributes.Count; i++) {\r
- CustomAttribute ca = (CustomAttribute)customAttributes[i];\r
- ca.BuildTables(md);\r
- }\r
- }\r
- }\r
-\r
+
internal uint Token() {\r
return (((uint)tabIx << 24) | row);\r
}\r
varArgSig.BuildTables(md);\r
}\r
}\r
- DoCustomAttributes (md);\r
// Console.WriteLine("method has " + numPars + " parameters");\r
done = true;\r
}\r
/// \r
public class MethPtrType : Type\r
{\r
-
+ bool varArgMeth;
Type retType;
Type [] parList;
Type [] optParList;
this.retType = retType;
callConv = callconv;
parList = pars;
+ this.varArgMeth = varArgMeth;
if (parList != null) numPars = (uint)parList.Length;
if (varArgMeth) {
optParList = optPars;
for (int i=0; i < numPars; i++) {
parList[i].TypeSig (sig);
}
- if (numOptPars > 0) {
+ if (varArgMeth) {
sig.WriteByte (0x41); // Write the sentinel
for (int i=0; i < numOptPars; i++) {
optParList[i].TypeSig (sig);
metaData.AddToTable(MDTable.ManifestResource,mr);\r
//mr.FixName(metaData);\r
}\r
-\r
+
+ public void AddCustomAttribute (Method meth, byte [] data, MetaDataElement element)
+ {
+ metaData.AddCustomAttribute (new CustomAttribute (element, meth, data));
+ }
+
/// <summary>\r
/// Write out the PEFile (the "bake" function)\r
/// </summary>\r