diff --git a/src/post_modules/CritBit/tree_low.c b/src/post_modules/CritBit/tree_low.c index 94f55bf8cab51dfbbec10b3bc8779f26c5b28783..2ff1c092164f72b8f2dbe714054bc482d4bbddb3 100644 --- a/src/post_modules/CritBit/tree_low.c +++ b/src/post_modules/CritBit/tree_low.c @@ -326,6 +326,8 @@ PARENT: } } + } else if (val) { + SET_SVAL(*val, PIKE_T_INT, NUMBER_UNDEFINED, integer, 0); } cb_check_node(tree->root); diff --git a/src/post_modules/CritBit/tree_source.H b/src/post_modules/CritBit/tree_source.H index 734f9941729cfce75c0bf71e4feb675a4b666d37..0441416c541e0ace9cd7de3af5eeae648c23c51c 100644 --- a/src/post_modules/CritBit/tree_source.H +++ b/src/post_modules/CritBit/tree_source.H @@ -77,7 +77,12 @@ cmod_DEFINE_EVAL(COPY_NODE, TREE_CLASSIFY(_copy_node)) oldsize = (THIS->tree.root) ? THIS->tree.root->size : 0; if (oldsize) { - cb_delete(& THIS->tree, k, Pike_sp++); + /* NB: cb_delete() may run pike code (like eg when + * comparing bignums). The stack must thus be + * consistent in case eg a gc() is triggered. + */ + push_undefined(); + cb_delete(& THIS->tree, k, Pike_sp-1); size = (THIS->tree.root) ? THIS->tree.root->size : 0; if (size < oldsize) { THIS->rev++;