# HG changeset patch # User Martin von Zweigbergk # Date 1531980428 25200 # Node ID 53bc73fae1a39b29d4203e021537e8708368f1f7 # Parent dcd395dc98d85e0a7d32b2da18566b9ae2a3ed76 index: add pointer from nodetree back to index This is always a cycle right now, but it will not be for the nodetree instances I'm planning to add later (see earlier patch). Differential Revision: https://phab.mercurial-scm.org/D4112 diff -r dcd395dc98d8 -r 53bc73fae1a3 mercurial/cext/revlog.c --- a/mercurial/cext/revlog.c Mon Aug 06 09:59:51 2018 -0700 +++ b/mercurial/cext/revlog.c Wed Jul 18 23:07:08 2018 -0700 @@ -28,6 +28,8 @@ #define PyInt_AsLong PyLong_AsLong #endif +typedef struct indexObjectStruct indexObject; + typedef struct { int children[16]; } nodetreenode; @@ -40,6 +42,7 @@ * Zero is empty */ typedef struct { + indexObject *index; nodetreenode *nodes; unsigned length; /* # nodes in use */ unsigned capacity; /* # nodes allocated */ @@ -59,7 +62,7 @@ * With string keys, we lazily perform a reverse mapping from node to * rev, using a base-16 trie. */ -typedef struct { +struct indexObjectStruct { PyObject_HEAD /* Type-specific fields go here. */ PyObject *data; /* raw bytes of index */ @@ -76,7 +79,7 @@ int ntlookups; /* # lookups */ int ntmisses; /* # lookups that miss the cache */ int inlined; -} indexObject; +}; static Py_ssize_t index_length(const indexObject *self) { @@ -1120,6 +1123,7 @@ self->nt->depth = 0; self->nt->splits = 0; self->nt->length = 1; + self->nt->index = self; if (nt_insert(self, nullid, -1) == -1) { free(self->nt->nodes); PyMem_Free(self->nt);