luat_luf_cmp.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "luat_base.h"
  2. #include "luat_malloc.h"
  3. #define ldump_c
  4. #define LUA_CORE
  5. #include "lprefix.h"
  6. #include <stddef.h>
  7. #include "lua.h"
  8. #include "lobject.h"
  9. #include "lstate.h"
  10. #include "lundump.h"
  11. #include "lstring.h"
  12. #define LUAT_LOG_TAG "cmp"
  13. #include "luat_log.h"
  14. static void cmpProto(const Proto* p1, const Proto *p2);
  15. static void cmpCode(const Proto* p1, const Proto *p2) {
  16. LLOGD("code %d", memcmp(p1->code, p2->code, sizeof(Instruction)*p1->sizecode));
  17. }
  18. static void cmpConstants(const Proto* p1, const Proto *p2) {
  19. for (size_t i = 0; i < p1->sizek; i++)
  20. {
  21. TValue* o1 = &p1->k[i];
  22. TValue* o2 = &p2->k[i];
  23. if (ttype(o1) != ttype(o2)) {
  24. LLOGD("Constants Not Match %d %d %d", i, ttype(o1), ttype(o2));
  25. continue;
  26. }
  27. switch (p1->k[i].tt_)
  28. {
  29. case LUA_TSHRSTR:
  30. case LUA_TLNGSTR:
  31. if (tsslen(tsvalue(o1)) != tsslen(tsvalue(o2))) {
  32. LLOGE("strlen NOT match %d %d", tsslen(tsvalue(o1)), tsslen(tsvalue(o2)));
  33. }
  34. if (!strcmp(getstr(tsvalue(o1)), getstr(tsvalue(o2)))) {
  35. LLOGE("str value NOT match %s %s", getstr(tsvalue(o1)), getstr(tsvalue(o2)));
  36. }
  37. break;
  38. default:
  39. break;
  40. }
  41. }
  42. }
  43. static void cmpUpvalues(const Proto* p1, const Proto *p2) {
  44. for (size_t i = 0; i < p1->sizeupvalues; i++)
  45. {
  46. Upvaldesc* u1 = &p1->upvalues[i];
  47. Upvaldesc* u2 = &p2->upvalues[i];
  48. if (u1->idx != u2->idx) {
  49. LLOGE("upvalues idx NOT match %d %d", u1->idx, u2->idx);
  50. }
  51. if (u1->instack != u2->instack) {
  52. LLOGE("upvalues instack NOT match %d %d", u1->instack, u2->instack);
  53. }
  54. if (u1->name == NULL || u2->name == NULL) {
  55. LLOGE("upvalues NULL name %d", i);
  56. }
  57. if (strcmp(getstr(u1->name), getstr(u2->name))) {
  58. LLOGE("upvalues name NOT match %s %s", getstr(u1->name), getstr(u2->name));
  59. }
  60. }
  61. }
  62. static void cmpProtos(const Proto* p1, const Proto *p2) {
  63. LLOGD("protos %d", p1->sizep == p2->sizep);
  64. if (p1->sizep == p2->sizep) {
  65. for (size_t i = 0; i < p1->sizep; i++)
  66. {
  67. cmpProto(p1->p[i], p2->p[i]);
  68. }
  69. }
  70. }
  71. static void cmpDebug(const Proto* p1, const Proto *p2) {
  72. LLOGD("linenumbers %d", memcmp(p1->lineinfo, p2->lineinfo, sizeof(int) * p1->sizelineinfo));
  73. for (size_t i = 0; i < p1->sizelineinfo; i++)
  74. {
  75. /* code */
  76. }
  77. }
  78. static void cmpProto(const Proto* p1, const Proto *p2) {
  79. if (p1 == NULL || p2 == NULL) {
  80. LLOGD("p1/p2 is null");
  81. return;
  82. }
  83. if (p1 == p2) {
  84. LLOGD("p1 == p2, in pointer form");
  85. return;
  86. }
  87. LLOGD("source %s %s %d", getstr(p1->source), getstr(p2->source), strcmp(getstr(p1->source), getstr(p2->source)));
  88. // 对比几个属性
  89. LLOGD("linedefined %d %d %d", p1->linedefined, p2->linedefined, p1->linedefined == p2->linedefined);
  90. LLOGD("lastlinedefined %d %d %d", p1->lastlinedefined, p2->lastlinedefined, p1->lastlinedefined == p2->lastlinedefined);
  91. LLOGD("is_vararg %d %d %d", p1->is_vararg, p2->is_vararg, p1->is_vararg == p2->is_vararg);
  92. LLOGD("numparams %d %d %d", p1->numparams, p2->numparams, p1->numparams == p2->numparams);
  93. LLOGD("sizecode %d %d %d", p1->sizecode, p2->sizecode, p1->sizecode == p2->sizecode);
  94. LLOGD("sizek %d %d %d", p1->sizek, p2->sizek, p1->sizek == p2->sizek);
  95. LLOGD("sizelineinfo %d %d %d", p1->sizelineinfo, p2->sizelineinfo, p1->sizelineinfo == p2->sizelineinfo);
  96. LLOGD("sizelocvars %d %d %d", p1->sizelocvars, p2->sizelocvars, p1->sizelocvars == p2->sizelocvars);
  97. LLOGD("sizeupvalues %d %d %d", p1->sizeupvalues, p2->sizeupvalues, p1->sizeupvalues == p2->sizeupvalues);
  98. cmpCode(p1, p2);
  99. cmpConstants(p1, p2);
  100. cmpUpvalues(p1, p2);
  101. cmpProtos(p1, p2);
  102. cmpDebug(p1, p2);
  103. }
  104. void luat_luf_cmp(lua_State *L, const Proto* p1, const Proto *p2) {
  105. if (p1 == NULL || p2 == NULL)
  106. return;
  107. cmpProto(p1, p2);
  108. }