示例#1
0
        public static T GetGlobalSymbol <T>(this INativeSymbolLookup lookup, NativeName name)
            where T : NativeSymbol
        {
            var symbol = GetGlobalSymbol(lookup, name);

            return((T)symbol.Symbol);
        }
示例#2
0
 public NativeGlobalSymbol(NativeName name, NativeSymbol symbol)
 {
     Contract.Requires(name.SymbolKind == symbol.Kind);
     Contract.Requires(name.Name == symbol.Name);
     Contract.Requires(name == NativeNameUtil.GetName(symbol));
     Name   = name;
     Symbol = symbol;
 }
示例#3
0
        public static bool TryGetName(NativeSymbol symbol, out NativeName name)
        {
            NativeNameKind kind;

            if (!TryGetNativeNameKind(symbol.Kind, out kind))
            {
                name = NativeName.Nil;
                return(false);
            }

            name = new NativeName(symbol.Name, kind);
            return(true);
        }
示例#4
0
        /// <summary>
        /// Do a lookup for a symbol with a specific name of the specified type.
        /// </summary>
        internal static bool TryGetGlobalSymbolExhaustive(this INativeSymbolLookup lookup, string name, out NativeGlobalSymbol symbol)
        {
            foreach (var kind in Enum.GetValues(typeof(NativeNameKind)).Cast <NativeNameKind>())
            {
                var nativeName = new NativeName(name, kind);
                if (lookup.TryGetGlobalSymbol(nativeName, out symbol))
                {
                    return(true);
                }
            }

            symbol = default(NativeGlobalSymbol);
            return(false);
        }
示例#5
0
        /// <summary>
        /// Do a lookup for a symbol with a specific name of the specified type.
        /// </summary>
        public static bool TryGetGlobalSymbol <T>(this INativeSymbolLookup lookup, NativeName name, out T symbol)
            where T : NativeSymbol
        {
            NativeGlobalSymbol globalSymbol;

            if (!lookup.TryGetGlobalSymbol(name, out globalSymbol))
            {
                symbol = null;
                return(false);
            }

            symbol = globalSymbol.Symbol as T;
            return(symbol != null);
        }
示例#6
0
 public bool TryGetGlobalSymbol(NativeName name, out NativeGlobalSymbol symbol) =>
 _storage.TryGetGlobalSymbol(name, out symbol) ||
 _nextSymbolLookup.TryGetGlobalSymbol(name, out symbol);
 public bool TryGetGlobalSymbol(NativeName name, out NativeGlobalSymbol symbol)
 {
     symbol = default(NativeGlobalSymbol);
     return(false);
 }
示例#8
0
        public static bool Contains(this INativeSymbolLookup lookup, NativeName name)
        {
            NativeGlobalSymbol symbol;

            return(lookup.TryGetGlobalSymbol(name, out symbol));
        }
示例#9
0
        public static NativeGlobalSymbol GetGlobalSymbol(this INativeSymbolLookup lookup, NativeName name)
        {
            NativeGlobalSymbol symbol;

            if (!lookup.TryGetGlobalSymbol(name, out symbol))
            {
                throw new Exception($"Unable to get symbol {name}");
            }

            return(symbol);
        }
示例#10
0
        public bool TryGetGlobalSymbol(NativeName name, out NativeGlobalSymbol symbol)
        {
            switch (name.Kind)
            {
            case NativeNameKind.Struct:
            case NativeNameKind.Union:
            case NativeNameKind.FunctionPointer:
            case NativeNameKind.Enum:
            {
                NativeDefinedType definedType;
                if (_definedMap.TryGetValue(name.Name, out definedType))
                {
                    symbol = new NativeGlobalSymbol(definedType);
                    return(true);
                }
            }
            break;

            case NativeNameKind.Procedure:
            {
                NativeProcedure proc;
                if (_procMap.TryGetValue(name.Name, out proc))
                {
                    symbol = new NativeGlobalSymbol(proc);
                    return(true);
                }
            }
            break;

            case NativeNameKind.TypeDef:
            {
                NativeTypeDef typeDef;
                if (_typeDefMap.TryGetValue(name.Name, out typeDef))
                {
                    symbol = new NativeGlobalSymbol(typeDef);
                    return(true);
                }
            }
            break;

            case NativeNameKind.Constant:
            {
                NativeConstant constant;
                if (_constMap.TryGetValue(name.Name, out constant))
                {
                    symbol = new NativeGlobalSymbol(constant);
                    return(true);
                }
            }
            break;

            case NativeNameKind.EnumValue:
            {
                NativeEnumValue value;
                if (_enumValueMap.TryGetValue(name.Name, out value))
                {
                    symbol = new NativeGlobalSymbol(value);
                    return(true);
                }
            }
            break;

            default:
                Contract.ThrowInvalidEnumValue(name.Kind);
                break;
            }

            symbol = default(NativeGlobalSymbol);
            return(false);
        }