本文整理汇总了C#中IType.IsStructureType方法的典型用法代码示例。如果您正苦于以下问题:C# IType.IsStructureType方法的具体用法?C# IType.IsStructureType怎么用?C# IType.IsStructureType使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IType
的用法示例。
在下文中一共展示了IType.IsStructureType方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: WriteCast
/// <summary>
/// </summary>
/// <param name="llvmWriter">
/// </param>
/// <param name="opCode">
/// </param>
/// <param name="fromResult">
/// </param>
/// <param name="toType">
/// </param>
/// <param name="throwExceptionIfNull">
/// </param>
/// <returns>
/// </returns>
public static bool WriteCast(
this LlvmWriter llvmWriter,
OpCodePart opCode,
FullyDefinedReference fromResult,
IType toType,
bool throwExceptionIfNull = false)
{
var writer = llvmWriter.Output;
var bareType = !fromResult.Type.IsArray
? fromResult.Type.ToBareType()
: fromResult.Type;
if (toType.IsInterface && !(fromResult is ConstValue))
{
if (bareType.GetAllInterfaces().Contains(toType))
{
opCode.Result = fromResult;
llvmWriter.WriteInterfaceAccess(writer, opCode, bareType, toType);
}
else
{
llvmWriter.WriteDynamicCast(writer, opCode, fromResult, toType, true, throwExceptionIfNull);
}
}
else if (fromResult.Type.IntTypeBitSize() == LlvmWriter.PointerSize * 8 &&
(toType.IsPointer || toType.IsByRef))
{
LlvmConvert(llvmWriter, opCode, string.Empty, string.Empty, toType, true);
}
else if (fromResult.Type.IsArray
|| (fromResult.Type.IsPointer && bareType.TypeEquals(llvmWriter.System.System_Void))
|| toType.IsArray
|| toType.IsPointer
|| toType.IsByRef
|| bareType.IsDerivedFrom(toType)
|| (fromResult is ConstValue))
{
llvmWriter.WriteSetResultNumber(opCode, toType);
writer.Write("bitcast ");
fromResult.Type.WriteTypePrefix(llvmWriter);
writer.Write(' ');
llvmWriter.WriteResult(fromResult);
writer.Write(" to ");
toType.WriteTypePrefix(llvmWriter, toType.IsStructureType());
}
else
{
Debug.Assert(fromResult.Type.IntTypeBitSize() == 0);
llvmWriter.WriteDynamicCast(writer, opCode, fromResult, toType, true, throwExceptionIfNull);
}
writer.WriteLine(string.Empty);
return true;
}
示例2: GetCalculationPartOfStringAllocationSizeMethodBody
private static void GetCalculationPartOfStringAllocationSizeMethodBody(
ITypeResolver typeResolver,
IType stringType,
IType charType,
out object[] code,
out IList<object> tokenResolutions,
out IList<IType> locals,
out IList<IParameter> parameters)
{
var codeList = new List<object>();
// add element size
var elementSize = charType.GetTypeSize(typeResolver, true);
codeList.AppendLoadInt(elementSize);
// load length
codeList.AppendLoadArgument(0);
codeList.Add(Code.Mul);
var arrayTypeSizeWithoutArrayData = stringType.GetTypeSize(typeResolver);
codeList.AppendLoadInt(arrayTypeSizeWithoutArrayData);
codeList.Add(Code.Add);
// calculate alignment
codeList.Add(Code.Dup);
var alignForType = Math.Max(LlvmWriter.PointerSize, !charType.IsStructureType() ? elementSize : LlvmWriter.PointerSize);
codeList.AppendLoadInt(alignForType - 1);
codeList.Add(Code.Add);
codeList.AppendLoadInt(~(alignForType - 1));
codeList.Add(Code.And);
// locals
locals = new List<IType>();
// tokens
tokenResolutions = new List<object>();
// parameters
parameters = GetParameters(typeResolver);
code = codeList.ToArray();
}
示例3: AddStructType
/// <summary>
/// </summary>
/// <param name="type">
/// </param>
private void AddStructType(IType type)
{
if (this.usedStructTypes == null || type == null || !type.IsStructureType())
{
return;
}
this.usedStructTypes.Add(type);
}
示例4: WriteUnboxObject
/// <summary>
/// </summary>
/// <param name="llvmWriter">
/// </param>
/// <param name="opCode">
/// </param>
/// <param name="declaringType">
/// </param>
/// <returns>
/// </returns>
public static bool WriteUnboxObject(this LlvmWriter llvmWriter, OpCodePart opCode, IType declaringType)
{
var writer = llvmWriter.Output;
var isStruct = declaringType.IsStructureType();
writer.WriteLine("; Unboxing");
writer.WriteLine(string.Empty);
llvmWriter.CheckIfExternalDeclarationIsRequired(declaringType);
writer.WriteLine("; Copy data");
if (!isStruct)
{
// write access to a field
if (!llvmWriter.WriteFieldAccess(
writer,
opCode,
declaringType.ToClass(),
declaringType.ToClass(),
0,
opCode.Result))
{
writer.WriteLine("; No data");
return false;
}
writer.WriteLine(string.Empty);
}
// load value from field
var memberAccessResultNumber = opCode.Result;
if (!isStruct)
{
opCode.Result = null;
}
llvmWriter.WriteLlvmLoad(opCode, memberAccessResultNumber.Type.ToNormal(), memberAccessResultNumber);
writer.WriteLine(string.Empty);
writer.WriteLine("; End of Copy data");
return true;
}
示例5: WriteGetHashCodeObjectForEnum
/// <summary>
/// </summary>
/// <param name="llvmWriter">
/// </param>
/// <param name="opCode">
/// </param>
/// <param name="declaringType">
/// </param>
public static void WriteGetHashCodeObjectForEnum(this LlvmWriter llvmWriter, OpCodePart opCode, IType declaringType)
{
var writer = llvmWriter.Output;
var isStruct = declaringType.IsStructureType();
writer.WriteLine("; Returning Hash Code");
writer.WriteLine(string.Empty);
llvmWriter.CheckIfExternalDeclarationIsRequired(declaringType);
writer.WriteLine("; Get data");
if (!isStruct)
{
// write access to a field
if (!llvmWriter.WriteFieldAccess(writer, opCode, declaringType.ToClass(), declaringType.ToClass(), 0, opCode.Result))
{
writer.WriteLine("; No data");
return;
}
writer.WriteLine(string.Empty);
}
else
{
Debug.Fail("Not implemented yet");
throw new NotImplementedException();
}
// load value from field
var memberAccessResultNumber = opCode.Result;
opCode.Result = null;
llvmWriter.WriteLlvmLoad(opCode, memberAccessResultNumber.Type.ToNormal(), memberAccessResultNumber);
writer.WriteLine(string.Empty);
if (opCode.Result.Type.IntTypeBitSize() != llvmWriter.ResolveType("System.Int32").IntTypeBitSize())
{
var storeResult = opCode.Result;
var retResult = llvmWriter.WriteSetResultNumber(opCode, llvmWriter.ResolveType("System.Int32"));
opCode.Result = storeResult;
llvmWriter.AdjustIntConvertableTypes(writer, opCode, llvmWriter.ResolveType("System.Int32"));
opCode.Result = retResult;
writer.WriteLine(string.Empty);
}
writer.WriteLine("; End of Getting data");
}
示例6: WriteFunctionCallVarArgument
private static void WriteFunctionCallVarArgument(this LlvmWriter llvmWriter, OpCodePart opArg, IType type)
{
var writer = llvmWriter.Output;
llvmWriter.CheckIfExternalDeclarationIsRequired(type);
type.WriteTypePrefix(llvmWriter, type.IsStructureType());
if (type.IsStructureType())
{
writer.Write(" byval align " + llvmWriter.ByValAlign);
}
writer.Write(' ');
llvmWriter.WriteResult(opArg);
}
示例7: WriteFunctionCallArguments
/// <summary>
/// </summary>
/// <param name="parameterInfos">
/// </param>
/// <param name="used">
/// </param>
/// <param name="isVirtual">
/// </param>
/// <param name="hasThis">
/// </param>
/// <param name="isCtor">
/// </param>
/// <param name="resultNumberForThis">
/// </param>
/// <param name="thisType">
/// </param>
/// <param name="resultNumberForReturn">
/// </param>
/// <param name="returnType">
/// </param>
/// <param name="llvmWriter">
/// </param>
public static void WriteFunctionCallArguments(
this IEnumerable<IParameter> parameterInfos,
OpCodePart[] used,
bool @isVirtual,
bool hasThis,
bool isCtor,
FullyDefinedReference resultNumberForThis,
IType thisType,
FullyDefinedReference resultNumberForReturn,
IType returnType,
LlvmWriter llvmWriter,
bool varArg)
{
var writer = llvmWriter.Output;
writer.Write("(");
var index = 0;
var returnIsStruct = returnType != null && returnType.IsStructureType();
var comaRequired = false;
// allocate space for structure if return type is structure
if (returnIsStruct)
{
returnType.WriteTypePrefix(llvmWriter, returnType.IsStructureType());
writer.Write(' ');
if (resultNumberForReturn != null)
{
llvmWriter.WriteResult(resultNumberForReturn);
}
comaRequired = true;
}
if (hasThis)
{
if (comaRequired)
{
writer.Write(", ");
}
thisType.ToClass().WriteTypePrefix(llvmWriter);
writer.Write(' ');
if (resultNumberForThis != null)
{
llvmWriter.WriteResult(resultNumberForThis);
}
else if (used != null && used.Length > 0)
{
llvmWriter.WriteResult(used[0].Result);
}
comaRequired = true;
}
llvmWriter.CheckIfExternalDeclarationIsRequired(returnType);
var argsContainsThisArg = used != null ? (used.Length - parameterInfos.Count()) > 0 : false;
var argShift = @isVirtual || (hasThis && !isCtor && argsContainsThisArg) ? 1 : 0;
// add parameters
foreach (var parameter in parameterInfos)
{
var effectiveIndex = index + argShift;
var usedItem = used[effectiveIndex];
if (comaRequired)
{
writer.Write(", ");
}
llvmWriter.WriteFunctionCallParameterArgument(usedItem, parameter);
comaRequired = true;
index++;
}
//.........这里部分代码省略.........