Exemple #1
0
 static Block getSwitchTarget(IList <Block> targets, Block fallThrough, Value value)
 {
     if (!value.isInt32())
     {
         return(null);
     }
     return(CflowUtils.getSwitchTarget(targets, fallThrough, (Int32Value)value));
 }
 bool fixLoadInstruction(Block block, int index, Value value)
 {
     if (value.isInt32())
     {
         var intValue = (Int32Value)value;
         if (!intValue.allBitsValid())
         {
             return(false);
         }
         block.Instructions[index] = new Instr(Instruction.CreateLdcI4(intValue.value));
         return(true);
     }
     else if (value.isInt64())
     {
         var intValue = (Int64Value)value;
         if (!intValue.allBitsValid())
         {
             return(false);
         }
         block.Instructions[index] = new Instr(OpCodes.Ldc_I8.ToInstruction(intValue.value));
         return(true);
     }
     return(false);
 }
 Block getSwitchTarget(IList<Block> targets, Block fallThrough, Block source, Value value)
 {
     if (!value.isInt32())
         return null;
     return CflowUtils.getSwitchTarget(targets, fallThrough, (Int32Value)value);
 }
Exemple #4
0
 bool fixLoadInstruction(Block block, int index, Value value)
 {
     if (value.isInt32()) {
         var intValue = (Int32Value)value;
         if (!intValue.allBitsValid())
             return false;
         block.Instructions[index] = new Instr(DotNetUtils.createLdci4(intValue.value));
         return true;
     }
     else if (value.isInt64()) {
         var intValue = (Int64Value)value;
         if (!intValue.allBitsValid())
             return false;
         block.Instructions[index] = new Instr(Instruction.Create(OpCodes.Ldc_I8, intValue.value));
         return true;
     }
     return false;
 }
        static Value truncateValue(Value value, TypeReference typeReference)
        {
            if (typeReference == null)
            {
                return(value);
            }

            switch (typeReference.EType)
            {
            case ElementType.Boolean:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toBoolean());
                }
                return(Int32Value.createUnknownBool());

            case ElementType.I1:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toInt8());
                }
                return(Int32Value.createUnknown());

            case ElementType.U1:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toUInt8());
                }
                return(Int32Value.createUnknownUInt8());

            case ElementType.I2:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toInt16());
                }
                return(Int32Value.createUnknown());

            case ElementType.U2:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toUInt16());
                }
                return(Int32Value.createUnknownUInt16());

            case ElementType.I4:
            case ElementType.U4:
                if (value.isInt32())
                {
                    return(value);
                }
                return(Int32Value.createUnknown());

            case ElementType.I8:
            case ElementType.U8:
                if (value.isInt64())
                {
                    return(value);
                }
                return(Int64Value.createUnknown());
            }
            return(value);
        }
        Value truncateValue(Value value, TypeReference typeReference)
        {
            if (typeReference == null)
            {
                return(value);
            }
            if (protectedStackValues.ContainsKey(value))
            {
                return(value);
            }

            switch (typeReference.EType)
            {
            case ElementType.Boolean:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toBoolean());
                }
                return(Int32Value.createUnknownBool());

            case ElementType.I1:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toInt8());
                }
                return(Int32Value.createUnknown());

            case ElementType.U1:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toUInt8());
                }
                return(Int32Value.createUnknownUInt8());

            case ElementType.I2:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toInt16());
                }
                return(Int32Value.createUnknown());

            case ElementType.U2:
                if (value.isInt32())
                {
                    return(((Int32Value)value).toUInt16());
                }
                return(Int32Value.createUnknownUInt16());

            case ElementType.I4:
            case ElementType.U4:
                if (value.isInt32())
                {
                    return(value);
                }
                return(Int32Value.createUnknown());

            case ElementType.I8:
            case ElementType.U8:
                if (value.isInt64())
                {
                    return(value);
                }
                return(Int64Value.createUnknown());

            case ElementType.R4:
                if (value.isReal8())
                {
                    return(new Real8Value((float)((Real8Value)value).value));
                }
                return(new UnknownValue());

            case ElementType.R8:
                if (value.isReal8())
                {
                    return(value);
                }
                return(new UnknownValue());
            }
            return(value);
        }
        static Value truncateValue(Value value, TypeReference typeReference)
        {
            if (typeReference == null)
                return value;

            switch (typeReference.EType) {
            case ElementType.Boolean:
                if (value.isInt32())
                    return ((Int32Value)value).toBoolean();
                return Int32Value.createUnknownBool();

            case ElementType.I1:
                if (value.isInt32())
                    return ((Int32Value)value).toInt8();
                return Int32Value.createUnknown();

            case ElementType.U1:
                if (value.isInt32())
                    return ((Int32Value)value).toUInt8();
                return Int32Value.createUnknownUInt8();

            case ElementType.I2:
                if (value.isInt32())
                    return ((Int32Value)value).toInt16();
                return Int32Value.createUnknown();

            case ElementType.U2:
                if (value.isInt32())
                    return ((Int32Value)value).toUInt16();
                return Int32Value.createUnknownUInt16();

            case ElementType.I4:
            case ElementType.U4:
                if (value.isInt32())
                    return value;
                return Int32Value.createUnknown();

            case ElementType.I8:
            case ElementType.U8:
                if (value.isInt64())
                    return value;
                return Int64Value.createUnknown();
            }
            return value;
        }
        static Value truncateValue(Value value, TypeReference typeReference)
        {
            if (typeReference == null)
                return value;
            if (DotNetUtils.isAssembly(typeReference.Scope, "mscorlib")) {
                switch (typeReference.FullName) {
                case "System.Boolean":
                    if (value.isInt32())
                        return ((Int32Value)value).toBoolean();
                    return Int32Value.createUnknownBool();

                case "System.SByte":
                    if (value.isInt32())
                        return ((Int32Value)value).toInt8();
                    return Int32Value.createUnknown();

                case "System.Byte":
                    if (value.isInt32())
                        return ((Int32Value)value).toUInt8();
                    return Int32Value.createUnknownUInt8();

                case "System.Int16":
                    if (value.isInt32())
                        return ((Int32Value)value).toInt16();
                    return Int32Value.createUnknown();

                case "System.UInt16":
                    if (value.isInt32())
                        return ((Int32Value)value).toUInt16();
                    return Int32Value.createUnknownUInt16();

                case "System.Int32":
                case "System.UInt32":
                    if (value.isInt32())
                        return value;
                    return Int32Value.createUnknown();

                case "System.Int64":
                case "System.UInt64":
                    if (value.isInt64())
                        return value;
                    return Int64Value.createUnknown();
                }
            }
            return value;
        }
        Value truncateValue(Value value, TypeSig type)
        {
            if (type == null)
                return value;
            if (protectedStackValues.ContainsKey(value))
                return value;

            switch (type.ElementType) {
            case ElementType.Boolean:
                if (value.isInt32())
                    return ((Int32Value)value).toBoolean();
                return Int32Value.createUnknownBool();

            case ElementType.I1:
                if (value.isInt32())
                    return ((Int32Value)value).toInt8();
                return Int32Value.createUnknown();

            case ElementType.U1:
                if (value.isInt32())
                    return ((Int32Value)value).toUInt8();
                return Int32Value.createUnknownUInt8();

            case ElementType.I2:
                if (value.isInt32())
                    return ((Int32Value)value).toInt16();
                return Int32Value.createUnknown();

            case ElementType.U2:
                if (value.isInt32())
                    return ((Int32Value)value).toUInt16();
                return Int32Value.createUnknownUInt16();

            case ElementType.I4:
            case ElementType.U4:
                if (value.isInt32())
                    return value;
                return Int32Value.createUnknown();

            case ElementType.I8:
            case ElementType.U8:
                if (value.isInt64())
                    return value;
                return Int64Value.createUnknown();

            case ElementType.R4:
                if (value.isReal8())
                    return new Real8Value((float)((Real8Value)value).value);
                return new UnknownValue();

            case ElementType.R8:
                if (value.isReal8())
                    return value;
                return new UnknownValue();
            }
            return value;
        }