Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

201 lines
6.1 KiB
C#

//
// PInvokeInfo.cs
//
// Author:
// Jb Evain (jbevain@gmail.com)
//
// (C) 2005 Jb Evain
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
namespace Mono.Cecil {
internal sealed class PInvokeInfo : IReflectionVisitable {
MethodDefinition m_meth;
PInvokeAttributes m_attributes;
string m_entryPoint;
ModuleReference m_module;
public MethodDefinition Method {
get { return m_meth; }
}
public PInvokeAttributes Attributes {
get { return m_attributes; }
set { m_attributes = value; }
}
public string EntryPoint {
get { return m_entryPoint; }
set { m_entryPoint = value; }
}
public ModuleReference Module {
get { return m_module; }
set { m_module = value; }
}
#region PInvokeAttributes
public bool IsNoMangle {
get { return (m_attributes & PInvokeAttributes.NoMangle) != 0; }
set {
if (value)
m_attributes |= PInvokeAttributes.NoMangle;
else
m_attributes &= ~PInvokeAttributes.NoMangle;
}
}
public bool IsCharSetNotSpec {
get { return (m_attributes & PInvokeAttributes.CharSetMask) == PInvokeAttributes.CharSetNotSpec; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CharSetMask;
m_attributes |= PInvokeAttributes.CharSetNotSpec;
} else
m_attributes &= ~(PInvokeAttributes.CharSetMask & PInvokeAttributes.CharSetNotSpec);
}
}
public bool IsCharSetAnsi {
get { return (m_attributes & PInvokeAttributes.CharSetMask) == PInvokeAttributes.CharSetAnsi; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CharSetMask;
m_attributes |= PInvokeAttributes.CharSetAnsi;
} else
m_attributes &= ~(PInvokeAttributes.CharSetMask & PInvokeAttributes.CharSetAnsi);
}
}
public bool IsCharSetUnicode {
get { return (m_attributes & PInvokeAttributes.CharSetMask) == PInvokeAttributes.CharSetUnicode; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CharSetMask;
m_attributes |= PInvokeAttributes.CharSetUnicode;
} else
m_attributes &= ~(PInvokeAttributes.CharSetMask & PInvokeAttributes.CharSetUnicode);
}
}
public bool IsCharSetAuto {
get { return (m_attributes & PInvokeAttributes.CharSetMask) == PInvokeAttributes.CharSetAuto; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CharSetMask;
m_attributes |= PInvokeAttributes.CharSetAuto;
} else
m_attributes &= ~(PInvokeAttributes.CharSetMask & PInvokeAttributes.CharSetAuto);
}
}
public bool SupportsLastError {
get { return (m_attributes & PInvokeAttributes.CharSetMask) == PInvokeAttributes.SupportsLastError; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CharSetMask;
m_attributes |= PInvokeAttributes.SupportsLastError;
} else
m_attributes &= ~(PInvokeAttributes.CharSetMask & PInvokeAttributes.SupportsLastError);
}
}
public bool IsCallConvWinapi {
get { return (m_attributes & PInvokeAttributes.CallConvMask) == PInvokeAttributes.CallConvWinapi; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CallConvMask;
m_attributes |= PInvokeAttributes.CallConvWinapi;
} else
m_attributes &= ~(PInvokeAttributes.CallConvMask & PInvokeAttributes.CallConvWinapi);
}
}
public bool IsCallConvCdecl {
get { return (m_attributes & PInvokeAttributes.CallConvMask) == PInvokeAttributes.CallConvCdecl; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CallConvMask;
m_attributes |= PInvokeAttributes.CallConvCdecl;
} else
m_attributes &= ~(PInvokeAttributes.CallConvMask & PInvokeAttributes.CallConvCdecl);
}
}
public bool IsCallConvStdCall {
get { return (m_attributes & PInvokeAttributes.CallConvMask) == PInvokeAttributes.CallConvStdCall; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CallConvMask;
m_attributes |= PInvokeAttributes.CallConvStdCall;
} else
m_attributes &= ~(PInvokeAttributes.CallConvMask & PInvokeAttributes.CallConvStdCall);
}
}
public bool IsCallConvThiscall {
get { return (m_attributes & PInvokeAttributes.CallConvMask) == PInvokeAttributes.CallConvThiscall; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CallConvMask;
m_attributes |= PInvokeAttributes.CallConvThiscall;
} else
m_attributes &= ~(PInvokeAttributes.CallConvMask & PInvokeAttributes.CallConvThiscall);
}
}
public bool IsCallConvFastcall {
get { return (m_attributes & PInvokeAttributes.CallConvMask) == PInvokeAttributes.CallConvFastcall; }
set {
if (value) {
m_attributes &= ~PInvokeAttributes.CallConvMask;
m_attributes |= PInvokeAttributes.CallConvFastcall;
} else
m_attributes &= ~(PInvokeAttributes.CallConvMask & PInvokeAttributes.CallConvFastcall);
}
}
#endregion
public PInvokeInfo (MethodDefinition meth)
{
m_meth = meth;
}
public PInvokeInfo (MethodDefinition meth, PInvokeAttributes attrs,
string entryPoint, ModuleReference mod) : this (meth)
{
m_attributes = attrs;
m_entryPoint = entryPoint;
m_module = mod;
}
public void Accept (IReflectionVisitor visitor)
{
visitor.VisitPInvokeInfo (this);
}
}
}