DbgTypeMap.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. #include "DbgTypeMap.h"
  2. #include "DbgModule.h"
  3. USING_NS_BF_DBG;
  4. USING_NS_BF;
  5. //DbgTypeMap::Iterator::Iterator(DbgTypeMap* map)
  6. //{
  7. // mMap = map;
  8. // mCurBucket = 0;
  9. // mCurEntry = NULL;
  10. //}
  11. //
  12. //DbgTypeMap::Iterator& DbgTypeMap::Iterator::operator++()
  13. //{
  14. // if (mCurEntry != NULL)
  15. // {
  16. // mCurEntry = mCurEntry->mNext;
  17. // if (mCurEntry != NULL)
  18. // return *this;
  19. // mCurBucket++;
  20. // }
  21. //
  22. // while (mCurBucket < HashSize)
  23. // {
  24. // mCurEntry = mMap->mHashHeads[mCurBucket];
  25. // while (mCurEntry != NULL)
  26. // {
  27. // if (mCurEntry->mValue != NULL)
  28. // return *this;
  29. // mCurEntry = mCurEntry->mNext;
  30. // }
  31. // mCurBucket++;
  32. // }
  33. //
  34. // return *this; // At end
  35. //}
  36. //
  37. //bool DbgTypeMap::Iterator::operator!=(const DbgTypeMap::Iterator& itr) const
  38. //{
  39. // return ((itr.mCurEntry != mCurEntry) || (itr.mCurBucket != mCurBucket));
  40. //}
  41. //
  42. //DbgTypeMap::Entry* DbgTypeMap::Iterator::operator*()
  43. //{
  44. // return mCurEntry;
  45. //}
  46. //
  47. ////////////////////////////////////////////////////////////////////////////
  48. //
  49. //int DbgTypeMap::GetHash(const char* str, DbgLanguage language)
  50. //{
  51. // int curHash = (int)language;
  52. // const char* curHashPtr = str;
  53. // while (*curHashPtr != 0)
  54. // {
  55. // char c = *curHashPtr;
  56. // if (c == ':')
  57. // {
  58. // if ((curHashPtr[1] == '_') && (curHashPtr[2] == '_') && (curHashPtr[3] == 'l'))
  59. // {
  60. // curHashPtr += 4;
  61. // continue;
  62. // }
  63. // }
  64. // else if ((c != ' ') && (c != '.') && (c != '`') && (c != '\''))
  65. // curHash = ((curHash ^ *curHashPtr) << 5) - curHash;
  66. // curHashPtr++;
  67. // }
  68. //
  69. // return curHash & 0x7FFFFFFF;
  70. //}
  71. //
  72. //bool DbgTypeMap::StrEqual(const char* inStr, const char* mapStr)
  73. //{
  74. // const char* inPtr = inStr;
  75. // const char* mapPtr = mapStr;
  76. //
  77. // while (true)
  78. // {
  79. // char cIn;
  80. // do { cIn = *(inPtr++); } while (cIn == ' ');
  81. // char cMap;
  82. // do { cMap = *(mapPtr++); } while (cMap == ' ');
  83. // if (cIn != cMap)
  84. // {
  85. // if ((cIn == '`') || (cIn == '\''))
  86. // {
  87. // cIn = *(inPtr++);
  88. // if ((cIn >= '0') && (cIn <= '9'))
  89. // {
  90. // if ((cMap == '_') && (mapPtr[0] == '_') && (mapPtr[1] == 'l'))
  91. // {
  92. // mapPtr += 2;
  93. // cMap = *(mapPtr++);
  94. // }
  95. // }
  96. //
  97. // if (cIn == cMap)
  98. // continue;
  99. // }
  100. //
  101. // if ((cIn == '.') && (cMap == ':') && (mapPtr[0] == ':'))
  102. // {
  103. // mapPtr++;
  104. // continue;;
  105. // }
  106. // if ((cMap == '.') && (cIn == ':') && (inPtr[0] == ':'))
  107. // {
  108. // inPtr++;
  109. // continue;;
  110. // }
  111. // return false;
  112. // }
  113. // if (cIn == '\0')
  114. // return true;
  115. // }
  116. //}
  117. //
  118. //DbgTypeMap::DbgTypeMap()
  119. //{
  120. // mHashHeads = NULL;
  121. //}
  122. //
  123. //bool DbgTypeMap::IsEmpty()
  124. //{
  125. // if (mHashHeads == NULL)
  126. // return true;
  127. // return false;
  128. //}
  129. //
  130. //void DbgTypeMap::Clear()
  131. //{
  132. // mHashHeads = NULL;
  133. // mAlloc.Clear();
  134. //}
  135. //
  136. //void DbgTypeMap::Insert(DbgType* value)
  137. //{
  138. // if (mHashHeads == NULL)
  139. // mHashHeads = (Entry**)mAlloc.AllocBytes(sizeof(Entry*) * HashSize, alignof(Entry*));
  140. //
  141. // int hash = GetHash(value->mName, value->mLanguage) % HashSize;
  142. // Entry* headEntry = mHashHeads[hash];
  143. // if ((headEntry != NULL) && (headEntry->mValue == NULL))
  144. // {
  145. // // If we removed an old entry, just take over the node
  146. // headEntry->mValue = value;
  147. // return;
  148. // }
  149. //
  150. // Entry* newEntry = mAlloc.Alloc<Entry>();
  151. // newEntry->mValue = value;
  152. // newEntry->mNext = headEntry;
  153. //
  154. // mHashHeads[hash] = newEntry;
  155. //}
  156. //
  157. //DbgTypeMap::Entry* DbgTypeMap::Find(const char* name, DbgLanguage language)
  158. //{
  159. // if (language == DbgLanguage_BeefUnfixed)
  160. // {
  161. // std::string str = name;
  162. // name = str.c_str();
  163. //
  164. // /*char* nameStart = (char*)name;
  165. // if (strncmp(nameStart, "Box<", 4) == 0)
  166. // {
  167. // for (int i = 0; i < 4; i++)
  168. // nameStart[i] = ' ';
  169. // nameStart[strlen(nameStart) - 1] = '^';
  170. // }*/
  171. //
  172. // for (char* cPtr = (char*)name; true; cPtr++)
  173. // {
  174. // char c = *cPtr;
  175. // if (c == 0)
  176. // break;
  177. //
  178. // if (c == '*')
  179. // {
  180. // char* nameStart = NULL;
  181. //
  182. // // Find our way to the end and remove the star
  183. // int chevCount = 0;
  184. // for (char* cTestPtr = cPtr - 1; cTestPtr >= name; cTestPtr--)
  185. // {
  186. // char c = *cTestPtr;
  187. // if (c == 0)
  188. // break;
  189. // if (c == '<')
  190. // {
  191. // chevCount--;
  192. // if (chevCount < 0)
  193. // {
  194. // nameStart = cTestPtr + 1;
  195. // break;
  196. // }
  197. // }
  198. // else if (c == '>')
  199. // chevCount++;
  200. // else if (chevCount == 0)
  201. // {
  202. // if ((c == '&') || (c == '*'))
  203. // break; // Invalid
  204. //
  205. // if (cTestPtr == name)
  206. // {
  207. // nameStart = cTestPtr;
  208. // break;
  209. // }
  210. //
  211. // if ((c == ' ') || (c == ','))
  212. // {
  213. // nameStart = cTestPtr + 1;
  214. // break;
  215. // }
  216. // }
  217. // }
  218. //
  219. // if (nameStart != NULL)
  220. // {
  221. // if (strncmp(nameStart, "System.Array1", 13) == 0)
  222. // {
  223. // for (int i = 0; i < 14; i++)
  224. // nameStart[i] = ' ';
  225. // cPtr[-1] = '[';
  226. // cPtr[0] = ']';
  227. // }
  228. // else
  229. // {
  230. // *cPtr = 0;
  231. // auto foundEntry = Find(nameStart, DbgLanguage_Beef);
  232. //
  233. // bool isObject = false;
  234. // if (foundEntry != NULL)
  235. // {
  236. // isObject = foundEntry->mValue->IsBfObject();
  237. // }
  238. //
  239. // if (isObject)
  240. // {
  241. // *cPtr = ' ';
  242. // }
  243. // else
  244. // *cPtr = '*';
  245. // }
  246. // }
  247. // nameStart = NULL;
  248. // }
  249. // /*else if ((c == ' ') || (c == '<') || (c == '>') || (c == '&'))
  250. // nameStart = NULL;
  251. // else if (nameStart == NULL)
  252. // nameStart = cPtr;*/
  253. // }
  254. //
  255. // return Find(name, DbgLanguage_Beef);
  256. // }
  257. //
  258. // if (mHashHeads == NULL)
  259. // return NULL;
  260. //
  261. // int hash = GetHash(name, language) % HashSize;
  262. // Entry* checkEntry = mHashHeads[hash];
  263. // while (checkEntry != NULL)
  264. // {
  265. // if ((checkEntry->mValue->mLanguage == language) && (StrEqual(name, checkEntry->mValue->mName)))
  266. // return checkEntry;
  267. // checkEntry = checkEntry->mNext;
  268. // }
  269. // return NULL;
  270. //}
  271. //
  272. //DbgTypeMap::Iterator DbgTypeMap::begin()
  273. //{
  274. // return ++Iterator(this);
  275. //}
  276. //
  277. //DbgTypeMap::Iterator DbgTypeMap::end()
  278. //{
  279. // Iterator itr(this);
  280. // itr.mCurBucket = HashSize;
  281. // return itr;
  282. //}
  283. //
  284. int DbgTypeMap::GetHash(const char* str, DbgLanguage language)
  285. {
  286. int curHash = (int)language;
  287. const char* curHashPtr = str;
  288. while (*curHashPtr != 0)
  289. {
  290. char c = *curHashPtr;
  291. if (c == ':')
  292. {
  293. if ((curHashPtr[1] == '_') && (curHashPtr[2] == '_') && (curHashPtr[3] == 'l'))
  294. {
  295. curHashPtr += 4;
  296. continue;
  297. }
  298. }
  299. else if ((c != ' ') && (c != '.') && (c != '`') && (c != '\''))
  300. curHash = ((curHash ^ *curHashPtr) << 5) - curHash;
  301. curHashPtr++;
  302. }
  303. return curHash & 0x7FFFFFFF;
  304. }
  305. int DbgTypeMap::GetHash(DbgType* dbgType)
  306. {
  307. return GetHash(dbgType->mName, dbgType->mLanguage);
  308. }
  309. bool DbgTypeMap::IsEmpty()
  310. {
  311. return mMap.IsEmpty();
  312. }
  313. void DbgTypeMap::Clear()
  314. {
  315. mMap.Clear();
  316. }
  317. void DbgTypeMap::Insert(DbgType* value)
  318. {
  319. Entry entry;
  320. entry.mValue = value;
  321. mMap.Add(entry);
  322. }
  323. bool DbgTypeMap::StrEqual(const char* inStr, const char* mapStr)
  324. {
  325. const char* inPtr = inStr;
  326. const char* mapPtr = mapStr;
  327. while (true)
  328. {
  329. char cIn;
  330. do { cIn = *(inPtr++); } while (cIn == ' ');
  331. char cMap;
  332. do { cMap = *(mapPtr++); } while (cMap == ' ');
  333. if (cIn != cMap)
  334. {
  335. if ((cIn == '`') || (cIn == '\''))
  336. {
  337. cIn = *(inPtr++);
  338. if ((cIn >= '0') && (cIn <= '9'))
  339. {
  340. if ((cMap == '_') && (mapPtr[0] == '_') && (mapPtr[1] == 'l'))
  341. {
  342. mapPtr += 2;
  343. cMap = *(mapPtr++);
  344. }
  345. }
  346. if (cIn == cMap)
  347. continue;
  348. }
  349. if ((cIn == '.') && (cMap == ':') && (mapPtr[0] == ':'))
  350. {
  351. mapPtr++;
  352. continue;;
  353. }
  354. if ((cMap == '.') && (cIn == ':') && (inPtr[0] == ':'))
  355. {
  356. inPtr++;
  357. continue;;
  358. }
  359. return false;
  360. }
  361. if (cIn == '\0')
  362. return true;
  363. }
  364. }
  365. DbgTypeMap::Entry* DbgTypeMap::Find(const char* name, DbgLanguage language)
  366. {
  367. if (language == DbgLanguage_BeefUnfixed)
  368. {
  369. std::string str = name;
  370. name = str.c_str();
  371. for (char* cPtr = (char*)name; true; cPtr++)
  372. {
  373. char c = *cPtr;
  374. if (c == 0)
  375. break;
  376. if (c == '*')
  377. {
  378. char* nameStart = NULL;
  379. // Find our way to the end and remove the star
  380. int chevCount = 0;
  381. for (char* cTestPtr = cPtr - 1; cTestPtr >= name; cTestPtr--)
  382. {
  383. char c = *cTestPtr;
  384. if (c == 0)
  385. break;
  386. if (c == '<')
  387. {
  388. chevCount--;
  389. if (chevCount < 0)
  390. {
  391. nameStart = cTestPtr + 1;
  392. break;
  393. }
  394. }
  395. else if (c == '>')
  396. chevCount++;
  397. else if (chevCount == 0)
  398. {
  399. if ((c == '&') || (c == '*'))
  400. break; // Invalid
  401. if (cTestPtr == name)
  402. {
  403. nameStart = cTestPtr;
  404. break;
  405. }
  406. if ((c == ' ') || (c == ','))
  407. {
  408. nameStart = cTestPtr + 1;
  409. break;
  410. }
  411. }
  412. }
  413. if (nameStart != NULL)
  414. {
  415. if (strncmp(nameStart, "System.Array1", 13) == 0)
  416. {
  417. for (int i = 0; i < 14; i++)
  418. nameStart[i] = ' ';
  419. cPtr[-1] = '[';
  420. cPtr[0] = ']';
  421. }
  422. else
  423. {
  424. *cPtr = 0;
  425. auto foundEntry = Find(nameStart, DbgLanguage_Beef);
  426. bool isObject = false;
  427. if (foundEntry != NULL)
  428. {
  429. isObject = foundEntry->mValue->IsBfObject();
  430. }
  431. if (isObject)
  432. {
  433. *cPtr = ' ';
  434. }
  435. else
  436. *cPtr = '*';
  437. }
  438. }
  439. nameStart = NULL;
  440. }
  441. /*else if ((c == ' ') || (c == '<') || (c == '>') || (c == '&'))
  442. nameStart = NULL;
  443. else if (nameStart == NULL)
  444. nameStart = cPtr;*/
  445. }
  446. return Find(name, DbgLanguage_Beef);
  447. }
  448. int hashCode = GetHash(name, language) & 0x7FFFFFFF;
  449. for (int i = mMap.mBuckets[hashCode % mMap.mAllocSize]; i >= 0; i = mMap.mEntries[i].mNext)
  450. {
  451. if (mMap.mEntries[i].mHashCode == hashCode)
  452. {
  453. Entry* entry = (Entry*)&mMap.mEntries[i].mKey;
  454. if (StrEqual(name, entry->mValue->mName))
  455. return entry;
  456. }
  457. }
  458. return NULL;
  459. }
  460. Beefy::HashSet<DbgTypeMap::Entry>::iterator DbgTypeMap::begin()
  461. {
  462. return mMap.begin();
  463. }
  464. Beefy::HashSet<DbgTypeMap::Entry>::iterator DbgTypeMap::end()
  465. {
  466. return mMap.end();
  467. }