当前位置: 首页>>代码示例>>C#>>正文


C# AstExpression.GetPrefix方法代码示例

本文整理汇总了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:
//.........这里部分代码省略.........
开发者ID:rfcclub,项目名称:dot42,代码行数:101,代码来源:TypeAnalysis.cs

示例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);
            }

//.........这里部分代码省略.........
开发者ID:rfcclub,项目名称:dot42,代码行数:101,代码来源:AstCompilerVisitor.Expression.cs


注:本文中的AstExpression.GetPrefix方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。