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