100_extras2.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. '''
  2. ========= src/common/algorithm.c =========
  3. '''
  4. # 该函数的return false没有被覆盖
  5. # bool c11__stable_sort(void* ptr_,
  6. # int length,
  7. # int elem_size,
  8. # int (*f_lt)(const void* a, const void* b, void* extra),
  9. # void* extra) {
  10. # // merge sort
  11. # char *ptr = ptr_, *tmp = PK_MALLOC(length * elem_size);
  12. # for(int seg = 1; seg < length; seg *= 2) {
  13. # for(char* a = ptr; a < ptr + (length - seg) * elem_size; a += 2 * seg * elem_size) {
  14. # char *b = a + seg * elem_size, *a_end = b, *b_end = b + seg * elem_size;
  15. # if(b_end > ptr + length * elem_size) b_end = ptr + length * elem_size;
  16. # bool ok = _stable_sort_merge(a, a_end, b, b_end, tmp, elem_size, f_lt, extra);
  17. # if(!ok) {
  18. # PK_FREE(tmp);
  19. # ----> return false;
  20. # }
  21. # memcpy(a, tmp, b_end - a);
  22. # }
  23. # }
  24. # PK_FREE(tmp);
  25. # return true;
  26. # }
  27. # 调查得知只要触发bool ok = pk_stack_binaryop(vm, __lt__, __gt__)的return false即可
  28. # bool pk_stack_binaryop(VM* self, py_Name op, py_Name rop) {
  29. # // [a, b]
  30. # py_Ref magic = py_tpfindmagic(SECOND()->type, op);
  31. # if(magic) {
  32. # bool ok = py_call(magic, 2, SECOND());
  33. # ----> if(!ok) return false;
  34. # if(self->last_retval.type != tp_NotImplementedType) return true;
  35. # }
  36. # // try reverse operation
  37. # if(rop) {
  38. # // [a, b] -> [b, a]
  39. # py_TValue tmp = *TOP();
  40. # *TOP() = *SECOND();
  41. # *SECOND() = tmp;
  42. # magic = py_tpfindmagic(SECOND()->type, rop);
  43. # if(magic) {
  44. # bool ok = py_call(magic, 2, SECOND());
  45. # ----> if(!ok) return false;
  46. # if(self->last_retval.type != tp_NotImplementedType) return true;
  47. # }
  48. # }
  49. # // eq/ne op never fails
  50. # bool res = py_isidentical(SECOND(), TOP());
  51. # if(op == __eq__) {
  52. # py_newbool(py_retval(), res);
  53. # return true;
  54. # }
  55. # if(op == __ne__) {
  56. # py_newbool(py_retval(), !res);
  57. # return true;
  58. # }
  59. # py_Type lhs_t = rop ? TOP()->type : SECOND()->type;
  60. # py_Type rhs_t = rop ? SECOND()->type : TOP()->type;
  61. # return TypeError("unsupported operand type(s) for '%s': '%t' and '%t'",
  62. # pk_op2str(op),
  63. # lhs_t,
  64. # rhs_t);
  65. # }
  66. #
  67. # 调查得知只要触发bool ok = py_call(py_tpfindmagic(SECOND()->type, __lt__/__gt__), 2, SECOND())的return false即可
  68. # bool py_call(py_Ref f, int argc, py_Ref argv) {
  69. # if(f->type == tp_nativefunc) {
  70. # return py_callcfunc(f->_cfunc, argc, argv);
  71. # } else {
  72. # py_push(f);
  73. # py_pushnil();
  74. # for(int i = 0; i < argc; i++)
  75. # py_push(py_offset(argv, i));
  76. # bool ok = py_vectorcall(argc, 0);
  77. # return ok;
  78. # }
  79. # }
  80. class A():
  81. def __lt__(self, other:int=1):
  82. return True
  83. try:
  84. [A(), 1111].sort()
  85. except TypeError:
  86. pass