comparison mercurial/cext/revlog.c @ 40862:54a60968f0aa

rust: look up HgRevlogIndex_GetParents() from symbol table And removes the unused index_get_parents_checked() function. I expect the Index struct will be turned into a pyobject type, though I haven't written any PoC-level patches yet.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 02 Dec 2018 22:20:38 +0900
parents b12700dd261f
children 43974cd44967
comparison
equal deleted inserted replaced
40861:b12700dd261f 40862:54a60968f0aa
2708 indexObject *index; /* Ref kept to avoid GC'ing the index */ 2708 indexObject *index; /* Ref kept to avoid GC'ing the index */
2709 void *iter; /* Rust iterator */ 2709 void *iter; /* Rust iterator */
2710 }; 2710 };
2711 2711
2712 /* FFI exposed from Rust code */ 2712 /* FFI exposed from Rust code */
2713 rustlazyancestorsObject * 2713 rustlazyancestorsObject *rustlazyancestors_init(indexObject *index,
2714 rustlazyancestors_init(indexObject *index, 2714 /* intrevs vector */
2715 /* to pass index_get_parents() */ 2715 Py_ssize_t initrevslen,
2716 int (*)(indexObject *, Py_ssize_t, int *, int), 2716 long *initrevs, long stoprev,
2717 /* intrevs vector */ 2717 int inclusive);
2718 Py_ssize_t initrevslen, long *initrevs, long stoprev,
2719 int inclusive);
2720 void rustlazyancestors_drop(rustlazyancestorsObject *self); 2718 void rustlazyancestors_drop(rustlazyancestorsObject *self);
2721 int rustlazyancestors_next(rustlazyancestorsObject *self); 2719 int rustlazyancestors_next(rustlazyancestorsObject *self);
2722 int rustlazyancestors_contains(rustlazyancestorsObject *self, long rev); 2720 int rustlazyancestors_contains(rustlazyancestorsObject *self, long rev);
2723
2724 static int index_get_parents_checked(indexObject *self, Py_ssize_t rev, int *ps,
2725 int maxrev)
2726 {
2727 if (rev < 0 || rev >= index_length(self)) {
2728 PyErr_SetString(PyExc_ValueError, "rev out of range");
2729 return -1;
2730 }
2731 return index_get_parents(self, rev, ps, maxrev);
2732 }
2733 2721
2734 /* CPython instance methods */ 2722 /* CPython instance methods */
2735 static int rustla_init(rustlazyancestorsObject *self, PyObject *args) 2723 static int rustla_init(rustlazyancestorsObject *self, PyObject *args)
2736 { 2724 {
2737 PyObject *initrevsarg = NULL; 2725 PyObject *initrevsarg = NULL;
2766 initrevs[i] = PyInt_AsLong(PyList_GET_ITEM(initrevsarg, i)); 2754 initrevs[i] = PyInt_AsLong(PyList_GET_ITEM(initrevsarg, i));
2767 } 2755 }
2768 if (PyErr_Occurred()) 2756 if (PyErr_Occurred())
2769 goto bail; 2757 goto bail;
2770 2758
2771 self->iter = rustlazyancestors_init(index, index_get_parents, linit, 2759 self->iter =
2772 initrevs, stoprev, inclusive); 2760 rustlazyancestors_init(index, linit, initrevs, stoprev, inclusive);
2773 if (self->iter == NULL) { 2761 if (self->iter == NULL) {
2774 /* if this is because of GraphError::ParentOutOfRange 2762 /* if this is because of GraphError::ParentOutOfRange
2775 * index_get_parents_checked() has already set the proper 2763 * HgRevlogIndex_GetParents() has already set the proper
2776 * ValueError */ 2764 * exception */
2777 goto bail; 2765 goto bail;
2778 } 2766 }
2779 2767
2780 free(initrevs); 2768 free(initrevs);
2781 return 0; 2769 return 0;