From 5931aeb825425860fcfac9417fe16687632b45fa Mon Sep 17 00:00:00 2001 From: dearblue Date: Thu, 19 Jun 2025 22:35:09 +0900 Subject: [PATCH] `mrb_mt_foreach()` needs to update the pointer at each loop When calling a user function, a pointer retrieved outside of a loop may be invalidated. --- src/class.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class.c b/src/class.c index 2080420fe..fcafe3e71 100644 --- a/src/class.c +++ b/src/class.c @@ -230,9 +230,9 @@ mrb_mt_foreach(mrb_state *mrb, struct RClass *c, mrb_mt_foreach_func *fn, void * mt_tbl *t = c->mt; if (!t || t->size == 0) return; - union mt_ptr *vals = mt_vals(t); - mrb_sym *keys = mt_keys(t); for (int i=0; isize; i++) { + union mt_ptr *vals = mt_vals(t); + mrb_sym *keys = mt_keys(t); mrb_sym key = keys[i]; if (fn(mrb, MT_KEY_SYM(key), create_method_value(mrb, key, vals[i]), p) != 0) { return;