Beispiel #1
0
 protected ClangFunctionInfoBase(CXCallingConv callConv, CXType retType, string name, IEnumerable <ClangParameterInfo> parameters)
 {
     CallConvention = callConv;
     ReturnType     = retType;
     Name           = name;
     Parameters     = parameters.ToImmutableArray();
 }
Beispiel #2
0
        private string GetCallingConventionName(Cursor cursor, CXCallingConv callingConvention)
        {
            switch (callingConvention)
            {
            case CXCallingConv.CXCallingConv_C:
            {
                return("Cdecl");
            }

            default:
            {
                Debug.WriteLine($"Unhandled calling convention: {callingConvention} in {cursor.KindSpelling}.");
                Debugger.Break();
                return(string.Empty);
            }
            }
        }
        private IClangType ParseDelegate(CXCursor cursor, CXCallingConv callConv)
        {
            IncrementStatistic("delegates");
            var name         = cursor.ToString();
            var pfnType      = clang.getTypedefDeclUnderlyingType(cursor);
            var funcType     = clang.getPointeeType(pfnType);
            var argTypeCount = clang.getNumArgTypes(funcType);
            var retType      = clang.getResultType(funcType);
            //var clrRetType = ResolveParameter(retType);
            var paramInfos = new ClangParameterInfo[argTypeCount];
            var i          = 0u;

            clang.visitChildren(cursor, (paramCursor, parent, p) => {
                if (paramCursor.kind != CXCursorKind.CXCursor_ParmDecl)
                {
                    // return type
                    if (i == 0 && paramCursor.kind == CXCursorKind.CXCursor_TypeRef)
                    {
                        return(CXChildVisitResult.CXChildVisit_Continue);
                    }
                    throw new NotImplementedException();
                }
                var paramType = clang.getCursorType(paramCursor);
                var paramName = paramCursor.ToString();
                if (string.IsNullOrEmpty(paramName))
                {
                    paramName = "_" + i;
                }
                //var clrArgParam = ResolveParameter(argType, paramName);
                if (i >= argTypeCount)
                {
                    throw new NotImplementedException();
                }
                paramInfos[i] = new ClangParameterInfo(paramType, paramName, i);
                ++i;
                return(CXChildVisitResult.CXChildVisit_Continue);
            }, default(CXClientData));

            /*
             *      var funcDef = Module.DefineType(name,
             *              TypeAttributes.Sealed | TypeAttributes.Public,
             *              typeof(MulticastDelegate));
             */
            return(new ClangDelegateInfo(callConv, retType, name, paramInfos));
        }
        private string GetCallingConventionName(Cursor cursor, CXCallingConv callingConvention, string remappedName)
        {
            if (_config.WithCallConvs.TryGetValue(remappedName, out string callConv) || _config.WithCallConvs.TryGetValue("*", out callConv))
            {
                return(callConv);
            }

            switch (callingConvention)
            {
            case CXCallingConv.CXCallingConv_C:
            {
                return("Cdecl");
            }

            case CXCallingConv.CXCallingConv_X86StdCall:
            {
                return("StdCall");
            }

            case CXCallingConv.CXCallingConv_X86FastCall:
            {
                return("FastCall");
            }

            case CXCallingConv.CXCallingConv_X86ThisCall:
            {
                return("ThisCall");
            }

            case CXCallingConv.CXCallingConv_Win64:
            {
                return("Winapi");
            }

            default:
            {
                var name = "Winapi";
                AddDiagnostic(DiagnosticLevel.Info, $"Unsupported calling convention: '{callingConvention}'. Falling back to '{name}'.", cursor);
                return(name);
            }
            }
        }
Beispiel #5
0
 public ClangDelegateInfo(CXCallingConv callConv, CXType retType, string name, params ClangParameterInfo[] parameters)
     : base(callConv, retType, name, parameters)
 {
 }
Beispiel #6
0
 public ClangDelegateInfo(CXCallingConv callConv, CXType retType, string name, IEnumerable <ClangParameterInfo> parameters)
     : base(callConv, retType, name, parameters)
 {
 }