singrdk/base/Windows/mkmsil/msil/MetaDataConstant.cs

123 lines
3.6 KiB
C#

//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
using System;
using System.IO;
namespace Bartok.MSIL
{
public class MetaDataConstant: MetaDataObject {
// Constructor Methods
internal MetaDataConstant(ElementTypes type, int parentIndex,
byte[] valueBuffer) {
this.type = type;
this.parentIndex = parentIndex;
this.valueBuffer = valueBuffer;
}
// This is technically not a constructor method, but it is meant to
// be used to set up the object
internal void resolveReferences(MetaDataLoader loader) {
this.parent = loader.getHasConstant(this.parentIndex);
}
// Access Methods
public ElementTypes Type {
get {
return this.type;
}
}
// May be one of MetaData{Field,ParamDef,Property}
public MetaDataObject Parent {
get {
return this.parent;
}
}
public byte[] ValueBuffer {
get {
return this.valueBuffer;
}
}
public Object Value {
get {
return ValueFromBuffer(this.Type, this.ValueBuffer);
}
}
private static Object ValueFromBuffer(ElementTypes type, byte[] buffer) {
MemoryStream memoryStream = new MemoryStream(buffer);
BinaryReader binaryReader =
new BinaryReader(memoryStream, System.Text.Encoding.Unicode);
switch (type) {
case ElementTypes.BOOLEAN:
return binaryReader.ReadBoolean();
case ElementTypes.CHAR:
return (char) binaryReader.ReadUInt16();
case ElementTypes.I1:
return binaryReader.ReadSByte();
case ElementTypes.U1:
return binaryReader.ReadByte();
case ElementTypes.I2:
return binaryReader.ReadInt16();
case ElementTypes.U2:
return binaryReader.ReadUInt16();
case ElementTypes.I4:
return binaryReader.ReadInt32();
case ElementTypes.U4:
return binaryReader.ReadUInt32();
case ElementTypes.I8:
return binaryReader.ReadInt64();
case ElementTypes.U8:
return binaryReader.ReadUInt64();
case ElementTypes.R4:
return binaryReader.ReadSingle();
case ElementTypes.R8:
return binaryReader.ReadDouble();
case ElementTypes.STRING: {
char[] chars =
binaryReader.ReadChars(buffer.Length/2);
return new String(chars);
}
default:
throw new MetaDataLoader.IllegalMetaDataFormatException("Unknown type of constant: "+type);
}
}
// Debug Methods
public override String ToString() {
System.Text.StringBuilder sb =
new System.Text.StringBuilder("MetaDataConstant(");
sb.Append(this.type);
sb.Append(",");
if (this.parent == null) {
sb.Append(this.parentIndex);
}
else {
sb.Append(this.parent);
}
sb.Append(",");
sb.Append(this.Value);
sb.Append(")");
return sb.ToString();
}
// State
private readonly ElementTypes type;
private readonly int parentIndex;
private MetaDataObject parent;
private readonly byte[] valueBuffer;
}
}