Show More
@@ -553,8 +553,10 b' static inline int nt_level(const char *n' | |||||
553 | * -2: not found |
|
553 | * -2: not found | |
554 | * rest: valid rev |
|
554 | * rest: valid rev | |
555 | */ |
|
555 | */ | |
556 |
static int nt_find(indexObject *self, const char *node, Py_ssize_t nodelen |
|
556 | static int nt_find(indexObject *self, const char *node, Py_ssize_t nodelen, | |
|
557 | int hex) | |||
557 | { |
|
558 | { | |
|
559 | int (*getnybble)(const char *, Py_ssize_t) = hex ? hexdigit : nt_level; | |||
558 | int level, maxlevel, off; |
|
560 | int level, maxlevel, off; | |
559 |
|
561 | |||
560 | if (nodelen == 20 && node[0] == '\0' && memcmp(node, nullid, 20) == 0) |
|
562 | if (nodelen == 20 && node[0] == '\0' && memcmp(node, nullid, 20) == 0) | |
@@ -563,21 +565,28 b' static int nt_find(indexObject *self, co' | |||||
563 | if (self->nt == NULL) |
|
565 | if (self->nt == NULL) | |
564 | return -2; |
|
566 | return -2; | |
565 |
|
567 | |||
566 | maxlevel = nodelen > 20 ? 40 : ((int)nodelen * 2); |
|
568 | if (hex) | |
|
569 | maxlevel = nodelen > 40 ? 40 : nodelen; | |||
|
570 | else | |||
|
571 | maxlevel = nodelen > 20 ? 40 : ((int)nodelen * 2); | |||
567 |
|
572 | |||
568 | for (level = off = 0; level < maxlevel; level++) { |
|
573 | for (level = off = 0; level < maxlevel; level++) { | |
569 |
int k = |
|
574 | int k = getnybble(node, level); | |
570 | nodetree *n = &self->nt[off]; |
|
575 | nodetree *n = &self->nt[off]; | |
571 | int v = n->children[k]; |
|
576 | int v = n->children[k]; | |
572 |
|
577 | |||
573 | if (v < 0) { |
|
578 | if (v < 0) { | |
574 | const char *n; |
|
579 | const char *n; | |
|
580 | Py_ssize_t i; | |||
|
581 | ||||
575 | v = -v - 1; |
|
582 | v = -v - 1; | |
576 | n = index_node(self, v); |
|
583 | n = index_node(self, v); | |
577 | if (n == NULL) |
|
584 | if (n == NULL) | |
578 | return -2; |
|
585 | return -2; | |
579 | return memcmp(node, n, nodelen > 20 ? 20 : nodelen) |
|
586 | for (i = level; i < maxlevel; i++) | |
580 | ? -2 : v; |
|
587 | if (getnybble(node, i) != nt_level(n, i)) | |
|
588 | return -2; | |||
|
589 | return v; | |||
581 | } |
|
590 | } | |
582 | if (v == 0) |
|
591 | if (v == 0) | |
583 | return -2; |
|
592 | return -2; | |
@@ -679,7 +688,7 b' static int index_find_node(indexObject *' | |||||
679 | int rev; |
|
688 | int rev; | |
680 |
|
689 | |||
681 | self->ntlookups++; |
|
690 | self->ntlookups++; | |
682 | rev = nt_find(self, node, nodelen); |
|
691 | rev = nt_find(self, node, nodelen, 0); | |
683 | if (rev >= -1) |
|
692 | if (rev >= -1) | |
684 | return rev; |
|
693 | return rev; | |
685 |
|
694 |
General Comments 0
You need to be logged in to leave comments.
Login now