123 lines
3.6 KiB
C#
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;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|