private EvaluatedExpression GetArrayElement(EvaluatedExpression array, EvaluatedExpression index)
        {
            Contract.Requires <ArgumentNullException>(array != null, "array");
            Contract.Requires <ArgumentNullException>(index != null, "index");
            Contract.Ensures(Contract.Result <EvaluatedExpression>() != null);

            IArrayReference arrayReference = array.Value as IArrayReference;

            if (arrayReference == null)
            {
                throw new InvalidOperationException();
            }

            long indexValue;

            if (TryGetIntegralValue(index.Value, out indexValue))
            {
                string           name            = string.Format("[{0}]", indexValue);
                string           fullName        = string.Format("({0})[{1}]", array.FullName, index.FullName);
                ILocalVariable   localVariable   = array.LocalVariable;
                IObjectReference referencer      = array.Value as IObjectReference;
                IField           field           = array.Field;
                IMethod          method          = null;
                IValue           value           = arrayReference.GetValue((int)indexValue);
                IType            valueType       = ((IArrayType)arrayReference.GetReferenceType()).GetComponentType();
                bool             strongReference = false;
                return(new EvaluatedExpression(name, fullName, localVariable, referencer, field, method, (int)indexValue, value, valueType, strongReference, array.HasSideEffects || index.HasSideEffects));
            }

            throw new InvalidOperationException();
        }
            private void ProcessLocalVariable([NotNull] ILocalVariable variable)
            {
                if (variable.IsStatic)
                {
                    return;
                }
                if (variable.IsConstant)
                {
                    return;
                }

                var declarations = variable.GetDeclarations();

                if (declarations.Count == 1)
                {
                    var declaration = declarations[0];
                    foreach (var closure in myClosures)
                    {
                        if (closure.Contains(declaration) && !(closure is IQueryParameterPlatform))
                        {
                            continue;
                        }

                        AddCapture(closure, variable);
                    }
                }
            }
Example #3
0
            private void ProcessLocalVariable([NotNull] ILocalVariable variable)
            {
                if (variable.IsStatic)
                {
                    return;
                }
                if (variable.IsConstant)
                {
                    return;
                }

                var declaration = variable.GetSingleDeclaration <IDeclaration>();

                if (declaration != null)
                {
                    foreach (var closure in myClosures)
                    {
                        if (closure.Contains(declaration) && !(closure is IQueryParameterPlatform))
                        {
                            continue;
                        }

                        AddCapture(closure, variable);
                    }
                }
            }
Example #4
0
        /// <summary>
        /// Process local variable declaration.
        /// </summary>
        /// <param name="localVariableDeclaration">
        /// The local variable declaration.
        /// </param>
        private static void ProcessLocalVariableDeclaration(ILocalVariableDeclaration localVariableDeclaration)
        {
            IMultipleLocalVariableDeclaration multipleDeclaration = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(localVariableDeclaration);

            if (multipleDeclaration.Declarators.Count > 1)
            {
                IType newType = CSharpTypeFactory.CreateType(multipleDeclaration.TypeUsage);

                using (WriteLockCookie.Create(true))
                {
                    multipleDeclaration.SetTypeUsage(CSharpElementFactory.GetInstance(localVariableDeclaration.GetPsiModule()).CreateTypeUsageNode(newType));
                }
            }
            else
            {
                ILocalVariable variable = localVariableDeclaration.DeclaredElement;
                if (variable != null)
                {
                    if (!multipleDeclaration.IsVar)
                    {
                        using (WriteLockCookie.Create(true))
                        {
                            localVariableDeclaration.SetType(variable.Type);
                        }
                    }
                }
            }
        }
        public IValue GetValue(ILocalVariable variable)
        {
            Contract.Requires<ArgumentNullException>(variable != null, "variable");
            Contract.Requires<VirtualMachineMismatchException>(this.GetVirtualMachine().Equals(variable.GetVirtualMachine()));
            Contract.Ensures(Contract.Result<IValue>() == null || this.GetVirtualMachine().Equals(Contract.Result<IValue>().GetVirtualMachine()));

            throw new NotImplementedException();
        }
        public void SetValue(ILocalVariable variable, IValue value)
        {
            Contract.Requires <ArgumentNullException>(variable != null, "variable");
            Contract.Requires <VirtualMachineMismatchException>(this.GetVirtualMachine().Equals(variable.GetVirtualMachine()));
            Contract.Requires <VirtualMachineMismatchException>(value == null || this.GetVirtualMachine().Equals(value.GetVirtualMachine()));

            throw new NotImplementedException();
        }
        public IValue GetValue(ILocalVariable variable)
        {
            Contract.Requires <ArgumentNullException>(variable != null, "variable");
            Contract.Requires <VirtualMachineMismatchException>(this.GetVirtualMachine().Equals(variable.GetVirtualMachine()));
            Contract.Ensures(Contract.Result <IValue>() == null || this.GetVirtualMachine().Equals(Contract.Result <IValue>().GetVirtualMachine()));

            throw new NotImplementedException();
        }
Example #8
0
 public EvaluatedExpression(string name, string fullName, ILocalVariable variable, int index, IStrongValueHandle <IValue> value, bool hasSideEffects)
     : this(name, fullName, variable, default(IObjectReference), default(IField), default(IMethod), index, value != null ? value.Value : null, variable.GetLocalType(), true, hasSideEffects)
 {
     Contract.Requires <ArgumentNullException>(name != null, "name");
     Contract.Requires <ArgumentNullException>(fullName != null, "fullName");
     Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(name));
     Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(fullName));
 }
Example #9
0
 public EvaluatedExpression(string name, string fullName, ILocalVariable variable, IValue value, bool hasSideEffects)
     : this(name, fullName, default(ILocalVariable), default(IObjectReference), default(IField), default(IMethod), default(int?), value, variable.GetLocalType(), false, hasSideEffects)
 {
     Contract.Requires <ArgumentNullException>(name != null, "name");
     Contract.Requires <ArgumentNullException>(fullName != null, "fullName");
     Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(name));
     Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(fullName));
 }
Example #10
0
        public void SetValue(ILocalVariable variable, IValue value)
        {
            Contract.Requires<ArgumentNullException>(variable != null, "variable");
            Contract.Requires<VirtualMachineMismatchException>(this.GetVirtualMachine().Equals(variable.GetVirtualMachine()));
            Contract.Requires<VirtualMachineMismatchException>(value == null || this.GetVirtualMachine().Equals(value.GetVirtualMachine()));

            throw new NotImplementedException();
        }
        private bool TryGetValueInScope(string name, out EvaluatedExpression result)
        {
            Contract.Requires <ArgumentNullException>(name != null, "name");
            Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(name));

            result = null;

            IMethod method = _stackFrame.GetLocation().GetMethod();

            // check the stack frame
            if (_stackFrame.GetHasVariableInfo())
            {
                ILocalVariable variable = _stackFrame.GetVisibleVariableByName(name);
                if (variable != null)
                {
                    result = new EvaluatedExpression(name, name, variable, _stackFrame.GetValue(variable), false);
                    return(true);
                }

                ReadOnlyCollection <ILocalVariable> variables = method.GetVariablesByName(name);
                if (variables.Count > 0)
                {
                    return(false);
                }
                //throw new InvalidOperationException("Evaluation failed because the variable is not visible in the current scope.");
            }

            // check the enclosing object for a visible field
            IReferenceType declaringType = method.GetDeclaringType();
            IField         field         = declaringType.GetFieldByName(name);

            if (field != null)
            {
                if (field.GetIsStatic())
                {
                    result = new EvaluatedExpression(name, name, null, field, declaringType.GetValue(field), false);
                    return(true);
                }

                if (method.GetIsStatic())
                {
                    return(false);
                }
                //throw new InvalidOperationException("The instance field cannot be accessed from a static method.");

                result = new EvaluatedExpression(name, name, _stackFrame.GetThisObject(), field, _stackFrame.GetThisObject().GetValue(field), false);
                return(true);
            }

            // check the outer object?

            return(false);
            //throw new NotImplementedException();
        }
Example #12
0
        public IValue GetValue(ILocalVariable variable)
        {
            LocalVariable localVariable = variable as LocalVariable;
            if (localVariable == null)
                throw new VirtualMachineMismatchException();

            int[] slots = { localVariable.Slot };
            Types.Value[] values;
            DebugErrorHandler.ThrowOnFailure(VirtualMachine.ProtocolService.GetValues(out values, _thread.ThreadId, _frameId, slots));
            return VirtualMachine.GetMirrorOf(values[0]);
        }
        public bool Equals(ILocalVariable other)
        {
            LocalVariable localVariable = other as LocalVariable;

            if (localVariable == null)
            {
                return(false);
            }

            return(this.Slot == localVariable.Slot &&
                   this.Method.Equals(localVariable.Method));
        }
Example #14
0
        /// <summary>
        /// Process for each variable declaration.
        /// </summary>
        /// <param name="singleVariableDesignation">
        /// The for each variable declaration.
        /// </param>
        private static void ProcessSingleVariableDesignation(ISingleVariableDesignation singleVariableDesignation)
        {
            ILocalVariable variable = singleVariableDesignation.DeclaredElement;

            if (!singleVariableDesignation.IsVar)
            {
                using (WriteLockCookie.Create(true))
                {
                    singleVariableDesignation.SetType(variable.Type);
                }
            }
        }
Example #15
0
        private void MarkUseDef(ILocalVariable tree, IList <LocalVariableDescriptor> localVariableTable)
        {
            var localNumber = tree.LocalNumber;
            var local       = localVariableTable[localNumber];

            // Need to get def/use from tree too
            // So assignment is a definition, everything else is a use.

            // if (isUse && not in current def set)
            //   Add to Current Use set

            // if (isDef)
            //   Add to Current Def set
        }
Example #16
0
        public IValue GetValue(ILocalVariable variable)
        {
            LocalVariable localVariable = variable as LocalVariable;

            if (localVariable == null)
            {
                throw new VirtualMachineMismatchException();
            }

            int[]         slots = { localVariable.Slot };
            Types.Value[] values;
            DebugErrorHandler.ThrowOnFailure(VirtualMachine.ProtocolService.GetValues(out values, _thread.ThreadId, _frameId, slots));
            return(VirtualMachine.GetMirrorOf(values[0]));
        }
Example #17
0
        /// <summary>
        /// Process for each variable declaration.
        /// </summary>
        /// <param name="foreachVariableDeclaration">
        /// The for each variable declaration.
        /// </param>
        private static void ProcessForeachVariableDeclaration(IForeachVariableDeclaration foreachVariableDeclaration)
        {
            ILocalVariable variable = foreachVariableDeclaration.DeclaredElement;

            if (variable != null)
            {
                if (!foreachVariableDeclaration.IsVar)
                {
                    using (WriteLockCookie.Create(true))
                    {
                        foreachVariableDeclaration.SetType(variable.Type);
                    }
                }
            }
        }
Example #18
0
        public EvaluatedExpression(string name, string fullName, ILocalVariable localVariable, IObjectReference referencer, IField field, IMethod method, int?index, IValue value, IType valueType, bool strongReference, bool hasSideEffects)
        {
            Contract.Requires <ArgumentNullException>(name != null, "name");
            Contract.Requires <ArgumentNullException>(fullName != null, "fullName");
            Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(name));
            Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(fullName));

            _name            = name;
            _fullName        = fullName;
            _localVariable   = localVariable;
            _referencer      = referencer;
            _field           = field;
            _method          = method;
            _index           = index;
            _value           = value;
            _valueType       = valueType;
            _strongReference = strongReference;
            _hasSideEffects  = hasSideEffects;
        }
Example #19
0
        public void SetValue(ILocalVariable variable, IValue value)
        {
            LocalVariable localVariable = variable as LocalVariable;

            if (localVariable == null)
            {
                throw new VirtualMachineMismatchException();
            }

            Value trueValue = value as Value;

            if (trueValue == null && value != null)
            {
                throw new VirtualMachineMismatchException();
            }

            int[]         slots  = { localVariable.Slot };
            Types.Value[] values = { Value.ToNetworkValue(trueValue) };
            DebugErrorHandler.ThrowOnFailure(VirtualMachine.ProtocolService.SetValues(_thread.ThreadId, _frameId, slots, values));
        }
        protected override void DoGenerate(CilEmitter emitter)
        {
            ILabel comparisonLabel = emitter.GenerateLabel();
            ILabel contentsLabel   = emitter.GenerateLabel();

            variable = emitter.EmitLocalVarDeclaration("STEPS_LOOP_VAR" + stepCountExpr.lexline + "_" + stepCountExpr.lexline, typeof(int));
            stepCountExpr.EmitRValue(emitter);
            variable.EmitAssignment();

            comparisonLabel.Emit();

            variable.EmitValue();
            emitter.EmitInt32(0);
            emitter.EmitComparison(">");

            after.EmitJumpIfFalse();
            contentsLabel.Emit();

            statement.Generate(emitter, contentsLabel, comparisonLabel);

            variable.EmitValue();
            emitter.EmitInt32(1);
            emitter.EmitBinaryOperator("-");
            variable.EmitAssignment();

            comparisonLabel.EmitJump();

            /*
             *
             * logicalExpression.jumping(0, after)
             *
             * create label
             *
             * emit label
             *
             * stmt.Gen(label, begin)
             *
             * emit goto begin
             *
             */
        }
        // a * 3 + b * 2 - c
        private void TestComplexExpression()
        {
            // Initialize  variables a, b and c

            // a = 5
            ILocalVariable aVar = emitter.EmitLocalVarDeclaration("A", typeof(int));

            emitter.EmitInt32(5);
            aVar.EmitAssignment();

            // b = 6
            ILocalVariable bVar = emitter.EmitLocalVarDeclaration("B", typeof(int));

            emitter.EmitInt32(6);
            bVar.EmitAssignment();

            // c = 7
            ILocalVariable cVar = emitter.EmitLocalVarDeclaration("B", typeof(int));

            emitter.EmitInt32(7);
            cVar.EmitAssignment();

            // Emit lhs R Value
            aVar.EmitValue();
            emitter.EmitInt32(3);
            emitter.EmitBinaryOperator("*");

            // Emit rhs R Value
            bVar.EmitValue();
            emitter.EmitInt32(2);
            emitter.EmitBinaryOperator("*");

            emitter.EmitBinaryOperator("+");

            cVar.EmitValue();
            emitter.EmitBinaryOperator("-");

            emitter.EmitWrite(typeof(int));
        }
Example #22
0
 public LocalVariableValidator(ILocalVariable variable)
 {
     _variable = variable;
 }
 public bool Equals(ILocalVariable other)
 {
     throw new NotImplementedException();
 }
Example #24
0
        public void SetValue(ILocalVariable variable, IValue value)
        {
            LocalVariable localVariable = variable as LocalVariable;
            if (localVariable == null)
                throw new VirtualMachineMismatchException();

            Value trueValue = value as Value;
            if (trueValue == null && value != null)
                throw new VirtualMachineMismatchException();

            int[] slots = { localVariable.Slot };
            Types.Value[] values = { Value.ToNetworkValue(trueValue) };
            DebugErrorHandler.ThrowOnFailure(VirtualMachine.ProtocolService.SetValues(_thread.ThreadId, _frameId, slots, values));
        }
        private EvaluatedExpression GetValueInScope(string name)
        {
            Contract.Requires <ArgumentNullException>(name != null, "name");
            Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(name));

            IMethod method = _stackFrame.GetLocation().GetMethod();

            // check the stack frame
            if (_stackFrame.GetHasVariableInfo())
            {
                ILocalVariable variable = _stackFrame.GetVisibleVariableByName(name);
                if (variable != null)
                {
                    return(new EvaluatedExpression(name, name, variable, _stackFrame.GetValue(variable), false));
                }

                ReadOnlyCollection <ILocalVariable> variables = method.GetVariablesByName(name);
                if (variables.Count > 0)
                {
                    throw new InvalidOperationException("Evaluation failed because the variable is not visible in the current scope.");
                }
            }

            // check the enclosing object for a visible field
            IReferenceType declaringType = method.GetDeclaringType();
            IField         field         = declaringType.GetFieldByName(name);

            if (field != null)
            {
                if (field.GetIsStatic())
                {
                    return(new EvaluatedExpression(name, name, null, field, declaringType.GetValue(field), false));
                }

                if (method.GetIsStatic())
                {
                    throw new InvalidOperationException("The instance field cannot be accessed from a static method.");
                }

                return(new EvaluatedExpression(name, name, _stackFrame.GetThisObject(), field, _stackFrame.GetThisObject().GetValue(field), false));
            }

            // check the outer object
            IField           outerClassField     = declaringType.GetFieldByName("this$0");
            IObjectReference nestedClassInstance = null;

            while (outerClassField != null)
            {
                if (nestedClassInstance == null)
                {
                    nestedClassInstance = _stackFrame.GetThisObject();
                }
                else
                {
                    nestedClassInstance = nestedClassInstance.GetValue(outerClassField) as IObjectReference;
                }

                if (nestedClassInstance == null)
                {
                    break;
                }

                // what if this$0 is defined in a superclass?
                IClassType fieldType = outerClassField.GetFieldType() as IClassType;
                field = fieldType.GetFieldByName(name);
                if (field != null)
                {
                    if (field.GetIsStatic())
                    {
                        return(new EvaluatedExpression(name, name, null, field, fieldType.GetValue(field), false));
                    }

                    if (method.GetIsStatic())
                    {
                        throw new InvalidOperationException("The instance field cannot be accessed from a static method.");
                    }

                    return(new EvaluatedExpression(name, name, nestedClassInstance, field, nestedClassInstance.GetValue(field), false));
                }

                outerClassField = fieldType.GetFieldByName("this$0");
            }

            throw new InvalidOperationException("No member by this name is available in the current scope.");
        }
Example #26
0
        public bool Equals(ILocalVariable other)
        {
            LocalVariable localVariable = other as LocalVariable;
            if (localVariable == null)
                return false;

            return this.Slot == localVariable.Slot
                && this.Method.Equals(localVariable.Method);
        }
Example #27
0
 public RuntimeVariableBinder(ILocalVariable variable, System.Runtime.CompilerServices.IRuntimeVariables variables)
 {
     this.variable  = variable;
     this.variables = variables;
 }
Example #28
0
 /// <summary>
 /// Извлечение числа из переменной.
 /// Поддерживает извлечение из диапазона чисел. Разделители: '-', ':', ';', ' '.
 /// </summary>
 public static int ExtractNumber(this ILocalVariable variable, bool throwArgumentException = false)
 => variable.Value.ExtractNumber(throwArgumentException);
Example #29
0
 public bool Equals(ILocalVariable other)
 {
     throw new NotImplementedException();
 }
Example #30
0
 public static LocalVariableValidator GetValidator(this ILocalVariable variable) => new LocalVariableValidator(variable);