コード例 #1
0
        public bool NodeMatch(CType aPatternNode, CType aTreeNode)
        {
            if (aPatternNode == null && aTreeNode == null)
            {
                return(true);
            }
            if (aPatternNode == null || aTreeNode == null)
            {
                return(false);
            }
            VariableCType variableType = aPatternNode as VariableCType;

            if (variableType != null)
            {
                if (variableType.CType == null)
                {
                    return(true);
                }
                return(NodeMatch(variableType.CType, aTreeNode));
            }
            if (aPatternNode.GetType() != aTreeNode.GetType())
            {
                return(false);
            }
            NamedCType namedPatternType = aPatternNode as NamedCType;
            NamedCType namedTreeType    = aTreeNode as NamedCType;

            if (namedPatternType != null)
            {
                Debug.Assert(namedTreeType != null); // Cannot be null as we already checked they have the same type.
                if (namedPatternType.Name != namedTreeType.Name)
                {
                    return(false);
                }
            }
            ArrayCType arrayPatternType = aPatternNode as ArrayCType;
            ArrayCType arrayTreeType    = aTreeNode as ArrayCType;

            if (arrayPatternType != null)
            {
                Debug.Assert(arrayTreeType != null);
                if (arrayPatternType.Dimension != arrayTreeType.Dimension)
                {
                    return(false);
                }
            }
            if (!aPatternNode.Qualifiers.SetEquals(aTreeNode.Qualifiers))
            {
                return(false);
            }
            return(true);
        }
コード例 #2
0
        public bool Apply(IFunctionSpecificationAnalyser aNativeFunction, IFunctionAssembler aAssembler)
        {
            NamedCType nativeType = aNativeFunction.CurrentParameterType as NamedCType;

            if (nativeType == null)
            {
                return(false);
            }
            CSharpType pinvokeArgType;
            CSharpType managedArgType;

            switch (nativeType.Name)
            {
            case "bool":
                pinvokeArgType = new CSharpType("bool")
                {
                    Attributes = { "MarshalAs(UnmanagedType.I1)" }
                };
                managedArgType = new CSharpType("bool");
                break;

            case "int":
                pinvokeArgType = managedArgType = new CSharpType("int");
                break;

            case "size_t":
                pinvokeArgType = managedArgType = new CSharpType("UIntPtr");
                break;

            default:
                string managedEnumName;
                if (!iEnumNativeToManagedMappings.TryGetValue(nativeType.Name, out managedEnumName))
                {
                    return(false);
                }
                pinvokeArgType = managedArgType = new CSharpType(managedEnumName);
                break;
            }
            aAssembler.AddPInvokeParameter(pinvokeArgType, aNativeFunction.CurrentParameter.Name, aNativeFunction.CurrentParameter.Name);
            aAssembler.AddManagedParameter(aNativeFunction.CurrentParameter.Name, managedArgType);
            aNativeFunction.ConsumeArgument();
            return(true);
        }
コード例 #3
0
        public bool Apply(IFunctionSpecificationAnalyser aNativeFunction, IFunctionAssembler aAssembler)
        {
            PointerCType pointer1Type = aNativeFunction.CurrentParameterType as PointerCType;

            if (pointer1Type == null)
            {
                return(false);
            }
            PointerCType pointer2Type = pointer1Type.BaseType as PointerCType;

            if (pointer2Type == null)
            {
                return(false);
            }
            NamedCType nativeType = pointer2Type.BaseType as NamedCType;

            if (nativeType == null)
            {
                return(false);
            }
            if (!iHandleNames.Contains(nativeType.Name))
            {
                return(false);
            }

            aAssembler.AddPInvokeParameter(
                new CSharpType("IntPtr")
            {
                IsRef = true
            },
                aNativeFunction.CurrentParameter.Name,
                null);
            aAssembler.SuppressManagedWrapper();
            aNativeFunction.ConsumeArgument();
            return(true);
        }