VariableInfo.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ILRuntime.Runtime.Debugger
  6. {
  7. public enum VariableTypes
  8. {
  9. Normal,
  10. FieldReference,
  11. PropertyReference,
  12. TypeReference,
  13. IndexAccess,
  14. Invocation,
  15. Integer,
  16. Boolean,
  17. String,
  18. Null,
  19. Error,
  20. NotFound,
  21. Timeout,
  22. Pending,
  23. }
  24. public enum ValueTypes
  25. {
  26. Object,
  27. Null,
  28. Integer,
  29. Boolean,
  30. String,
  31. }
  32. public class VariableReference
  33. {
  34. public long Address { get; set; }
  35. public VariableTypes Type { get; set; }
  36. public int Offset { get; set; }
  37. public string Name { get; set; }
  38. public VariableReference Parent { get; set; }
  39. public VariableReference[] Parameters { get; set; }
  40. public string FullName
  41. {
  42. get
  43. {
  44. if (Parent != null)
  45. {
  46. switch (Type)
  47. {
  48. case VariableTypes.FieldReference:
  49. case VariableTypes.PropertyReference:
  50. return string.Format("{0}.{1}", Parent.FullName, Name);
  51. case VariableTypes.IndexAccess:
  52. return string.Format("{0}[{1}]", Parent.FullName, Parameters[0].FullName);
  53. case VariableTypes.Error:
  54. return Name;
  55. default:
  56. throw new NotImplementedException();
  57. }
  58. }
  59. else
  60. {
  61. switch (Type)
  62. {
  63. case VariableTypes.String:
  64. return string.Format("\"{0}\"", Name);
  65. case VariableTypes.Integer:
  66. return Offset.ToString();
  67. case VariableTypes.Boolean:
  68. return (Offset == 1).ToString();
  69. default:
  70. return Name;
  71. }
  72. }
  73. }
  74. }
  75. public static VariableReference Null = new VariableReference
  76. {
  77. Type = VariableTypes.Null,
  78. Name = "null"
  79. };
  80. public static VariableReference True = new VariableReference
  81. {
  82. Type = VariableTypes.Boolean,
  83. Name = "true",
  84. Offset = 1,
  85. };
  86. public static VariableReference False = new VariableReference
  87. {
  88. Type = VariableTypes.Boolean,
  89. Name = "false",
  90. Offset = 0
  91. };
  92. public static VariableReference GetInteger(int val)
  93. {
  94. var res = new VariableReference();
  95. res.Type = VariableTypes.Integer;
  96. res.Name = "";
  97. res.Offset = val;
  98. return res;
  99. }
  100. public static VariableReference GetString(string val)
  101. {
  102. var res = new VariableReference();
  103. res.Type = VariableTypes.String;
  104. res.Name = val;
  105. return res;
  106. }
  107. public static VariableReference GetMember(string name, VariableReference parent)
  108. {
  109. var res = new VariableReference();
  110. res.Type = VariableTypes.FieldReference;
  111. res.Name = name;
  112. res.Parent = parent;
  113. return res;
  114. }
  115. }
  116. public class VariableInfo
  117. {
  118. public long Address { get; set; }
  119. public VariableTypes Type { get; set; }
  120. public string Name { get; set; }
  121. public string TypeName { get; set; }
  122. public string Value { get; set; }
  123. public ValueTypes ValueType { get; set; }
  124. public bool Expandable { get; set; }
  125. public bool IsPrivate { get; set; }
  126. public bool IsProtected { get; set; }
  127. public int Offset { get; set;}
  128. public static VariableInfo FromObject(object obj, bool retriveType = false)
  129. {
  130. VariableInfo info = new VariableInfo();
  131. info.Name = "";
  132. if (obj != null)
  133. {
  134. info.Value = obj.ToString();
  135. if(obj is int)
  136. {
  137. info.ValueType = ValueTypes.Integer;
  138. }
  139. else if(obj is bool)
  140. {
  141. info.ValueType = ValueTypes.Boolean;
  142. }
  143. else if(obj is string)
  144. {
  145. info.ValueType = ValueTypes.String;
  146. }
  147. if (retriveType)
  148. {
  149. if (obj is Runtime.Intepreter.ILTypeInstance)
  150. {
  151. info.TypeName = ((Intepreter.ILTypeInstance)obj).Type.FullName;
  152. }
  153. else if (obj is Enviorment.CrossBindingAdaptorType)
  154. {
  155. info.TypeName = ((Enviorment.CrossBindingAdaptorType)obj).ILInstance.Type.FullName;
  156. }
  157. else
  158. {
  159. info.TypeName = obj.GetType().FullName;
  160. }
  161. }
  162. info.Expandable = !obj.GetType().IsPrimitive && !(obj is string);
  163. }
  164. else
  165. {
  166. info.Value = "null";
  167. info.ValueType = ValueTypes.Null;
  168. }
  169. return info;
  170. }
  171. public static VariableInfo NullReferenceExeption = new VariableInfo
  172. {
  173. Type = VariableTypes.Error,
  174. Name = "",
  175. TypeName = "",
  176. Value = "NullReferenceException"
  177. };
  178. public static VariableInfo RequestTimeout = new VariableInfo
  179. {
  180. Type = VariableTypes.Timeout,
  181. Name = "",
  182. TypeName = "",
  183. Value = "RequestTimeoutException"
  184. };
  185. public static VariableInfo Null = new VariableInfo
  186. {
  187. Type = VariableTypes.Null,
  188. Name = "",
  189. TypeName = "",
  190. Value = "null",
  191. ValueType = ValueTypes.Null
  192. };
  193. public static VariableInfo True = new VariableInfo
  194. {
  195. Type = VariableTypes.Boolean,
  196. Name = "",
  197. TypeName = "System.Boolean",
  198. Value = "true",
  199. ValueType = ValueTypes.Boolean
  200. };
  201. public static VariableInfo False = new VariableInfo
  202. {
  203. Type = VariableTypes.Boolean,
  204. Name = "",
  205. TypeName = "System.Boolean",
  206. Value = "false",
  207. ValueType = ValueTypes.Boolean
  208. };
  209. public static VariableInfo GetCannotFind(string name)
  210. {
  211. var res = new VariableInfo
  212. {
  213. Type = VariableTypes.NotFound,
  214. TypeName = "",
  215. };
  216. res.Name = name;
  217. res.Value = string.Format("Cannot find {0} in current scope.", name);
  218. return res;
  219. }
  220. public static VariableInfo GetInteger(int val)
  221. {
  222. var res = new VariableInfo();
  223. res.Type = VariableTypes.Integer;
  224. res.Value = val.ToString();
  225. res.TypeName = "System.Int32";
  226. res.Name = "";
  227. res.ValueType = ValueTypes.Integer;
  228. return res;
  229. }
  230. public static VariableInfo GetString(string val)
  231. {
  232. var res = new VariableInfo();
  233. res.Type = VariableTypes.String;
  234. res.Value = val;
  235. res.TypeName = "System.String";
  236. res.Name = "";
  237. res.ValueType = ValueTypes.String;
  238. return res;
  239. }
  240. public static VariableInfo GetException(Exception ex)
  241. {
  242. var res = new VariableInfo();
  243. res.Type = VariableTypes.Error;
  244. res.Value = ex.ToString();
  245. res.TypeName = ex.GetType().FullName;
  246. res.Name = "";
  247. res.ValueType = ValueTypes.String;
  248. return res;
  249. }
  250. }
  251. }