本文整理汇总了C#中Compiler.GetClosedClass方法的典型用法代码示例。如果您正苦于以下问题:C# Compiler.GetClosedClass方法的具体用法?C# Compiler.GetClosedClass怎么用?C# Compiler.GetClosedClass使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Compiler
的用法示例。
在下文中一共展示了Compiler.GetClosedClass方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GenerateMethod
public override RloMethod GenerateMethod(Compiler compiler, MethodInstantiationPath instantiationPath)
{
HighLocal[] locals = new HighLocal[0];
HighLocal[] args = new HighLocal[0];
HighLocal instanceLocal = new HighLocal(m_bt, HighLocal.ETypeOfType.Value);
Stack<HighField> fieldStack = new Stack<HighField>();
uint getHashCodeSlot = m_vtCache.GetGetHashCodeVTableSlot(compiler);
HighSsaRegister result = new HighSsaRegister(HighValueType.ValueValue, m_vtCache.GetSystemInt32Type(compiler), null);
MethodSignatureTag methodSignature = new MethodSignatureTag(0, m_vtCache.GetSystemInt32Type(compiler), new MethodSignatureParam[0]);
methodSignature = compiler.TagRepository.InternMethodSignature(methodSignature);
if (RecursiveFindHashableField(compiler, m_bt.ContainedType, fieldStack))
{
// Found a field that can be hashed
Queue<HighField> fieldQueue = new Queue<HighField>();
while (fieldStack.Count > 0)
fieldQueue.Enqueue(fieldStack.Pop());
HighSsaRegister thisRef = new HighSsaRegister(HighValueType.BoxedValue, m_bt.ContainedType, null);
HighSsaRegister thisPtr = new HighSsaRegister(HighValueType.ManagedPtr, m_bt.ContainedType, null);
HighCfgNodeHandle unboxHdl = new HighCfgNodeHandle();
HighCfgNodeHandle locateAndHashFieldHdl = new HighCfgNodeHandle();
{
List<HighInstruction> instrs = new List<HighInstruction>();
instrs.Add(new Rpa.Instructions.LoadLocalInstruction(null, thisRef, instanceLocal));
Rpa.Instructions.UnboxPtrInstruction unboxInstr = new Rpa.Instructions.UnboxPtrInstruction(null, thisPtr, thisRef);
unboxInstr.ContinuationEdge = new HighCfgEdge(unboxInstr, locateAndHashFieldHdl);
instrs.Add(unboxInstr);
unboxHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], instrs.ToArray());
}
HighSsaRegister hashablePtr = thisPtr;
List<HighInstruction> lahInstrs = new List<HighInstruction>();
while (fieldQueue.Count > 0)
{
HighField fld = fieldQueue.Dequeue();
HighSsaRegister nextFldPtr = new HighSsaRegister(HighValueType.ManagedPtr, fld.Type, null);
lahInstrs.Add(new Rpa.Instructions.PtrFieldInstruction(null, nextFldPtr, hashablePtr, fld.Name));
hashablePtr = nextFldPtr;
}
if (compiler.TypeIsValueType(hashablePtr.Type))
{
HighCfgNodeHandle returnResultHdl = new HighCfgNodeHandle();
CliClass cls = compiler.GetClosedClass((TypeSpecClassTag)hashablePtr.Type);
CliMethodIndex vtableHashCodeIndex = cls.VTable[getHashCodeSlot].MethodIndex;
if (vtableHashCodeIndex.Depth == 0)
{
HighMethod method = cls.Methods[vtableHashCodeIndex.Index];
Instructions.CallRloVirtualMethodInstruction callInstr = new Instructions.CallRloVirtualMethodInstruction(null, getHashCodeSlot, result, hashablePtr, new HighSsaRegister[0]);
callInstr.ContinuationEdge = new HighCfgEdge(callInstr, returnResultHdl);
lahInstrs.Add(callInstr);
}
else
{
// Base class GetHashCode, but field was found as hashable, which means it's POD
MethodDeclTag hashBytesDecl = m_vtCache.GetHashBytesDeclTag(compiler);
MethodSpecTag methodSpec = new MethodSpecTag(MethodSlotType.Static, new TypeSpecTag[] { hashablePtr.Type }, m_vtCache.GetClarityToolsType(compiler), hashBytesDecl);
methodSpec = compiler.TagRepository.InternMethodSpec(methodSpec);
MethodHandle methodHandle = compiler.InstantiateMethod(new MethodSpecMethodKey(methodSpec), instantiationPath);
Instructions.CallRloStaticMethodInstruction callInstr = new Instructions.CallRloStaticMethodInstruction(null, methodHandle, result, new HighSsaRegister[] { hashablePtr });
callInstr.ContinuationEdge = new HighCfgEdge(callInstr, returnResultHdl);
lahInstrs.Add(callInstr);
}
// Add return block
{
List<HighInstruction> rrInstrs = new List<HighInstruction>();
rrInstrs.Add(new Rpa.Instructions.ReturnValueInstruction(null, result));
returnResultHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], rrInstrs.ToArray());
}
}
else
{
HighCfgNodeHandle fldNullHdl = new HighCfgNodeHandle();
HighCfgNodeHandle callGetHashCodeHdl = new HighCfgNodeHandle();
HighCfgNodeHandle returnResultHdl = new HighCfgNodeHandle();
HighSsaRegister fldValue = new HighSsaRegister(HighValueType.ReferenceValue, hashablePtr.Type, null);
lahInstrs.Add(new Rpa.Instructions.LoadPtrInstruction(null, fldValue, hashablePtr));
lahInstrs.Add(new Rpa.Instructions.BranchRefNullInstruction(null, fldValue, fldNullHdl, callGetHashCodeHdl));
{
HighSsaRegister zeroConstant = new HighSsaRegister(HighValueType.ConstantValue, m_vtCache.GetSystemInt32Type(compiler), 0);
//.........这里部分代码省略.........
示例2: RecursiveFindHashableField
// Inspects a value for hashable fields. If the field is hashable, returns true with the stack containing
// the field descension.
private bool RecursiveFindHashableField(Compiler compiler, TypeSpecTag fieldSpec, Stack<HighField> fieldStack)
{
// If the field is a reference type, this is OK
if (!compiler.TypeIsValueType(fieldSpec))
return true;
CliClass cls = compiler.GetClosedClass((TypeSpecClassTag)fieldSpec);
if (cls.InstanceFields.Length == 0)
{
TypeNameTag typeName = cls.TypeName;
if (typeName.AssemblyName == "mscorlib" && typeName.ContainerType == null && typeName.TypeNamespace == "System" && typeName.NumGenericParameters == 0)
{
string tn = typeName.TypeName;
if (tn == "Boolean" || tn == "Char"
|| tn == "SByte" || tn == "Int16" || tn == "Int32" || tn == "Int64" || tn == "IntPtr"
|| tn == "Byte" || tn == "UInt16" || tn == "UInt32" || tn == "UInt64" || tn == "UIntPtr")
return true;
}
// Empty structs that aren't a built-in POD type can't be hashed
return false;
}
if ((m_vtCache.GetClassPodFlags(compiler, cls) & VTableGenerationCache.PodFlags.HashCode) != VTableGenerationCache.PodFlags.None)
return true;
// See if the class has a GetHashCode override
uint vtSlot = m_vtCache.GetGetHashCodeVTableSlot(compiler);
if (cls.VTable[vtSlot].MethodIndex.Depth == 0)
return true;
foreach (HighField fld in cls.InstanceFields)
{
fieldStack.Push(fld);
if (RecursiveFindHashableField(compiler, fld.Type, fieldStack))
return true;
fieldStack.Pop();
}
return false;
}
示例3: GenerateMethod
public override RloMethod GenerateMethod(Compiler compiler, MethodInstantiationPath instantiationPath)
{
TypeSpecDelegateTag delegateType = m_dt;
TypeSpecClassTag delegateClassType = delegateType.DelegateType;
MethodSpecTag methodSpec = delegateType.MethodSpec;
TypeSpecClassTag targetType = methodSpec.DeclaringClass;
CliClass delegateCls = compiler.GetClosedClass(delegateClassType);
TypeNameTag delegateTypeName = delegateCls.TypeName;
HighTypeDef delegateTypeDef = compiler.GetTypeDef(delegateTypeName);
if (delegateTypeDef.Semantics != TypeSemantics.Delegate)
throw new RpaCompileException("Delegate-bound class is not a delegate");
HighTypeDef targetTypeDef = compiler.GetTypeDef(targetType.TypeName);
CliClass targetCls = null;
CliInterface targetIfc = null;
bool isInterface;
switch (targetTypeDef.Semantics)
{
case TypeSemantics.Class:
case TypeSemantics.Delegate:
case TypeSemantics.Enum:
case TypeSemantics.Struct:
isInterface = false;
targetCls = compiler.GetClosedClass(targetType);
break;
case TypeSemantics.Interface:
isInterface = true;
targetIfc = compiler.GetClosedInterface(targetType);
break;
default:
throw new ArgumentException();
}
MethodSignatureTag declSignature = delegateTypeDef.DelegateSignature;
MethodDeclTag invokeDeclTag = new MethodDeclTag("Invoke", declSignature, delegateTypeName);
invokeDeclTag = compiler.TagRepository.InternMethodDeclTag(invokeDeclTag);
uint vtableSlotIndex = delegateCls.DeclTagToVTableSlot[invokeDeclTag];
CliVtableSlot vtableSlot = delegateCls.VTable[vtableSlotIndex];
MethodSignatureTag delegateMethodSignature = vtableSlot.MethodSignature;
MethodSignatureTag targetMethodSignature;
switch (methodSpec.MethodSlotType)
{
case MethodSlotType.Instance:
case MethodSlotType.Static:
{
if (isInterface)
throw new RpaCompileException("Wrong method spec type for interface");
HighMethod method = targetCls.Methods[targetCls.DeclTagToMethod[methodSpec.MethodDecl]];
targetMethodSignature = method.MethodSignature.Instantiate(compiler.TagRepository, methodSpec.DeclaringClass.ArgTypes, methodSpec.GenericParameters);
}
break;
case MethodSlotType.Virtual:
{
if (isInterface)
{
HighClassVtableSlot vtSlot = targetIfc.Slots[targetIfc.CliSlotForSlotTag(methodSpec.MethodDecl)];
targetMethodSignature = vtSlot.Signature.Instantiate(compiler.TagRepository, methodSpec.DeclaringClass.ArgTypes, methodSpec.GenericParameters);
}
else
{
CliVtableSlot calledVtableSlot = targetCls.VTable[targetCls.DeclTagToVTableSlot[methodSpec.MethodDecl]];
if (calledVtableSlot.MethodSignature.NumGenericParameters > 0)
throw new RpaCompileException("Can't generate delegate thunk to virtual generic");
targetMethodSignature = calledVtableSlot.MethodSignature.Instantiate(compiler.TagRepository, methodSpec.DeclaringClass.ArgTypes, methodSpec.GenericParameters);
}
}
break;
default:
throw new Exception();
}
List<HighInstruction> instrs = new List<HighInstruction>();
HighLocal thisLocal = new HighLocal(m_dt, HighLocal.ETypeOfType.Value);
HighLocal[] locals = new HighLocal[0];
List<HighLocal> args = new List<HighLocal>();
int numParams = delegateMethodSignature.ParamTypes.Length;
if (numParams != targetMethodSignature.ParamTypes.Length)
throw new RpaCompileException("Delegate parameter count mismatch");
List<HighSsaRegister> convertedParameters = new List<HighSsaRegister>();
for (int i = 0; i < numParams; i++)
{
MethodSignatureParam delegateSigParam = delegateMethodSignature.ParamTypes[i];
MethodSignatureParam targetSigParam = targetMethodSignature.ParamTypes[i];
//.........这里部分代码省略.........
示例4: GenerateMethod
public override RloMethod GenerateMethod(Compiler compiler, MethodInstantiationPath instantiationPath)
{
TypeSpecClassTag delegateClassType = m_dt;
CliClass delegateCls = compiler.GetClosedClass(delegateClassType);
TypeNameTag delegateTypeName = delegateCls.TypeName;
HighTypeDef delegateTypeDef = compiler.GetTypeDef(delegateTypeName);
if (delegateTypeDef.Semantics != TypeSemantics.Delegate)
throw new RpaCompileException("Delegate-bound class is not a delegate");
MethodSignatureTag declSignature = delegateTypeDef.DelegateSignature;
MethodDeclTag invokeDeclTag = new MethodDeclTag("Invoke", declSignature, delegateTypeName);
invokeDeclTag = compiler.TagRepository.InternMethodDeclTag(invokeDeclTag);
uint vtableSlotIndex = delegateCls.DeclTagToVTableSlot[invokeDeclTag];
CliVtableSlot vtableSlot = delegateCls.VTable[vtableSlotIndex];
MethodSignatureTag delegateMethodSignature = vtableSlot.MethodSignature;
TypeSpecMulticastDelegateTag mdType = new TypeSpecMulticastDelegateTag(m_dt);
mdType = (TypeSpecMulticastDelegateTag)compiler.TagRepository.InternTypeSpec(mdType);
List<HighSsaRegister> loadedParams = new List<HighSsaRegister>();
HighLocal thisLocal = new HighLocal(mdType, HighLocal.ETypeOfType.Value);
List<HighLocal> args = new List<HighLocal>();
HighSsaRegister thisReg = new HighSsaRegister(HighValueType.ReferenceValue, mdType, null);
List<HighInstruction> entryInstrs = new List<HighInstruction>();
entryInstrs.Add(new Rpa.Instructions.LoadLocalInstruction(null, thisReg, thisLocal));
foreach (MethodSignatureParam param in delegateMethodSignature.ParamTypes)
{
switch (param.TypeOfType.Value)
{
case MethodSignatureParamTypeOfType.Values.ByRef:
{
HighSsaRegister paramSsa = new HighSsaRegister(HighValueType.ManagedPtr, param.Type, null);
HighLocal local = new HighLocal(param.Type, HighLocal.ETypeOfType.ByRef);
args.Add(local);
entryInstrs.Add(new Rpa.Instructions.LoadLocalInstruction(null, paramSsa, local));
loadedParams.Add(paramSsa);
}
break;
case MethodSignatureParamTypeOfType.Values.Value:
{
bool isValueType = compiler.TypeIsValueType(param.Type);
HighSsaRegister paramSsa = new HighSsaRegister(isValueType ? HighValueType.ValueValue : HighValueType.ReferenceValue, param.Type, null);
HighLocal local = new HighLocal(param.Type, HighLocal.ETypeOfType.Value);
args.Add(local);
entryInstrs.Add(new Rpa.Instructions.LoadLocalInstruction(null, paramSsa, local));
loadedParams.Add(paramSsa);
}
break;
case MethodSignatureParamTypeOfType.Values.TypedByRef:
throw new NotImplementedException();
default:
throw new Exception();
}
}
HighSsaRegister returnValue = null;
if (!(delegateMethodSignature.RetType is TypeSpecVoidTag))
{
bool isValueType = compiler.TypeIsValueType(delegateMethodSignature.RetType);
returnValue = new HighSsaRegister(isValueType ? HighValueType.ValueValue : HighValueType.ReferenceValue, delegateMethodSignature.RetType, null);
}
TypeSpecClassTag nativeUIntType = m_vtCache.GetSystemUIntPtrType(compiler);
HighSsaRegister numDelegatesValue = new HighSsaRegister(HighValueType.ValueValue, nativeUIntType, null);
HighSsaRegister zeroNativeUIntConstant = new HighSsaRegister(HighValueType.ConstantValue, nativeUIntType, (ulong)0);
HighCfgNodeHandle entryHdl = new HighCfgNodeHandle();
HighCfgNodeHandle loopCallHdl = new HighCfgNodeHandle();
HighCfgNodeHandle loopIncrementHdl = new HighCfgNodeHandle();
HighCfgNodeHandle returnHdl = new HighCfgNodeHandle();
HighSsaRegister postIncrementReg = new HighSsaRegister(HighValueType.ValueValue, nativeUIntType, null);
entryInstrs.Add(new Instructions.GetMulticastDelegateInvocationCountInstruction(null, numDelegatesValue, thisReg));
entryInstrs.Add(new Rpa.Instructions.BranchInstruction(null, loopCallHdl));
entryHdl.Value = new HighCfgNode(entryInstrs.ToArray());
HighSsaRegister currentCountReg = new HighSsaRegister(HighValueType.ValueValue, nativeUIntType, null);
{
List<HighInstruction> instrs = new List<HighInstruction>();
HighSsaRegister delegateValue = new HighSsaRegister(HighValueType.ReferenceValue, m_dt, null);
HighInstruction callInstr = new Instructions.CallRloVirtualMethodInstruction(null, vtableSlotIndex, returnValue, thisReg, loadedParams.ToArray());
callInstr.ContinuationEdge = new HighCfgEdge(callInstr, loopIncrementHdl);
instrs.Add(callInstr);
HighPhiLink[] loopLinks = new HighPhiLink[] {
new HighPhiLink(entryHdl, zeroNativeUIntConstant),
//.........这里部分代码省略.........
示例5: GenerateMethod
public override RloMethod GenerateMethod(Compiler compiler, MethodInstantiationPath instantiationPath)
{
VTableGenerationCache vtCache = m_vtCache;
HighTypeDef typeDef = compiler.GetTypeDef(m_bt.ContainedType.TypeName);
switch (typeDef.Semantics)
{
case TypeSemantics.Enum:
case TypeSemantics.Struct:
break;
default:
throw new ArgumentException("Unknown method type");
}
CliClass cls = compiler.GetClosedClass(m_bt.ContainedType);
HighLocal instanceLocal = new HighLocal(m_bt, HighLocal.ETypeOfType.Value);
HighLocal[] args = new HighLocal[] { new HighLocal(vtCache.GetSystemObjectType(compiler), HighLocal.ETypeOfType.Value) };
HighLocal[] locals = new HighLocal[0];
HighCfgNodeHandle returnFalseHdl = new HighCfgNodeHandle();
HighCfgNodeHandle entryHdl = new HighCfgNodeHandle();
HighCfgNodeHandle getOtherTypeHdl = new HighCfgNodeHandle();
HighCfgNodeHandle checkTypeHdl = new HighCfgNodeHandle();
HighCfgNodeHandle unboxThisHdl = new HighCfgNodeHandle();
HighCfgNodeHandle unboxOtherHdl = new HighCfgNodeHandle();
HighCfgNodeHandle nextFieldCheckHdl = new HighCfgNodeHandle();
HighSsaRegister thisRef = new HighSsaRegister(HighValueType.ReferenceValue, vtCache.GetSystemObjectType(compiler), null);
HighSsaRegister otherRef = new HighSsaRegister(HighValueType.ReferenceValue, vtCache.GetSystemObjectType(compiler), null);
HighSsaRegister thisType = new HighSsaRegister(HighValueType.ReferenceValue, vtCache.GetSystemTypeType(compiler), null);
HighSsaRegister otherType = new HighSsaRegister(HighValueType.ReferenceValue, vtCache.GetSystemTypeType(compiler), null);
HighSsaRegister unboxedThisPtr = new HighSsaRegister(HighValueType.ManagedPtr, m_bt.ContainedType, null);
HighSsaRegister unboxedOtherPtr = new HighSsaRegister(HighValueType.ManagedPtr, m_bt.ContainedType, null);
TypeSpecClassTag boolType = vtCache.GetSystemBoolType(compiler);
{
List<HighInstruction> instrs = new List<HighInstruction>();
instrs.Add(new Rpa.Instructions.LoadLocalInstruction(null, thisRef, instanceLocal));
instrs.Add(new Rpa.Instructions.LoadLocalInstruction(null, otherRef, args[0]));
instrs.Add(new Rpa.Instructions.BranchRefNullInstruction(null, otherRef, returnFalseHdl, getOtherTypeHdl));
entryHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], instrs.ToArray());
}
{
List<HighInstruction> instrs = new List<HighInstruction>();
Instructions.CallRloInstanceMethodInstruction callInstr = new Instructions.CallRloInstanceMethodInstruction(null, vtCache.GetSystemObjectGetType(compiler), otherType, otherRef, new HighSsaRegister[0]);
callInstr.ContinuationEdge = new HighCfgEdge(callInstr, checkTypeHdl);
instrs.Add(callInstr);
getOtherTypeHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], instrs.ToArray());
}
{
List<HighInstruction> instrs = new List<HighInstruction>();
instrs.Add(new Rpa.Instructions.GetTypeInfoInstruction(null, thisType, m_bt.ContainedType));
instrs.Add(new Rpa.Instructions.BranchCompareRefsInstruction(null, thisType, otherType, unboxThisHdl, returnFalseHdl));
checkTypeHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], instrs.ToArray());
}
{
List<HighInstruction> instrs = new List<HighInstruction>();
Rpa.Instructions.UnboxPtrInstruction unboxInstr = new Rpa.Instructions.UnboxPtrInstruction(null, unboxedThisPtr, thisRef);
unboxInstr.ContinuationEdge = new HighCfgEdge(unboxInstr, unboxOtherHdl);
instrs.Add(unboxInstr);
unboxThisHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], instrs.ToArray());
}
{
List<HighInstruction> instrs = new List<HighInstruction>();
Rpa.Instructions.UnboxPtrInstruction unboxInstr = new Rpa.Instructions.UnboxPtrInstruction(null, unboxedOtherPtr, otherRef);
unboxInstr.ContinuationEdge = new HighCfgEdge(unboxInstr, nextFieldCheckHdl);
instrs.Add(unboxInstr);
unboxOtherHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], instrs.ToArray());
}
if ((vtCache.GetClassPodFlags(compiler, cls) & VTableGenerationCache.PodFlags.Equality) != VTableGenerationCache.PodFlags.None)
{
HighCfgNodeHandle nextHdl = new HighCfgNodeHandle();
List<HighInstruction> instrs = new List<HighInstruction>();
instrs.Add(new Instructions.BranchComparePodInstruction(null, unboxedThisPtr, unboxedOtherPtr, nextHdl, returnFalseHdl));
nextFieldCheckHdl.Value = new HighCfgNode(new HighCfgNodeHandle[0], new HighPhi[0], instrs.ToArray());
nextFieldCheckHdl = nextHdl;
}
else
{
foreach (HighField fld in cls.InstanceFields)
{
HighCfgNodeHandle nextHdl = new HighCfgNodeHandle();
TypeSpecTag fldType = fld.Type;
HighSsaRegister thisFldPtr = new HighSsaRegister(HighValueType.ManagedPtr, fldType, null);
HighSsaRegister otherFldPtr = new HighSsaRegister(HighValueType.ManagedPtr, fldType, null);
{
List<HighInstruction> instrs = new List<HighInstruction>();
instrs.Add(new Rpa.Instructions.PtrFieldInstruction(null, thisFldPtr, unboxedThisPtr, fld.Name));
//.........这里部分代码省略.........