You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
316 lines
9.1 KiB
316 lines
9.1 KiB
3 years ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace ILRuntime.Runtime.Debugger
|
||
|
{
|
||
|
public enum VariableTypes
|
||
|
{
|
||
|
Normal,
|
||
|
FieldReference,
|
||
|
PropertyReference,
|
||
|
TypeReference,
|
||
|
IndexAccess,
|
||
|
Invocation,
|
||
|
Integer,
|
||
|
Boolean,
|
||
|
String,
|
||
|
Value,
|
||
|
Class,
|
||
|
Null,
|
||
|
Error,
|
||
|
NotFound,
|
||
|
Timeout,
|
||
|
Pending,
|
||
|
}
|
||
|
|
||
|
public enum ValueTypes
|
||
|
{
|
||
|
Object,
|
||
|
Null,
|
||
|
Integer,
|
||
|
Boolean,
|
||
|
String,
|
||
|
}
|
||
|
|
||
|
public class VariableReference
|
||
|
{
|
||
|
public long Address { get; set; }
|
||
|
public VariableTypes Type { get; set; }
|
||
|
public int Offset { get; set; }
|
||
|
public string Name { get; set; }
|
||
|
public VariableReference Parent { get; set; }
|
||
|
public VariableReference[] Parameters { get; set; }
|
||
|
|
||
|
public Type ValueType { get; set; }
|
||
|
public object Value { get; set; }
|
||
|
public bool Conditional { get; set; } // 运算符?.为true
|
||
|
|
||
|
public string FullName
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (Parent != null)
|
||
|
{
|
||
|
switch (Type)
|
||
|
{
|
||
|
case VariableTypes.FieldReference:
|
||
|
case VariableTypes.PropertyReference:
|
||
|
return string.Format("{0}.{1}", Parent.FullName, Name);
|
||
|
case VariableTypes.IndexAccess:
|
||
|
return string.Format("{0}[{1}]", Parent.FullName, Parameters[0].FullName);
|
||
|
case VariableTypes.Error:
|
||
|
return Name;
|
||
|
default:
|
||
|
throw new NotImplementedException();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch (Type)
|
||
|
{
|
||
|
case VariableTypes.String:
|
||
|
return string.Format("\"{0}\"", Name);
|
||
|
case VariableTypes.Integer:
|
||
|
return Offset.ToString();
|
||
|
case VariableTypes.Boolean:
|
||
|
return (Offset == 1).ToString();
|
||
|
default:
|
||
|
return Name;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static VariableReference Null = new VariableReference
|
||
|
{
|
||
|
Type = VariableTypes.Null,
|
||
|
Name = "null"
|
||
|
};
|
||
|
|
||
|
public static VariableReference True = new VariableReference
|
||
|
{
|
||
|
Type = VariableTypes.Boolean,
|
||
|
Name = "true",
|
||
|
Offset = 1,
|
||
|
};
|
||
|
|
||
|
public static VariableReference False = new VariableReference
|
||
|
{
|
||
|
Type = VariableTypes.Boolean,
|
||
|
Name = "false",
|
||
|
Offset = 0
|
||
|
};
|
||
|
|
||
|
public static VariableReference GetInteger(int val)
|
||
|
{
|
||
|
var res = new VariableReference();
|
||
|
res.Type = VariableTypes.Integer;
|
||
|
res.Name = "";
|
||
|
res.Offset = val;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public static VariableReference GetString(string val)
|
||
|
{
|
||
|
var res = new VariableReference();
|
||
|
res.Type = VariableTypes.String;
|
||
|
res.Name = val;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public static VariableReference GetMember(string name, VariableReference parent)
|
||
|
{
|
||
|
var res = new VariableReference();
|
||
|
res.Type = VariableTypes.FieldReference;
|
||
|
res.Name = name;
|
||
|
res.Parent = parent;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class VariableInfo
|
||
|
{
|
||
|
public long Address { get; set; }
|
||
|
public VariableTypes Type { get; set; }
|
||
|
public string Name { get; set; }
|
||
|
public string TypeName { get; set; }
|
||
|
public string Value { get; set; }
|
||
|
public ValueTypes ValueType { get; set; }
|
||
|
public bool Expandable { get; set; }
|
||
|
public bool IsPrivate { get; set; }
|
||
|
public bool IsProtected { get; set; }
|
||
|
public int Offset { get; set;}
|
||
|
public Type ValueObjType { get; set; }
|
||
|
|
||
|
public static VariableInfo FromObject(object obj, bool retriveType = false)
|
||
|
{
|
||
|
VariableInfo info = new VariableInfo();
|
||
|
info.Name = "";
|
||
|
if (obj != null)
|
||
|
{
|
||
|
info.Value = obj.ToString();
|
||
|
if(obj is int)
|
||
|
{
|
||
|
info.ValueType = ValueTypes.Integer;
|
||
|
}
|
||
|
else if(obj is bool)
|
||
|
{
|
||
|
info.ValueType = ValueTypes.Boolean;
|
||
|
info.Value = info.Value.ToLower(); // 小写的true或false
|
||
|
}
|
||
|
else if(obj is string)
|
||
|
{
|
||
|
info.ValueType = ValueTypes.String;
|
||
|
}
|
||
|
if (retriveType)
|
||
|
{
|
||
|
if (obj is Runtime.Intepreter.ILTypeInstance)
|
||
|
{
|
||
|
info.TypeName = ((Intepreter.ILTypeInstance)obj).Type.FullName;
|
||
|
}
|
||
|
else if (obj is Enviorment.CrossBindingAdaptorType)
|
||
|
{
|
||
|
info.TypeName = ((Enviorment.CrossBindingAdaptorType)obj).ILInstance.Type.FullName;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
info.TypeName = obj.GetType().FullName;
|
||
|
}
|
||
|
}
|
||
|
info.Expandable = !obj.GetType().IsPrimitive && !(obj is string);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
info.Value = "null";
|
||
|
info.ValueType = ValueTypes.Null;
|
||
|
}
|
||
|
|
||
|
return info;
|
||
|
}
|
||
|
|
||
|
public static VariableInfo NullReferenceExeption = new VariableInfo
|
||
|
{
|
||
|
Type = VariableTypes.Error,
|
||
|
Name = "",
|
||
|
TypeName = "",
|
||
|
Value = "NullReferenceException"
|
||
|
};
|
||
|
|
||
|
public static VariableInfo NullReferenceExeptionWithName(string name)
|
||
|
{
|
||
|
return new VariableInfo
|
||
|
{
|
||
|
Type = VariableTypes.Error,
|
||
|
Name = "",
|
||
|
TypeName = "",
|
||
|
Value = name + " is Null"
|
||
|
};
|
||
|
}
|
||
|
|
||
|
public static VariableInfo RequestTimeout = new VariableInfo
|
||
|
{
|
||
|
Type = VariableTypes.Timeout,
|
||
|
Name = "",
|
||
|
TypeName = "",
|
||
|
Value = "RequestTimeoutException"
|
||
|
};
|
||
|
|
||
|
public static VariableInfo Null = new VariableInfo
|
||
|
{
|
||
|
Type = VariableTypes.Null,
|
||
|
Name = "",
|
||
|
TypeName = "",
|
||
|
Value = "null",
|
||
|
ValueType = ValueTypes.Null
|
||
|
};
|
||
|
|
||
|
public static VariableInfo True = new VariableInfo
|
||
|
{
|
||
|
Type = VariableTypes.Boolean,
|
||
|
Name = "",
|
||
|
TypeName = "System.Boolean",
|
||
|
Value = "true",
|
||
|
ValueType = ValueTypes.Boolean,
|
||
|
ValueObjType = typeof(bool),
|
||
|
};
|
||
|
|
||
|
public static VariableInfo False = new VariableInfo
|
||
|
{
|
||
|
Type = VariableTypes.Boolean,
|
||
|
Name = "",
|
||
|
TypeName = "System.Boolean",
|
||
|
Value = "false",
|
||
|
ValueType = ValueTypes.Boolean,
|
||
|
ValueObjType = typeof(bool),
|
||
|
};
|
||
|
|
||
|
public static VariableInfo GetCannotFind(string name)
|
||
|
{
|
||
|
var res = new VariableInfo
|
||
|
{
|
||
|
Type = VariableTypes.NotFound,
|
||
|
TypeName = "",
|
||
|
};
|
||
|
res.Name = name;
|
||
|
res.Value = string.Format("Cannot find \"{0}\" in current scope.", name);
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public static VariableInfo GetInteger(int val)
|
||
|
{
|
||
|
var res = new VariableInfo();
|
||
|
res.Type = VariableTypes.Integer;
|
||
|
res.Value = val.ToString();
|
||
|
res.TypeName = "System.Int32";
|
||
|
res.Name = "";
|
||
|
res.ValueType = ValueTypes.Integer;
|
||
|
res.ValueObjType = typeof(int);
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public static VariableInfo GetString(string val)
|
||
|
{
|
||
|
var res = new VariableInfo();
|
||
|
res.Type = VariableTypes.String;
|
||
|
res.Value = val;
|
||
|
res.TypeName = "System.String";
|
||
|
res.Name = "";
|
||
|
res.ValueType = ValueTypes.String;
|
||
|
res.ValueObjType = typeof(string);
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public static VariableInfo GetException(Exception ex)
|
||
|
{
|
||
|
var res = new VariableInfo();
|
||
|
res.Type = VariableTypes.Error;
|
||
|
res.Value = ex.ToString();
|
||
|
res.TypeName = ex.GetType().FullName;
|
||
|
res.Name = "";
|
||
|
res.ValueType = ValueTypes.String;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
public static VariableInfo GetError(string errorText)
|
||
|
{
|
||
|
var res = new VariableInfo();
|
||
|
res.Type = VariableTypes.Error;
|
||
|
res.Value = errorText;
|
||
|
res.TypeName = "";
|
||
|
res.Name = "";
|
||
|
res.ValueType = ValueTypes.String;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
}
|
||
|
}
|