예제 #1
0
        internal static void InitializeWellKnownMembers()
        {
            var memberSymbols = new MemberSymbol[MemberNames.Length];

            foreach (var m in (WellKnownMembers[])Enum.GetValues(typeof(WellKnownMembers)))
            {
                var names = MemberNames[(int)m];
                Debug.Assert(m.ToString().StartsWith(names.Replace("global::", "").Replace('.', '_').Replace("`", "_T").Replace("$", "").Replace("@", "").Split('|', '(').First()));
                foreach (var proto in names.Split('|'))
                {
                    var name = proto.Replace("$", "").Split('(').First();
                    var s    = Binder.LookupFullName(name.Replace("global::", "").Split('.').Select(n => n.Replace('@', '.')).ToArray());
                    if (s == null)
                    {
                        continue;
                    }
                    if (s is SymbolList)
                    {
                        var isStatic = proto.Contains('$');
                        var args     = proto.Replace(")", "").Split('(').Last().Split(',');
                        var argTypes = args.Select(x => Binder.LookupFullName(x) as TypeSymbol).ToArray();
                        s = (s as SymbolList).Symbols.Find(x => (x as MethodBaseSymbol)?.MethodBase.GetParameters().Length == args.Length &&
                                                           (x as MethodBaseSymbol)?.MethodBase.IsStatic == isStatic &&
                                                           (x as MethodBaseSymbol)?.MethodBase.GetParameters().All(y => args[y.Position] == "*" || y.ParameterType == argTypes[y.Position].Type) == true);
                        Debug.Assert(s is MethodBaseSymbol);
                    }
                    Debug.Assert(s is MemberSymbol);
                    memberSymbols[(int)m] = s as MemberSymbol;
                    break;
                }
                Debug.Assert(memberSymbols[(int)m] != null);
            }

            Interlocked.CompareExchange(ref WellKnownMemberSymbols, memberSymbols, null);
        }
예제 #2
0
        internal static void InitializeNativeTypes()
        {
            var nativeTypeSymbols = new TypeSymbol[NativeTypeNames.Length];

            foreach (var m in (NativeType[])Enum.GetValues(typeof(NativeType)))
            {
                var names = NativeTypeNames[(int)m];
                nativeTypeSymbols[(int)m] = null;
                if (!string.IsNullOrEmpty(names))
                {
                    Debug.Assert(names.Substring(names.LastIndexOf('.') + 1)
                                 .Replace("__", "").Split('|', '(').First()
                                 .Replace("Void*", "Ptr") == m.ToString());
                    foreach (var name in names.Split('|'))
                    {
                        var t = Binder.LookupFullName(name) as TypeSymbol;
                        Debug.Assert(t != null);
                        if (t == null)
                        {
                            continue;
                        }
                        t.NativeType = m;
                        nativeTypeSymbols[(int)m] = t;
                        break;
                    }
                }
            }

            Interlocked.CompareExchange(ref NativeTypeSymbols, nativeTypeSymbols, null);
        }
예제 #3
0
        // Useful for testing
        internal static bool Override(WellKnownMembers kind, string proto)
        {
            var name = proto.Replace("$", "").Split('(').First();
            var s    = Binder.LookupName(name);

            if (s == null)
            {
                return(false);
            }
            if (s is SymbolList)
            {
                var isStatic = proto.Contains('$');
                var args     = proto.Replace(")", "").Split('(').Last().Split(',');
                var argTypes = args.Select(x => Binder.LookupFullName(x) as TypeSymbol).ToArray();
                s = (s as SymbolList).Symbols.Find(x => (x as MethodBaseSymbol)?.MethodBase.GetParameters().Length == args.Length &&
                                                   (x as MethodBaseSymbol)?.MethodBase.IsStatic == isStatic &&
                                                   (x as MethodBaseSymbol)?.MethodBase.GetParameters().All(y => args[y.Position] == "*" || y.ParameterType == argTypes[y.Position].Type) == true);
                if (!(s is MethodBaseSymbol))
                {
                    return(false);
                }
            }
            if (!(s is MemberSymbol))
            {
                return(false);
            }
            WellKnownMemberSymbols[(int)kind] = s as MemberSymbol;
            return(true);
        }
예제 #4
0
 static MemberSymbol FindMember(string names)
 {
     foreach (var proto in names.Split('|'))
     {
         var name = proto.Replace("$", "").Split('(').First();
         var s    = Binder.LookupFullName(name.Replace("global::", "").Split('.').Select(n => n.Replace('@', '.')).ToArray());
         if (s == null)
         {
             continue;
         }
         if (s is SymbolList)
         {
             var isStatic = proto.Contains('$');
             var args     = proto.Replace(")", "").Split('(').Last().Split(',');
             var argTypes = args.Select(x => Binder.LookupFullName(x) as TypeSymbol).ToArray();
             s = (s as SymbolList).Symbols.Find(x => (x as MethodBaseSymbol)?.MethodBase.GetParameters().Length == args.Length &&
                                                (x as MethodBaseSymbol)?.MethodBase.IsStatic == isStatic &&
                                                (x as MethodBaseSymbol)?.MethodBase.GetParameters().All(y => args[y.Position] == "*" || y.ParameterType == argTypes[y.Position].Type) == true);
             Debug.Assert(s is MethodBaseSymbol);
         }
         Debug.Assert(s is MemberSymbol);
         return(s as MemberSymbol);
     }
     return(null);
 }
예제 #5
0
        internal static void InitializeWellKnownTypes()
        {
            var typeSymbols = new TypeSymbol[TypeNames.Length];

            foreach (var m in (WellKnownTypes[])Enum.GetValues(typeof(WellKnownTypes)))
            {
                var names = TypeNames[(int)m];
                Debug.Assert(names.Replace('.', '_').Replace("`", "_T").Split('|').First().Contains(m.ToString()));
                foreach (var name in names.Split('|'))
                {
                    var s = Binder.LookupFullName(name);
                    if (s == null)
                    {
                        continue;
                    }
                    Debug.Assert(s is TypeSymbol);
                    typeSymbols[(int)m] = s as TypeSymbol;
                    break;
                }
                Debug.Assert(typeSymbols[(int)m] != null);
            }

            Interlocked.CompareExchange(ref WellKnownTypeSymbols, typeSymbols, null);
        }