public bool Create()
            {
                int    arrayIndex;
                Value  array;
                object value;

                while (true)
                {
                    var instr = method.Body.Instructions[index];
                    switch (instr.OpCode.Code)
                    {
                    case Code.Ret:
                        return(true);

                    case Code.Newarr:
                        var arrayType  = (ITypeDefOrRef)instr.Operand;
                        int arrayCount = ((Int32Value)emulator.Pop()).Value;
                        if (arrayType.FullName == "System.Char")
                        {
                            emulator.Push(new UserValue(new char[arrayCount]));
                        }
                        else
                        {
                            emulator.Push(new UnknownValue());
                        }
                        break;

                    case Code.Call:
                    case Code.Callvirt:
                        if (!DoCall(instr))
                        {
                            return(false);
                        }
                        break;

                    case Code.Ldelem_U1:
                        arrayIndex = ((Int32Value)emulator.Pop()).Value;
                        array      = (Value)emulator.Pop();
                        if (array is UserValue)
                        {
                            emulator.Push(new Int32Value(((byte[])((UserValue)array).obj)[arrayIndex]));
                        }
                        else
                        {
                            emulator.Push(Int32Value.CreateUnknownUInt8());
                        }
                        break;

                    case Code.Stelem_I1:
                        value      = emulator.Pop();
                        arrayIndex = ((Int32Value)emulator.Pop()).Value;
                        array      = (Value)emulator.Pop();
                        if (array is UserValue)
                        {
                            ((byte[])((UserValue)array).obj)[arrayIndex] = (byte)((Int32Value)value).Value;
                        }
                        break;

                    case Code.Stelem_I2:
                        value      = emulator.Pop();
                        arrayIndex = ((Int32Value)emulator.Pop()).Value;
                        array      = (Value)emulator.Pop();
                        if (array is UserValue)
                        {
                            ((char[])((UserValue)array).obj)[arrayIndex] = (char)((Int32Value)value).Value;
                        }
                        break;

                    case Code.Ldelem_Ref:
                        arrayIndex = ((Int32Value)emulator.Pop()).Value;
                        array      = (Value)emulator.Pop();
                        var userValue = array as UserValue;
                        if (userValue != null && userValue.obj is string[])
                        {
                            emulator.Push(new StringValue(((string[])userValue.obj)[arrayIndex]));
                        }
                        else
                        {
                            emulator.Push(new UnknownValue());
                        }
                        break;

                    case Code.Ldsfld:
                        emulator.Push(new UserValue((IField)instr.Operand));
                        break;

                    default:
                        emulator.Emulate(instr);
                        break;
                    }

                    index++;
                }
            }
예제 #2
0
 public static Int32Value Conv_Ovf_U1_Un(Real8Value a)
 {
     return(Int32Value.CreateUnknownUInt8());
 }
예제 #3
0
파일: Real8Value.cs 프로젝트: haise0/de5dot
 public static Int32Value Conv_Ovf_U1_Un(Real8Value a) => Int32Value.CreateUnknownUInt8();