コード例 #1
0
        public LocalVariable SetNewVReg(EvaluatorStack evaluator)
        {
            var newLocal = evaluator.SetNewVReg();

            VirtRegs.Add(newLocal);
            return(newLocal);
        }
コード例 #2
0
        public void BranchIfFalse(int pushedIntValue, EvaluatorStack evaluator)
        {
            var firstVar = evaluator.Stack.Pop();

            AddOperation(SimpleOperations.LocalOperation.Kinds.BranchOperator,
                         new BranchOperator(OpcodeBranchNames.BrFalse)
            {
                JumpTo       = pushedIntValue,
                CompareValue = firstVar
            });
        }
コード例 #3
0
        private void AssignValueToStack(object value, EvaluatorStack evaluator)
        {
            var result = SetNewVReg(evaluator);
            var assign = new Assignment()
            {
                Left  = result,
                Right = new ConstValue(value)
            };

            result.FixedType = value.GetType();
            AddOperation(SimpleOperations.LocalOperation.Kinds.Assignment, assign);
        }
コード例 #4
0
        public void Dup(EvaluatorStack evaluator)
        {
            var variable = evaluator.Stack.Peek();
            var vreg     = SetNewVReg(evaluator);
            var assign   = new Assignment()
            {
                Left  = vreg,
                Right = variable
            };

            vreg.FixedType = variable.ComputedType();
            AddOperation(LocalOperation.Kinds.Assignment, assign);
        }
コード例 #5
0
        private void BranchTwoOperators(int jumpTo, EvaluatorStack evaluator, string opcode)
        {
            var firstVar  = evaluator.Stack.Pop();
            var secondVar = evaluator.Stack.Pop();

            AddOperation(SimpleOperations.LocalOperation.Kinds.BranchOperator,
                         new BranchOperator(opcode)
            {
                JumpTo       = jumpTo,
                CompareValue = firstVar,
                SecondValue  = secondVar
            });
        }
コード例 #6
0
        public void LoadArgument(int pushedIntValue, EvaluatorStack evaluator)
        {
            var argument = Arguments[pushedIntValue];
            var vreg     = SetNewVReg(evaluator);

            vreg.FixedType = argument.ComputedType();
            var assignment = new Assignment()
            {
                Left  = vreg,
                Right = argument
            };

            AddOperation(LocalOperation.Kinds.LoadArgument, assignment);
        }
コード例 #7
0
        public void NewObject(ConstructorInfo constructorInfo, EvaluatorStack evaluator)
        {
            var result = SetNewVReg(evaluator);

            result.FixedType = constructorInfo.DeclaringType;
            var assignment = new Assignment()
            {
                Left  = result,
                Right = new NewConstructedObject(constructorInfo)
            };

            ProgramData.Instance.UpdateType(constructorInfo.DeclaringType);
            AddOperation(LocalOperation.Kinds.NewObject, assignment);
        }
コード例 #8
0
        public void SetElement(EvaluatorStack evaluator, Type operand)
        {
            var value         = evaluator.Pop();
            var index         = evaluator.Pop();
            var array         = evaluator.Pop();
            var arrayVariable = new ArrayVariable(array, index);
            var assignment    = new Assignment
            {
                Left  = arrayVariable,
                Right = value
            };

            arrayVariable.FixedType = value.ComputedType();
            AddOperation(LocalOperation.Kinds.SetArrayItem, assignment);
        }
コード例 #9
0
        public void CopyLocalVariableIntoStack(int value, EvaluatorStack evaluator)
        {
            var locVar = _localVariables[value];

            var vreg = SetNewVReg(evaluator);

            var assingment = new Assignment
            {
                Left  = vreg,
                Right = locVar
            };

            vreg.FixedType = locVar.ComputedType();
            AddOperation(SimpleOperations.LocalOperation.Kinds.Assignment, assingment);
        }
コード例 #10
0
        public void Call(object operand, EvaluatorStack evaluator)
        {
            var methodInfo = (MethodBase)operand;
            var methodData = new MethodData(methodInfo);


            methodData.ExtractNeededValuesFromStack(evaluator);
            if (!methodData.IsVoid)
            {
                var vreg = SetNewVReg(evaluator);
                vreg.FixedType    = methodInfo.GetReturnType();
                methodData.Result = vreg;
            }
            methodData.FixedType = methodInfo.GetReturnType();
            AddOperation(SimpleOperations.LocalOperation.Kinds.Call, methodData);
        }
コード例 #11
0
        public void NewArray(EvaluatorStack evaluator, Type typeArray)
        {
            var arrayLength = evaluator.Stack.Pop();
            var result      = SetNewVReg(evaluator);
            var assignment  = new Assignment
            {
                Left  = result,
                Right = new NewArrayObject()
                {
                    TypeArray   = typeArray,
                    ArrayLength = arrayLength
                }
            };

            result.FixedType = typeArray.MakeArrayType();
            AddOperation(LocalOperation.Kinds.NewArray, assignment);
        }
コード例 #12
0
        public void StoreField(FieldInfo fieldInfo, EvaluatorStack evaluator)
        {
            var secondVar  = evaluator.Stack.Pop();
            var firstVar   = evaluator.Stack.Pop();
            var fieldName  = fieldInfo.Name;
            var assignment = new Assignment()
            {
                Left = new FieldSetter()
                {
                    Instance  = firstVar,
                    FieldName = fieldName
                },
                Right = secondVar
            };

            assignment.Left.FixedType = secondVar.ComputedType();
            AddOperation(SimpleOperations.LocalOperation.Kinds.SetField, assignment);
        }
コード例 #13
0
        private void SetUnaryOperator(string operatorName, EvaluatorStack evaluator)
        {
            var firstVar = evaluator.Stack.Pop();
            var addValue = new UnaryOperator(operatorName)
            {
                Left      = firstVar,
                FixedType = firstVar.ComputedType()
            };
            var result = SetNewVReg(evaluator);
            var assign = new Assignment()
            {
                Left  = result,
                Right = addValue
            };

            assign.Left.FixedType = addValue.ComputedType();
            AddOperation(SimpleOperations.LocalOperation.Kinds.Operator, assign);
        }
コード例 #14
0
        public void LoadReferenceInArray(EvaluatorStack evaluator)
        {
            var secondVar = evaluator.Stack.Pop();
            var firstVar  = evaluator.Stack.Pop();

            var result = SetNewVReg(evaluator);

            result.FixedType = firstVar.FixedType.GetElementType();
            var arrayVariable = new ArrayVariable(firstVar, secondVar);
            var assignment    = new Assignment()
            {
                Left  = result,
                Right = arrayVariable
            };

            result.FixedType = arrayVariable.GetElementType();
            AddOperation(SimpleOperations.LocalOperation.Kinds.GetArrayItem, assignment);
        }
コード例 #15
0
        public void LoadField(string fieldName, EvaluatorStack evaluator)
        {
            var firstVar = evaluator.Stack.Pop();

            var vreg = SetNewVReg(evaluator);

            vreg.FixedType = firstVar.ComputedType().LocateField(fieldName).FieldType;
            ProgramData.Instance.UpdateType(vreg.FixedType);
            var assignment = new Assignment
            {
                Left  = vreg,
                Right = new FieldGetter()
                {
                    FieldName = fieldName,
                    Instance  = firstVar
                }
            };

            AddOperation(SimpleOperations.LocalOperation.Kinds.GetField, assignment);
        }
コード例 #16
0
        public void CopyStackIntoLocalVariable(int value, EvaluatorStack evaluator)
        {
            var topVariable = evaluator.Stack.Peek();
            var newLocal    = new LocalVariable
            {
                Kind = VariableKind.Local,
                Id   = value
            };

            evaluator.Stack.Pop();
            _localVariables[value] = newLocal;
            var assingment = new Assignment
            {
                Left  = newLocal,
                Right = topVariable
            };

            newLocal.FixedType = topVariable.ComputedType();
            AddOperation(SimpleOperations.LocalOperation.Kinds.Assignment, assingment);
        }
コード例 #17
0
        public void ExtractNeededValuesFromStack(EvaluatorStack evaluatorStack)
        {
            var methodParams = Info.GetParameters();

            if (Info.IsConstructor)
            {
                Parameters.Insert(0, evaluatorStack.Pop());
                foreach (var t in methodParams)
                {
                    Parameters.Insert(1, evaluatorStack.Pop());
                }
                return;
            }
            foreach (var t in methodParams)
            {
                Parameters.Insert(0, evaluatorStack.Pop());
            }
            if (!Info.IsStatic)
            {
                Parameters.Insert(0, evaluatorStack.Pop());
            }
        }
コード例 #18
0
        public void Process(CrRuntimeLibrary crRuntime)
        {
            if (Kind != MethodKind.Default)
            {
                return;
            }
            if (Interpreted)
            {
                return;
            }
            if (HandlePlatformInvokeMethod(Method))
            {
                return;
            }
            if (Method.GetMethodBody() == null)
            {
                return;
            }
            var instructions = MethodBodyReader.GetInstructions(Method);

            var labelList = ComputeLabels(Method);

            MidRepresentation.Method = Method;


            MidRepresentation.Vars.SetupLocalVariables(Method);
            var evaluator        = new EvaluatorStack();
            var operationFactory = new MetaMidRepresentationOperationFactory(MidRepresentation, evaluator);

            for (var index = 0; index < instructions.Length; index++)
            {
                var instruction = instructions[index];
                EvaluateInstuction(instruction, operationFactory, labelList, crRuntime);
            }
            //Ensure.IsTrue(evaluator.Count == 0, "Stack not empty!");
            AnalyzeProperties.Setup(MidRepresentation.Vars.Arguments, MidRepresentation.Vars.VirtRegs,
                                    MidRepresentation.Vars.LocalVars);
            Interpreted = true;
        }
コード例 #19
0
        public void LoadLength(EvaluatorStack evaluator)
        {
            SetUnaryOperator(OpcodeOperatorNames.LoadLen, evaluator);

            evaluator.Top.FixedType = typeof(int);
        }
コード例 #20
0
 public void Ceq(EvaluatorStack evaluator)
 {
     SetBinaryOperator("ceq", evaluator);
 }
コード例 #21
0
 public MetaMidRepresentationOperationFactory(MetaMidRepresentation representation, EvaluatorStack evaluator)
 {
     _representation = representation;
     _evaluator      = evaluator;
 }
コード例 #22
0
 public void PushString(string value, EvaluatorStack evaluator)
 {
     AssignValueToStack(value, evaluator);
 }
コード例 #23
0
 public void Clt(EvaluatorStack evaluator)
 {
     SetBinaryOperator("clt", evaluator);
 }
コード例 #24
0
 public void PushDouble(double value, EvaluatorStack evaluator)
 {
     AssignValueToStack(value, evaluator);
 }
コード例 #25
0
 public void PushInt4(int value, EvaluatorStack evaluator)
 {
     AssignValueToStack(value, evaluator);
 }
コード例 #26
0
 public void BranchIfGreater(int jumpTo, EvaluatorStack evaluator)
 {
     BranchTwoOperators(jumpTo, evaluator, OpcodeBranchNames.Bgt);
 }
コード例 #27
0
 public void BranchIfLess(int jumpTo, EvaluatorStack evaluator)
 {
     BranchTwoOperators(jumpTo, evaluator, OpcodeBranchNames.Blt);
 }
コード例 #28
0
 public void BranchIfNotEqual(int jumpTo, EvaluatorStack evaluator)
 {
     BranchTwoOperators(jumpTo, evaluator, OpcodeBranchNames.Bne);
 }
コード例 #29
0
 public void ConvI4(EvaluatorStack evaluator)
 {
     SetUnaryOperator(OpcodeOperatorNames.ConvI4, evaluator);
     evaluator.Top.FixedType = typeof(int);
 }
コード例 #30
0
 public void ConvR8(EvaluatorStack evaluator)
 {
     SetUnaryOperator(OpcodeOperatorNames.ConvR8, evaluator);
     evaluator.Top.FixedType = typeof(double);
 }