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


C# AstNode.GetExpressionPairs方法代码示例

本文整理汇总了C#中AstNode.GetExpressionPairs方法的典型用法代码示例。如果您正苦于以下问题:C# AstNode.GetExpressionPairs方法的具体用法?C# AstNode.GetExpressionPairs怎么用?C# AstNode.GetExpressionPairs使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在AstNode的用法示例。


在下文中一共展示了AstNode.GetExpressionPairs方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: Convert

 /// <summary>
 /// Optimize expressions
 /// </summary>
 public static void Convert(AstNode ast)
 {
     // Expand typeof
     foreach (var pair in ast.GetExpressionPairs())
     {
         var node = pair.Expression;
         switch (node.Code)
         {
             case AstCode.Ldfld:
             //case AstCode.Ldsfld: // NOT YET
                 {
                     var field = (XFieldReference) node.Operand;
                     var clone = new AstExpression(node);
                     node.SetCode(AstCode.UnboxFromGeneric).SetArguments(clone).Operand = field.FieldType;
                 }
                 break;
             case AstCode.Call:
             case AstCode.Calli:
             case AstCode.Callvirt:
                 {
                     var method = (XMethodReference)node.Operand;
                     if ((!method.ReturnType.IsVoid()) && (pair.Parent != null))
                     {
                         var clone = new AstExpression(node);
                         node.SetCode(AstCode.UnboxFromGeneric).SetArguments(clone).Operand = method.ReturnType;
                     }
                 }
                 break;
         }
     }
 }
开发者ID:rfcclub,项目名称:dot42,代码行数:34,代码来源:GenericsConverter.cs

示例2: Convert

 /// <summary>
 /// Optimize expressions
 /// </summary>
 public static void Convert(AstNode ast, MethodSource currentMethod, XTypeSystem typeSystem)
 {
     // Expand typeof
     foreach (var pair in ast.GetExpressionPairs())
     {
         var node = pair.Expression;
         switch (node.Code)
         {
             case AstCode.Ldfld:
             //case AstCode.Ldsfld: // NOT YET
                 {
                     var field = (XFieldReference) node.Operand;
                     UnboxIfGeneric(field.FieldType, node, typeSystem);
                 }
                 break;
             case AstCode.Stfld:
                 {
                     var field = (XFieldReference)node.Operand;
                     BoxIfGeneric(field.FieldType, node.Arguments[1]);
                 }
                 break;
             case AstCode.Call:
             case AstCode.Calli:
             case AstCode.Callvirt:
                 {
                     var method = (XMethodReference)node.Operand;
                     if ((!method.ReturnType.IsVoid()) && (pair.Parent != null))
                     {
                         UnboxIfGeneric(method.ReturnType, node, typeSystem);
                     }
                 }
                 break;
             case AstCode.Ret:
                 {
                     if (node.Arguments.Count > 0)
                     {
                         var expectedType = currentMethod.Method.ReturnType;
                         BoxIfGeneric(expectedType, node.Arguments[0]);
                     }
                 }
                 break;
             case AstCode.ByRefArray:
             case AstCode.ByRefOutArray:
             {
                 if (node.Arguments.Count > 1)
                 {
                     var originalType = (XTypeReference) node.Arguments[1].Operand;
                     UnboxByRefIfGeneric(originalType, node.StoreByRefExpression, typeSystem);
                 }
             }
             break;
         }
     }
 }
开发者ID:jakesays,项目名称:dot42,代码行数:57,代码来源:GenericsConverter.cs

示例3: Convert

 /// <summary>
 /// Optimize expressions
 /// </summary>
 public static void Convert(AstNode ast)
 {
     foreach (var pair in ast.GetExpressionPairs())
     {
         var node = pair.Expression;
         switch (node.Code)
         {
             case AstCode.Ldc_I4:
                 {
                     var constType = node.GetResultType();
                     if (constType.IsByte())
                     {
                         node.Operand = System.Convert.ToInt32(node.Operand) & 0xFF;
                     }
                     else if (constType.IsUInt16())
                     {
                         node.Operand = System.Convert.ToInt32(node.Operand) & 0xFFFF;
                     }
                 }
                 break;
             case AstCode.Ldloc:
                 {
                     var variable = (AstVariable) node.Operand;
                     var varType = variable.Type;
                     ConvertIfNeeded(node, varType, pair.Parent);
                 }
                 break;
             case AstCode.Ldfld:
             case AstCode.Ldsfld:
                 {
                     var field = (XFieldReference) node.Operand;
                     var fieldType = field.FieldType;
                     ConvertIfNeeded(node, fieldType, pair.Parent);
                 }
                 break;
             case AstCode.Ldelem_U1:
             case AstCode.Ldelem_U2:
                 {
                     var arrayType = (XArrayType) node.Arguments[0].GetResultType();
                     var elementType = arrayType.ElementType;
                     ConvertIfNeeded(node, elementType, pair.Parent);
                 }
                 break;
         }
     }
 }
开发者ID:Xtremrules,项目名称:dot42,代码行数:49,代码来源:ConvertAfterLoadConversionConverter.cs

示例4: Convert

        /// <summary>
        /// Optimize expressions
        /// </summary>
        public static void Convert(AstNode ast, MethodSource currentMethod, XTypeSystem typeSystem)
        {
            // Expand typeof
            foreach (var pair in ast.GetExpressionPairs())
            {
                var node = pair.Expression;
                switch (node.Code)
                {
                    case AstCode.Ldfld:
                    //case AstCode.Ldsfld: // NOT YET
                        {
                            var field = (XFieldReference) node.Operand;
                            UnboxIfGeneric(field.FieldType, node, typeSystem);
                        }
                        break;
                    case AstCode.Stfld:
                        {
                            var field = (XFieldReference)node.Operand;
                            BoxIfGeneric(field.FieldType, node.Arguments[1]);
                        }
                        break;
                    case AstCode.Call:
                    case AstCode.Calli:
                    case AstCode.Callvirt:
                        {
                            var method = (XMethodReference)node.Operand;
                            if ((!method.ReturnType.IsVoid()) && (pair.Parent != null))
                            {
                                UnboxIfGeneric(method.ReturnType, node, typeSystem);
                            }
                        }
                        break;
                    case AstCode.Ret:
                        {
                            if (node.Arguments.Count > 0)
                            {
                                var expectedType = currentMethod.Method.ReturnType;
                                BoxIfGeneric(expectedType, node.Arguments[0]);
                            }
                        }
                        break;
                    case AstCode.Box:
                        {
                            var type = (XTypeReference)node.Operand;

                            // Honestly, the whole Generics code seems to be quite
                            // complex. I hope this fix does not break anything else.
                            // Also: is there any sense in having two codes 'box' and 'boxtogeneric'?

                            // The Rosyln compiler apparently uses 'box' instructions to satisfy
                            // generic constraints. Not sure if this is the right place to handle 
                            // this. 
                            // What we want to achive is to perform this conversion code only if the
                            // expected type is assignable from any of the constraints. As we do not
                            // have an 'IsAssignableFrom' logic for XTypes, a simpler check must suffice.
                            
                            if (type.IsGenericParameter 
                                && ((XGenericParameter)type).Constraints.Any() 
                                && node.ExpectedType != null && !node.ExpectedType.IsPrimitive
                                && !node.ExpectedType.IsGenericParameter)
                            {
                                // or just enter the required cast here???
                                node.Code = AstCode.BoxToGeneric;
                                node.InferredType = node.ExpectedType;
                            }
                        }
                        break;
                    case AstCode.ByRefArray:
                    case AstCode.ByRefOutArray:
                    {
                        if (node.Arguments.Count > 1)
                        {
                            var originalType = (XTypeReference) node.Arguments[1].Operand;
                            UnboxByRefIfGeneric(originalType, node.StoreByRefExpression, typeSystem);
                        }
                    }
                    break;
                }
            }
        }
开发者ID:Xtremrules,项目名称:dot42,代码行数:83,代码来源:GenericsConverter.cs

示例5: Convert

        /// <summary>
        /// Optimize expressions
        /// </summary>
        public static void Convert(AstNode ast, AssemblyCompiler compiler)
        {
            foreach (var pair in ast.GetExpressionPairs())
            {
                var node = pair.Expression;
                switch (node.Code)
                {
                    case AstCode.Call:
                    case AstCode.Calli:
                    case AstCode.Callvirt:
                        var methodRef = (XMethodReference) node.Operand;
                        XMethodDefinition method;
                        if (methodRef.TryResolve(out method))
                        {
                            var targetType = method.DeclaringType;
                            var prefix = node.GetPrefix(AstCode.Constrained);
                            if (prefix != null)
                            {
                                // Calls to object::ToString for value types have a constrained prefix with the target type in the prefix operand.
                                var prefixTypeRef = (XTypeReference) prefix.Operand;
                                XTypeDefinition prefixTypeDef;
                                if (prefixTypeRef.TryResolve(out prefixTypeDef))
                                {
                                    targetType = prefixTypeDef;
                                }
                            }
                            if (targetType.IsValueType && !targetType.IsPrimitive &&
                                ! /*targetType*/method.DeclaringType.IsSystemNullable())
                            {
                                if (method.IsConstructor && (!node.Arguments[0].MatchThis()))
                                {
                                    // Convert ctor call
                                    ConvertCtorCall(node, methodRef);
                                }
                                else
                                {
                                    // Convert normal method call
                                    for (var i = 0; i < node.Arguments.Count; i++)
                                    {
                                        ProcessArgument(node, method, i, compiler.Module);
                                    }
                                }
                            }

                            // Clone all struct arguments
                            for (var i = 0; i < node.Arguments.Count; i++)
                            {
                                CloneStructArgument(node, method, i);
                            }
                        }
                        break;
                    case AstCode.DefaultValue:
                        {
                            var typeRef = (XTypeReference) node.Operand;
                            XTypeDefinition type;
                            if (typeRef.TryResolve(out type) && type.IsValueType && !type.IsPrimitive && !type.IsEnum &&
                                !type.IsSystemNullable())
                            {
                                var defaultCtor = GetDefaultValueCtor(type);
                                ConvertDefaultValue(node, defaultCtor);
                            }
                        }
                        break;
                    case AstCode.Newarr:
                        {
                            var typeRef = (XTypeReference) node.Operand;
                            XTypeDefinition type;
                            if (typeRef.TryResolve(out type) && type.IsValueType && !type.IsPrimitive &&
                                !type.IsSystemNullable())
                            {
                                var parentCode = (pair.Parent != null) ? pair.Parent.Code : AstCode.Nop;
                                if (type.IsEnum)
                                {
                                    // Initialize enum array
                                    if (parentCode != AstCode.InitEnumArray) // Avoid recursion
                                    {
                                        ConvertNewArrEnum(node);
                                    }
                                }
                                else
                                {
                                    // Initialize struct array
                                    if (parentCode != AstCode.InitStructArray) // Avoid recursion
                                    {
                                        var defaultCtor = GetDefaultValueCtor(type);
                                        ConvertNewArrStruct(node, defaultCtor);
                                    }
                                }
                            }
                        }
                        break;

                    case AstCode.Ldloca:
                        node.Code = AstCode.Ldloc;
                        break;
                    case AstCode.Ldflda:
                        node.Code = AstCode.Ldfld;
//.........这里部分代码省略.........
开发者ID:rfcclub,项目名称:dot42,代码行数:101,代码来源:StructCallConverter.cs


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