/// <summary>
        /// Returns the address to be used as memory context. This is used to get an address
        /// from an expression entered into Visual Studio's memory view's address text box.
        /// </summary>
        public static ulong?GetMemoryContextAddress(this RemoteValue remoteValue)
        {
            if (!IsValidValue(remoteValue))
            {
                return(null);
            }

            TypeFlags GetTypeFlags(RemoteValue value) =>
            remoteValue.GetTypeInfo().GetCanonicalType().GetTypeFlags();

            // If the value is an array, try to obtain its address.
            TypeFlags flags = GetTypeFlags(remoteValue);

            if (flags.HasFlag(TypeFlags.IS_ARRAY))
            {
                remoteValue = remoteValue.AddressOf();
                if (!IsValidValue(remoteValue))
                {
                    return(null);
                }
                flags = GetTypeFlags(remoteValue);
            }

            // Only interpret pointers, references and integers as addresses.
            if (!flags.HasFlag(TypeFlags.IS_REFERENCE) && !flags.HasFlag(TypeFlags.IS_POINTER) &&
                !flags.HasFlag(TypeFlags.IS_INTEGER))
            {
                return(null);
            }

            return(remoteValue.GetValueAsUnsigned());
        }
Esempio n. 2
0
        public bool RequiresIndirection(DataType dt, TypeFlags flags = 0)
        {
            if (flags == TypeFlags.ThisByRefDeclaration && dt.TypeType == TypeType.Interface ||
                flags == TypeFlags.ThisInlineDeclaration && dt.TypeType == TypeType.Interface)
            {
                return(false);
            }
            if (flags == TypeFlags.ReturnByRef && IsConstrained(dt) ||
                flags == TypeFlags.ParameterByRef && IsConstrained(dt) ||
                flags.HasFlag(TypeFlags.ThisByRef) && IsConstrained(dt))
            {
                return(false);
            }

            return(flags.HasFlag(TypeFlags.ByRef) &&
                   !IsConstrained(dt) && !(
                       dt.IsReferenceType &&
                       (flags & TypeFlags.TypeMask) != TypeFlags.Return
                       ) || (
                       dt.IsValueType &&
                       !flags.HasFlag(TypeFlags.Inline) &&
                       (flags & TypeFlags.TypeMask) == TypeFlags.Parameter &&
                       !IsConstrained(dt)
                       ) || (
                       dt.IsStruct &&
                       !flags.HasFlag(TypeFlags.Inline) &&
                       flags.HasFlag(TypeFlags.This) &&
                       !IsConstrained(dt)
                       ) ||
                   flags == TypeFlags.ParameterByRef ||
                   flags == (TypeFlags.ParameterByRef | TypeFlags.Inline));
        }
        public virtual string FormatValueAsAddress(RemoteValue remoteValue)
        {
            TypeFlags flags = remoteValue?.GetTypeInfo()?.GetTypeFlags() ?? 0;

            if (flags.HasFlag(TypeFlags.IS_REFERENCE) || flags.HasFlag(TypeFlags.IS_POINTER))
            {
                return($"0x{remoteValue.GetValueAsUnsigned():x16}");
            }
            return(string.Empty);
        }
        public override string FormatValueAsAddress(RemoteValue remoteValue)
        {
            TypeFlags flags = remoteValue?.GetTypeInfo()?.GetTypeFlags() ?? 0;

            if (flags.HasFlag(TypeFlags.IS_REFERENCE) || flags.HasFlag(TypeFlags.IS_POINTER))
            {
                if (ValueFormat == ValueFormat.HexUppercase)
                {
                    return($"{remoteValue.GetValueAsUnsigned():X16}");
                }
                else
                {
                    return($"{remoteValue.GetValueAsUnsigned():x16}");
                }
            }
            return(string.Empty);
        }
Esempio n. 5
0
 public static bool Test(IType type, TypeFlags typeFlags)
 {
     if (typeFlags.HasFlag(TypeFlags.Private) == true && type.AccessInfo.IsPrivate == false)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.Public) == true && type.AccessInfo.IsPublic == false)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.Locked) == true && type.LockInfo.IsLocked == false)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.NotLocked) == true && type.LockInfo.IsLocked == true)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.IsBeingEdited) == true && type.TypeState != TypeState.IsBeingEdited)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.NotBeingEdited) == true && type.TypeState == TypeState.IsBeingEdited)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.IsReferenced) == true && type.ReferencedTables.Any() == false)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.NotReferenced) == true && type.ReferencedTables.Any() == true)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.IsFlag) == true && type.TypeInfo.IsFlag == false)
     {
         return(false);
     }
     if (typeFlags.HasFlag(TypeFlags.NotFlag) == true && type.TypeInfo.IsFlag == true)
     {
         return(false);
     }
     return(true);
 }
Esempio n. 6
0
        public string GetTypeDef(DataType dt, Namescope parent = null, TypeFlags flags = 0)
        {
            if (flags == TypeFlags.ThisByRefDeclaration && dt.TypeType == TypeType.Interface ||
                flags == TypeFlags.ThisInlineDeclaration && dt.TypeType == TypeType.Interface)
            {
                return("const uInterface&");
            }
            if (flags == TypeFlags.ReturnByRef && IsConstrained(dt) ||
                flags == TypeFlags.ParameterByRef && IsConstrained(dt) ||
                flags.HasFlag(TypeFlags.ThisByRef) && IsConstrained(dt))
            {
                return("uTRef");
            }

            var name = GetTypeName(dt, parent, flags.HasFlag(TypeFlags.Inline));

            return(RequiresIndirection(dt, flags)
                ? name + "*"
                : name);
        }
Esempio n. 7
0
        public IEnumerable <string> GetAllInheritedTypes()
        {
            SbType typeInfo = _remoteValue.GetTypeInfo();

            if (typeInfo == null)
            {
                yield break;
            }

            TypeFlags typeFlags = typeInfo.GetTypeFlags();

            if (typeFlags.HasFlag(TypeFlags.IS_POINTER) ||
                typeFlags.HasFlag(TypeFlags.IS_REFERENCE))
            {
                typeInfo = typeInfo.GetPointeeType();
                if (typeInfo == null)
                {
                    yield break;
                }
            }

            var typeQueue = new Queue <SbType>();

            typeQueue.Enqueue(typeInfo);

            while (typeQueue.Count > 0)
            {
                SbType curType = typeQueue.Dequeue();
                yield return(curType.GetName());

                uint numDirectBaseClasses = curType.GetNumberOfDirectBaseClasses();
                for (uint i = 0; i < numDirectBaseClasses; i++)
                {
                    typeQueue.Enqueue(curType.GetDirectBaseClassAtIndex(i).GetTypeInfo());
                }
            }
        }
Esempio n. 8
0
        // Create type and add to dictionary
        public static DataType Create(string name, Type valuetype, Type nativetype, DefaultDelegate defaulter, IsSubclassDelegate issubclass, TypeFlags flags = TypeFlags.None)
        {
            var dt = new DataType {
                Name        = name,
                _defaulter  = defaulter,
                _issubclass = issubclass,
                NativeType  = nativetype,
                Flags       = flags,
            };

            if (flags.HasFlag(TypeFlags.HasHeading))
            {
                dt.Heading = DataHeading.Empty;
            }
            DataTypes.Dict[name] = dt;
            if (valuetype != null)
            {
                DataTypes.TypeDict[valuetype] = dt;
            }
            return(dt);
        }