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); } } }
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); } } }
/// <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(); }
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)); }
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)); }
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(); }
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)); }
/// <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); } } }
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 }
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])); }
/// <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); } } } }
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; }
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)); }
public LocalVariableValidator(ILocalVariable variable) { _variable = variable; }
public bool Equals(ILocalVariable other) { throw new NotImplementedException(); }
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."); }
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); }
public RuntimeVariableBinder(ILocalVariable variable, System.Runtime.CompilerServices.IRuntimeVariables variables) { this.variable = variable; this.variables = variables; }
/// <summary> /// Извлечение числа из переменной. /// Поддерживает извлечение из диапазона чисел. Разделители: '-', ':', ';', ' '. /// </summary> public static int ExtractNumber(this ILocalVariable variable, bool throwArgumentException = false) => variable.Value.ExtractNumber(throwArgumentException);
public static LocalVariableValidator GetValidator(this ILocalVariable variable) => new LocalVariableValidator(variable);