本文整理汇总了C#中AstExpression.GetPrefix方法的典型用法代码示例。如果您正苦于以下问题:C# AstExpression.GetPrefix方法的具体用法?C# AstExpression.GetPrefix怎么用?C# AstExpression.GetPrefix使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AstExpression
的用法示例。
在下文中一共展示了AstExpression.GetPrefix方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DoInferTypeForExpression
XTypeReference DoInferTypeForExpression(AstExpression expr, XTypeReference expectedType, bool forceInferChildren = false)
{
switch (expr.Code)
{
#region Logical operators
case AstCode.NullCoalescing:
return InferBinaryArguments(expr.Arguments[0], expr.Arguments[1], expectedType, forceInferChildren);
#endregion
#region Variable load/store
case AstCode.Stloc:
{
AstVariable v = (AstVariable)expr.Operand;
if (forceInferChildren)
{
// do not use 'expectedType' in here!
InferTypeForExpression(expr.Arguments.Single(), v.Type);
}
return v.Type;
}
case AstCode.Ldloc:
{
AstVariable v = (AstVariable)expr.Operand;
if (v.Type == null && singleLoadVariables.Contains(v))
{
v.Type = expectedType;
}
return v.Type;
}
case AstCode.Ldloca:
return new XByReferenceType(((AstVariable)expr.Operand).Type);
#endregion
#region Call / NewObj
case AstCode.Call:
case AstCode.Callvirt:
case AstCode.CallIntf:
case AstCode.CallSpecial:
{
var method = (XMethodReference)expr.Operand;
if (forceInferChildren)
{
for (int i = 0; i < expr.Arguments.Count; i++)
{
if (i == 0 && method.HasThis)
{
InferTypeForExpression(expr.Arguments[0], MakeRefIfValueType(method.DeclaringType, expr.GetPrefix(AstCode.Constrained)));
}
else
{
InferTypeForExpression(expr.Arguments[i], SubstituteTypeArgs(method.Parameters[method.HasThis ? i - 1 : i].ParameterType, method));
}
}
}
return SubstituteTypeArgs(method.ReturnType, method);
}
case AstCode.Newobj:
{
var ctor = (XMethodReference)expr.Operand;
if (forceInferChildren)
{
for (int i = 0; i < ctor.Parameters.Count; i++)
{
InferTypeForExpression(expr.Arguments[i], SubstituteTypeArgs(ctor.Parameters[i].ParameterType, ctor));
}
}
return ctor.DeclaringType;
}
case AstCode.New:
return (XTypeReference)expr.Operand;
#endregion
#region Load/Store Fields
case AstCode.Ldfld:
if (forceInferChildren)
{
InferTypeForExpression(expr.Arguments[0], MakeRefIfValueType(((XFieldReference)expr.Operand).DeclaringType, expr.GetPrefix(AstCode.Constrained)));
}
return GetFieldType((XFieldReference)expr.Operand);
case AstCode.Ldsfld:
return GetFieldType((XFieldReference)expr.Operand);
case AstCode.Ldflda:
if (forceInferChildren)
{
InferTypeForExpression(expr.Arguments[0], MakeRefIfValueType(((XFieldReference)expr.Operand).DeclaringType, expr.GetPrefix(AstCode.Constrained)));
}
return new XByReferenceType(GetFieldType((XFieldReference)expr.Operand));
case AstCode.Ldsflda:
return new XByReferenceType(GetFieldType((XFieldReference)expr.Operand));
case AstCode.Stfld:
if (forceInferChildren)
{
InferTypeForExpression(expr.Arguments[0], MakeRefIfValueType(((XFieldReference)expr.Operand).DeclaringType, expr.GetPrefix(AstCode.Constrained)));
InferTypeForExpression(expr.Arguments[1], GetFieldType((XFieldReference)expr.Operand));
}
return GetFieldType((XFieldReference)expr.Operand);
case AstCode.Stsfld:
if (forceInferChildren)
InferTypeForExpression(expr.Arguments[0], GetFieldType((XFieldReference)expr.Operand));
return GetFieldType((XFieldReference)expr.Operand);
#endregion
#region Reference/Pointer instructions
case AstCode.Ldind_Ref:
//.........这里部分代码省略.........
示例2: VisitCallExpression
/// <summary>
/// Generate code for a call or callvirtual opcode.
/// </summary>
private RLRange VisitCallExpression(AstExpression node, List<RLRange> args, AstNode parent)
{
var targetMethodRef = ((XMethodReference) node.Operand);
var targetMethodDefOrRef = targetMethodRef;
var methodReturnType = targetMethodRef.ReturnType;
if (targetMethodRef.DeclaringType.IsArray)
{
RLRange result;
if (TryVisitArrayTypeMethodCallExpression(node, targetMethodRef, args, parent, out result))
return result;
}
XTypeDefinition targetDeclaringType = null;
XMethodDefinition targetMethodDef;
if (targetMethodRef.TryResolve(out targetMethodDef))
{
if (targetMethodDef.HasDexNativeAttribute())
{
// Handle [DexNative] methods different.
return VisitDexNativeCall(node, args, parent, targetMethodDef);
}
targetMethodDefOrRef = targetMethodDef;
targetDeclaringType = targetMethodDef.DeclaringType;
methodReturnType = targetMethodDef.ReturnType;
}
var dMethodRef = targetMethodDefOrRef.GetReference(targetPackage);
var first = this.Add(node.SourceLocation, RCode.Nop);
var last = first;
// Convert parameters when needed
List<RLRange> originalArgs;
int argsOffset;
ConvertParametersBeforeCall(node, args, targetMethodDefOrRef, out argsOffset, out originalArgs);
// Invoke
var arguments = args.SelectMany(x => x.Result.Registers).ToList();
MaxOutgoingRegisters = Math.Max(MaxOutgoingRegisters, arguments.Count);
// Determine opcode used in this call
RCode opcode ;
switch (node.Code)
{
case AstCode.Callvirt:
if ((targetMethodDef != null) && targetMethodDef.UseInvokeInterface)
opcode = RCode.Invoke_interface;
else
opcode = ((targetDeclaringType != null) && targetDeclaringType.IsInterface) ? RCode.Invoke_interface : RCode.Invoke_virtual;
break;
case AstCode.Call:
opcode = targetMethodDef.Invoke(targetMethodDefOrRef, currentMethod, false);
break;
case AstCode.CallIntf:
opcode = RCode.Invoke_interface;
break;
case AstCode.CallSpecial:
opcode = targetMethodDef.Invoke(targetMethodDefOrRef, currentMethod, true);
break;
default:
throw new ArgumentException("Unknown call code " + (int)node.Code);
}
if ((targetDeclaringType != null) && targetDeclaringType.IsDelegate())
{
opcode = RCode.Invoke_interface;
}
// Process constraint prefix
if (arguments.Count > 0)
{
var constraint = node.GetPrefix(AstCode.Constrained);
if (constraint != null)
{
var type = constraint.Operand as XTypeReference;
if (type != null)
{
if (type.IsGenericParameter)
{
// Cast to declaring type of method
this.Add(node.SourceLocation, RCode.Check_cast, targetMethodRef.DeclaringType.GetReference(targetPackage), arguments[0]);
}
}
}
}
// Actual call
this.Add(node.SourceLocation, opcode, dMethodRef, arguments);
// Handle result
RegisterSpec r = null;
if ((!methodReturnType.IsVoid()) && (parent is AstExpression))
{
// Get result
r = frame.AllocateTemp(methodReturnType.GetReference(targetPackage));
last = this.Add(node.SourceLocation, methodReturnType.MoveResult(), r);
}
//.........这里部分代码省略.........