Beispiel #1
0
 public string ToString(IDebuggerValue value)
 {
     return(debugger.Dispatcher.UI(() => {
         using (var eval = debugger.CreateEvalUI(this))
             return eval.ToString(value);
     }));
 }
Beispiel #2
0
        public IDebuggerValue Box(IDebuggerValue value) => debugger.Dispatcher.UI(() => {
            var valueTmp = (DebuggerValue)value;
            if (valueTmp.CorValue.IsGeneric)
            {
                var et = valueTmp.CorValue.ExactType;
                if (et != null && et.IsPrimitiveValueType)
                {
                    var type = GetPrimitiveType((CorElementType)et.ElementType);
                    Debug.Assert(type != null);
                    if (type != null)
                    {
                        value = CreateNoConstructorUI(type);
                        value.DereferencedValue.BoxedValue.Write(valueTmp.Read());
                        return(value);
                    }
                }
            }

            var boxedValue = eval.Box(((DebuggerValue)value).CorValue);
            if (boxedValue == null)
            {
                throw new ScriptException("Could not box the value");
            }
            return(new DebuggerValue(debugger, boxedValue));
        });
Beispiel #3
0
        public string ToString(IDebuggerValue value) => debugger.Dispatcher.UI(() => {
            var valueTmp = (DebuggerValue)value;
            var et       = valueTmp.CorValue.ExactType;
            if (et != null && et.IsPrimitiveValueType)
            {
                valueTmp = (DebuggerValue)Box(valueTmp);
            }

            var v       = valueTmp.CorValue;
            var objType = ((DebuggerType)appDomain.Object).CorType;
            var info    = objType.GetToStringMethod();
            Debug.Assert(info != null);
            if (info == null)
            {
                return(null);
            }
            var toStringFunc = objType.Class?.Module?.GetFunctionFromToken(info.Token);
            if (toStringFunc == null)
            {
                return(null);
            }
            if (v.IsReference && v.ElementType == dndbg.COM.CorDebug.CorElementType.ByRef)
            {
                v = v.NeuterCheckDereferencedValue;
            }
            if (v != null && v.IsGeneric && !v.IsHeap && v.ExactType.IsValueType)
            {
                Keep(v = eval.Box(v));
            }
            if (v == null)
            {
                return(null);
            }

            int hr;
            var res = eval.Call(toStringFunc, null, new DBG.CorValue[1] {
                v
            }, out hr);
            if (res == null || res.Value.WasException)
            {
                return(null);
            }
            var rv = res.Value.ResultOrException;
            if (rv == null || rv.IsNull)
            {
                return(null);
            }
            if (rv != null && rv.IsReference)
            {
                rv = rv.NeuterCheckDereferencedValue;
            }
            if (rv == null || !rv.IsString || rv.IsNull)
            {
                return(null);
            }
            return(rv.String);
        });
Beispiel #4
0
        public bool GetNullableValue(out IDebuggerValue value)
        {
            IDebuggerValue valueTmp = null;
            bool           res      = debugger.Dispatcher.UI(() => {
                CorValue corValue;
                bool res2 = this.CorValue.GetNullableValue(out corValue);
                valueTmp  = corValue == null ? null : new DebuggerValue(debugger, corValue);
                return(res2);
            });

            value = valueTmp;
            return(res);
        }
Beispiel #5
0
		public IDebuggerValue Box(IDebuggerValue value) => debugger.Dispatcher.UI(() => {
			var valueTmp = (DebuggerValue)value;
			if (valueTmp.CorValue.IsGeneric) {
				var et = valueTmp.CorValue.ExactType;
				if (et != null && et.IsPrimitiveValueType) {
					var type = GetPrimitiveType((CorElementType)et.ElementType);
					Debug.Assert(type != null);
					if (type != null) {
						value = CreateNoConstructorUI(type);
						value.DereferencedValue.BoxedValue.Write(valueTmp.Read());
						return value;
					}
				}
			}

			var boxedValue = eval.Box(((DebuggerValue)value).CorValue);
			if (boxedValue == null)
				throw new ScriptException("Could not box the value");
			return new DebuggerValue(debugger, boxedValue);
		});
Beispiel #6
0
 /// <summary>
 /// ToString()
 /// </summary>
 /// <param name="value">Owner <see cref="IDebuggerValue"/> instance</param>
 /// <param name="flags">Flags</param>
 /// <returns></returns>
 public string ToString(IDebuggerValue value, TypeFormatFlags flags)
 {
     return(value.ToString(this, flags));
 }
Beispiel #7
0
 /// <summary>
 /// Write this to <paramref name="output"/>
 /// </summary>
 /// <param name="output">Destination</param>
 /// <param name="value">Owner <see cref="IDebuggerValue"/> instance</param>
 /// <param name="flags">Flags</param>
 public void Write(ISyntaxHighlightOutput output, IDebuggerValue value, TypeFormatFlags flags)
 {
     value.Write(output, this, flags);
 }
Beispiel #8
0
		public bool GetNullableValue(out IDebuggerValue value) {
			IDebuggerValue valueTmp = null;
			bool res = debugger.Dispatcher.UI(() => {
				CorValue corValue;
				bool res2 = CorValue.GetNullableValue(out corValue);
				valueTmp = corValue == null ? null : new DebuggerValue(debugger, corValue);
				return res2;
			});
			value = valueTmp;
			return res;
		}
Beispiel #9
0
		public string ToString(IDebuggerValue value) {
			return debugger.Dispatcher.UI(() => {
				using (var eval = debugger.CreateEvalUI(this))
					return eval.ToString(value);
			});
		}
Beispiel #10
0
 /// <summary>
 /// ToString()
 /// </summary>
 /// <param name="value">Owner <see cref="IDebuggerValue"/> instance</param>
 /// <param name="flags">Flags</param>
 /// <returns></returns>
 public string ToString(IDebuggerValue value, TypeFormatFlags flags = TypeFormatFlags.Default) => value.ToString(this, flags);
Beispiel #11
0
 /// <summary>
 /// Write this to <paramref name="output"/>
 /// </summary>
 /// <param name="output">Destination</param>
 /// <param name="value">Owner <see cref="IDebuggerValue"/> instance</param>
 /// <param name="flags">Flags</param>
 public void Write(IOutputWriter output, IDebuggerValue value, TypeFormatFlags flags = TypeFormatFlags.Default) => value.Write(output, this, flags);
Beispiel #12
0
		public string ToString(IDebuggerValue value) {
			return debugger.Dispatcher.UI(() => {
				var valueTmp = (DebuggerValue)value;
				var et = valueTmp.CorValue.ExactType;
				if (et != null && et.IsPrimitiveValueType)
					valueTmp = (DebuggerValue)Box(valueTmp);

				var v = valueTmp.CorValue;
				var objType = ((DebuggerType)appDomain.Object).CorType;
				var info = objType.GetToStringMethod();
				Debug.Assert(info != null);
				if (info == null)
					return null;
				var objCls = objType.Class;
				var corLibMod = objCls == null ? null : objCls.Module;
				var toStringFunc = corLibMod == null ? null : corLibMod.GetFunctionFromToken(info.Token);
				if (toStringFunc == null)
					return null;
				if (v.IsReference && v.Type == dndbg.COM.CorDebug.CorElementType.ByRef)
					v = v.NeuterCheckDereferencedValue;
				if (v != null && v.IsGeneric && !v.IsHeap && v.ExactType.IsValueType)
					Keep(v = eval.Box(v));
				if (v == null)
					return null;

				int hr;
				var res = eval.Call(toStringFunc, null, new DBG.CorValue[1] { v }, out hr);
				if (res == null || res.Value.WasException)
					return null;
				var rv = res.Value.ResultOrException;
				if (rv == null || rv.IsNull)
					return null;
				if (rv != null && rv.IsReference)
					rv = rv.NeuterCheckDereferencedValue;
				if (rv == null || !rv.IsString || rv.IsNull)
					return null;
				return rv.String;
			});
		}