diff --git a/src/array.c b/src/array.c
index b809ee7d284b9c591ca6f6d525ceff5dbfc0fc11..2bd6c2f4db324c51402d54f56a9237f0d0f9f48c 100644
--- a/src/array.c
+++ b/src/array.c
@@ -2795,7 +2795,7 @@ void check_all_arrays(void)
 #endif /* PIKE_DEBUG */
 
 
-PMOD_EXPORT void visit_array (struct array *a, int action)
+PMOD_EXPORT void visit_array (struct array *a, int action, void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
diff --git a/src/array.h b/src/array.h
index 090757a039302a4bb3b6b703f42610950af76d0e..b296628af70bb1e4974ae77a423af8826f84b622 100644
--- a/src/array.h
+++ b/src/array.h
@@ -199,7 +199,7 @@ void array_replace(struct array *a,
 PMOD_EXPORT void check_array(struct array *a);
 void check_all_arrays(void);
 #endif
-PMOD_EXPORT void visit_array (struct array *a, int action);
+PMOD_EXPORT void visit_array (struct array *a, int action, void *extra);
 void gc_mark_array_as_referenced(struct array *a);
 void real_gc_cycle_check_array(struct array *a, int weak);
 unsigned gc_touch_all_arrays(void);
diff --git a/src/gc.c b/src/gc.c
index e9db3382f2113d27174b04a3aa13b6188eda9af6..79531037032f1bb2d36b626e0f67823964cac620 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -4412,16 +4412,16 @@ PMOD_EXPORT visit_thing_fn *const visit_fn_from_type[MAX_TYPE + 1] = {
   (visit_thing_fn *) (ptrdiff_t) -1,
   (visit_thing_fn *) (ptrdiff_t) -1,
   (visit_thing_fn *) (ptrdiff_t) -1,
-  (visit_thing_fn *) &visit_array,
-  (visit_thing_fn *) &visit_mapping,
-  (visit_thing_fn *) &visit_multiset,
-  (visit_thing_fn *) &visit_object,
+  &visit_array,
+  &visit_mapping,
+  &visit_multiset,
+  &visit_object,
   /* visit_function must be called with a whole svalue, so it's not
    * included here. */
   (visit_thing_fn *) (ptrdiff_t) -1,
-  (visit_thing_fn *) &visit_program,
-  (visit_thing_fn *) &visit_string,
-  (visit_thing_fn *) &visit_type,
+  &visit_program,
+  &visit_string,
+  &visit_type,
 };
 
 PMOD_EXPORT TYPE_T type_from_visit_fn (visit_thing_fn *fn)
diff --git a/src/mapping.c b/src/mapping.c
index 2b9e3e5167793e0e688ad5107aeb204c94aee48e..1a5c7a790d64e66cdec34777b7a79ce20a5738bb 100644
--- a/src/mapping.c
+++ b/src/mapping.c
@@ -2470,7 +2470,7 @@ void check_all_mappings(void)
 #endif
 
 static void visit_mapping_data (struct mapping_data *md, int action,
-				struct mapping *UNUSED(m))
+				void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
@@ -2500,7 +2500,7 @@ static void visit_mapping_data (struct mapping_data *md, int action,
   }
 }
 
-PMOD_EXPORT void visit_mapping (struct mapping *m, int action)
+PMOD_EXPORT void visit_mapping (struct mapping *m, int action, void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
@@ -2516,7 +2516,7 @@ PMOD_EXPORT void visit_mapping (struct mapping *m, int action)
   }
 
   visit_ref (m->data, REF_TYPE_INTERNAL,
-	     (visit_thing_fn *) &visit_mapping_data, m);
+	     (visit_thing_fn *) &visit_mapping_data, extra);
 }
 
 #ifdef MAPPING_SIZE_DEBUG
diff --git a/src/mapping.h b/src/mapping.h
index cdd15dc40267840063437eb8161091b7131c265c..b1574de7254e3839f26307dba29485ae0a7768d4 100644
--- a/src/mapping.h
+++ b/src/mapping.h
@@ -375,7 +375,7 @@ PMOD_EXPORT INT32 mapping_generation(struct mapping *m);
 void check_mapping(const struct mapping *m);
 void check_all_mappings(void);
 #endif
-PMOD_EXPORT void visit_mapping (struct mapping *m, int action);
+PMOD_EXPORT void visit_mapping (struct mapping *m, int action, void *extra);
 void gc_mark_mapping_as_referenced(struct mapping *m);
 void real_gc_cycle_check_mapping(struct mapping *m, int weak);
 unsigned gc_touch_all_mappings(void);
diff --git a/src/multiset.c b/src/multiset.c
index 9f1008e41cde62cd916c877f769756579f8e9161..8520d8df8cc720450e9601288eec41387da5a45a 100644
--- a/src/multiset.c
+++ b/src/multiset.c
@@ -3483,7 +3483,7 @@ PMOD_EXPORT ptrdiff_t multiset_get_nth (struct multiset *l, size_t n)
 #define GC_MSD_GOT_NODE_REFS GC_USER_3
 
 static void visit_multiset_data (struct multiset_data *msd, int action,
-				 struct multiset *UNUSED(l))
+				 void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
@@ -3524,7 +3524,7 @@ static void visit_multiset_data (struct multiset_data *msd, int action,
   }
 }
 
-PMOD_EXPORT void visit_multiset (struct multiset *l, int action)
+PMOD_EXPORT void visit_multiset (struct multiset *l, int action, void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
@@ -3540,7 +3540,7 @@ PMOD_EXPORT void visit_multiset (struct multiset *l, int action)
   }
 
   visit_ref (l->msd, REF_TYPE_INTERNAL,
-	     (visit_thing_fn *) &visit_multiset_data, l);
+	     (visit_thing_fn *) &visit_multiset_data, extra);
 }
 
 unsigned gc_touch_all_multisets (void)
diff --git a/src/multiset.h b/src/multiset.h
index 06c84270d0c0db14e84b7f3ccc7a5d0f2f107f67..8bc79635704b380a89872bc67ee24651c6c8e221 100644
--- a/src/multiset.h
+++ b/src/multiset.h
@@ -402,7 +402,7 @@ struct multiset *copy_multiset_recursively (struct multiset *l,
 					    struct mapping *p);
 PMOD_EXPORT ptrdiff_t multiset_get_nth (struct multiset *l, size_t n);
 
-PMOD_EXPORT void visit_multiset (struct multiset *l, int action);
+PMOD_EXPORT void visit_multiset (struct multiset *l, int action, void *extra);
 unsigned gc_touch_all_multisets (void);
 void gc_check_all_multisets (void);
 void gc_mark_multiset_as_referenced (struct multiset *l);
diff --git a/src/object.c b/src/object.c
index 667d21de507a0fdac1463a41c0e4735ba6dd0adc..5f6b6f5477ff4a98eae39223792e7f008eb142b6 100644
--- a/src/object.c
+++ b/src/object.c
@@ -2083,7 +2083,7 @@ PMOD_EXPORT struct array *object_types(struct object *o, int inherit_number)
 }
 
 
-PMOD_EXPORT void visit_object (struct object *o, int action)
+PMOD_EXPORT void visit_object (struct object *o, int action, void *extra)
 {
   struct program *p = o->prog;
 
diff --git a/src/object.h b/src/object.h
index d75d636bd9449f500506171ec46be3f79576564e..0498e02b881b0e56d993c93650945ba294f1b7e9 100644
--- a/src/object.h
+++ b/src/object.h
@@ -133,7 +133,7 @@ PMOD_EXPORT int object_equal_p(struct object *a, struct object *b, struct proces
 PMOD_EXPORT struct array *object_indices(struct object *o, int inherit_level);
 PMOD_EXPORT struct array *object_values(struct object *o, int inherit_level);
 PMOD_EXPORT struct array *object_types(struct object *o, int inherit_level);
-PMOD_EXPORT void visit_object (struct object *o, int action);
+PMOD_EXPORT void visit_object (struct object *o, int action, void *extra);
 PMOD_EXPORT void visit_function (const struct svalue *s, int ref_type);
 PMOD_EXPORT void gc_mark_object_as_referenced(struct object *o);
 PMOD_EXPORT void real_gc_cycle_check_object(struct object *o, int weak);
diff --git a/src/pike_types.c b/src/pike_types.c
index 86ce2b3fca093c212e23b1183da449183d6fca98..d881417608e6ee666e724f58e3aa982393e40d42 100644
--- a/src/pike_types.c
+++ b/src/pike_types.c
@@ -8911,7 +8911,7 @@ PMOD_EXPORT void *find_type(struct pike_type *t,
   return NULL;
 }
 
-PMOD_EXPORT void visit_type (struct pike_type *t, int action)
+PMOD_EXPORT void visit_type (struct pike_type *t, int action, void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
diff --git a/src/pike_types.h b/src/pike_types.h
index b9b6e9fd93d8c12c1cc01b6ac93df6fd9612f0e7..43af1c9c23567ba84258bb55a3305fb24e4d0d22 100644
--- a/src/pike_types.h
+++ b/src/pike_types.h
@@ -294,7 +294,7 @@ void cleanup_pike_types(void);
 void cleanup_pike_type_table(void);
 PMOD_EXPORT void *find_type(struct pike_type *t,
 			    void *(*cb)(struct pike_type *));
-PMOD_EXPORT void visit_type (struct pike_type *t, int action);
+PMOD_EXPORT void visit_type (struct pike_type *t, int action, void *extra);
 void gc_mark_type_as_referenced(struct pike_type *t);
 void gc_check_type (struct pike_type *t);
 void gc_check_all_types (void);
diff --git a/src/program.c b/src/program.c
index f1c7cf9d1c24220e636c3437c922e0ce0b0ca865..3c2c25b948b1241d9658e38bb5f931a0bd9d456f 100644
--- a/src/program.c
+++ b/src/program.c
@@ -11027,7 +11027,7 @@ void cleanup_program(void)
 }
 
 
-PMOD_EXPORT void visit_program (struct program *p, int action)
+PMOD_EXPORT void visit_program (struct program *p, int action, void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
diff --git a/src/program.h b/src/program.h
index d6984479e80a789138282d248b4a4c2d5f24a44e..d8bd48bab7196e7319a6685e29eee5f6bb4a3d57 100644
--- a/src/program.h
+++ b/src/program.h
@@ -1029,7 +1029,7 @@ void check_all_programs(void);
 void placeholder_index(INT32 args);
 void init_program(void);
 void cleanup_program(void);
-PMOD_EXPORT void visit_program (struct program *p, int action);
+PMOD_EXPORT void visit_program (struct program *p, int action, void *extra);
 void gc_mark_program_as_referenced(struct program *p);
 void real_gc_cycle_check_program(struct program *p, int weak);
 unsigned gc_touch_all_programs(void);
diff --git a/src/stralloc.c b/src/stralloc.c
index 6679a8c7159a618cf124eb7a6f78ea8f3d4913af..f6f28de660d205f596a2190db5dbceb68d262c94 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -2271,7 +2271,7 @@ void count_memory_in_strings(size_t *num, size_t *size)
   size[0]=size_;
 }
 
-PMOD_EXPORT void visit_string (struct pike_string *s, int action)
+PMOD_EXPORT void visit_string (struct pike_string *s, int action, void *extra)
 {
   switch (action) {
 #ifdef PIKE_DEBUG
diff --git a/src/stralloc.h b/src/stralloc.h
index fa2e000ed17a08e7462dee33253530b2b53fb164..0c728b6b0b73c63239d585d1814a67ff1c9ff92f 100644
--- a/src/stralloc.h
+++ b/src/stralloc.h
@@ -377,7 +377,7 @@ void init_shared_string_table(void);
 void cleanup_shared_string_table(void);
 void count_memory_in_short_pike_strings(size_t *num, size_t *size);
 void count_memory_in_strings(size_t *num, size_t *size);
-PMOD_EXPORT void visit_string (struct pike_string *s, int action);
+PMOD_EXPORT void visit_string (struct pike_string *s, int action, void *extra);
 void gc_mark_string_as_referenced (struct pike_string *s);
 unsigned gc_touch_all_strings(void);
 void gc_mark_all_strings(void);