109 lines
3.6 KiB
C#
109 lines
3.6 KiB
C#
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
|
||
|
namespace Bartok.MSIL
|
||
|
{
|
||
|
|
||
|
// Information about unmanaged fields and methods that may
|
||
|
// be called from managed code.
|
||
|
public class MetaDataImplMap: MetaDataObject {
|
||
|
|
||
|
// Constructor Methods
|
||
|
|
||
|
internal MetaDataImplMap(short flags, int memberForwardedIndex,
|
||
|
String importName, int importScopeIndex) {
|
||
|
this.flags = flags;
|
||
|
this.memberForwardedIndex = memberForwardedIndex;
|
||
|
this.importName = importName;
|
||
|
this.importScopeIndex = importScopeIndex;
|
||
|
}
|
||
|
|
||
|
// 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.memberForwarded =
|
||
|
loader.getMemberForwarded(this.memberForwardedIndex);
|
||
|
this.importScope = loader.getModuleRef(this.importScopeIndex);
|
||
|
}
|
||
|
|
||
|
// Access Methods
|
||
|
|
||
|
// Bitmask described by PInvokeAttributes
|
||
|
public short Flags {
|
||
|
get {
|
||
|
return this.flags;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// The metadata object that names the unmanaged field or method
|
||
|
// Returns one of MetaData{Field,Method}
|
||
|
public MetaDataObject MemberForwarded {
|
||
|
get {
|
||
|
return this.memberForwarded;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public String ImportName {
|
||
|
get {
|
||
|
return this.importName;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public MetaDataModuleRef ImportScope {
|
||
|
get {
|
||
|
return this.importScope;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Debug Methods
|
||
|
|
||
|
public override String ToString() {
|
||
|
if (this.memberForwarded == null || this.importScope == null) {
|
||
|
return ("MetaDataImplMap("+this.flags.ToString("x")+","+
|
||
|
this.memberForwardedIndex+","+this.importName+","+
|
||
|
this.importScopeIndex+")");
|
||
|
}
|
||
|
else {
|
||
|
return ("MetaDataImplMap("+this.flags.ToString("x")+","+
|
||
|
this.memberForwarded+","+this.importName+","+
|
||
|
this.importScope+")");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// State
|
||
|
|
||
|
private readonly short flags;
|
||
|
private readonly int memberForwardedIndex;
|
||
|
private MetaDataObject memberForwarded;
|
||
|
private readonly String importName;
|
||
|
private readonly int importScopeIndex;
|
||
|
private MetaDataModuleRef importScope;
|
||
|
|
||
|
// Internal Classes
|
||
|
|
||
|
// Section 22.1.5 of ECMA spec, Section II
|
||
|
public enum PInvokeAttributes {
|
||
|
NoMangle = 0x0001, // Pinvoke is to use the member name as specified.
|
||
|
// Character set flags
|
||
|
CharSetMask = 0x0006, // Use this mask to retrieve the CharSet information.
|
||
|
CharSetNotSpec = 0x0000,
|
||
|
CharSetAnsi = 0x0002,
|
||
|
CharSetUnicode = 0x0004,
|
||
|
CharSetAuto = 0x0006,
|
||
|
SupportsLastError = 0x0040, // Information about target function. Not relevant for fields.
|
||
|
// None of the calling convention flags is relevant for fields.
|
||
|
CallConvMask = 0x0700,
|
||
|
CallConvWinapi = 0x0100, // Pinvoke will use native callconv appropriate to target windows platform.
|
||
|
CallConvCdecl = 0x0200,
|
||
|
CallConvStdcall = 0x0300,
|
||
|
CallConvThiscall = 0x0400, // In M9, pinvoke will raise exception.
|
||
|
CallConvFastcall = 0x0500
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|