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.
315 lines
9.1 KiB
315 lines
9.1 KiB
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; |
|
} |
|
} |
|
}
|
|
|