diff options
author | Bram Moolenaar <Bram@vim.org> | 2023-01-05 13:16:04 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-01-05 13:16:04 +0000 |
commit | cf760d50dceb46bd583321c210b88b92360eb959 (patch) | |
tree | 83c8681eebf2582148de2c4e98fc022a4a5b7f0f /src/eval.c | |
parent | 2468add0b88849997e6349e7a0b997be133c022d (diff) |
patch 9.0.1149: class members may be garbage collectedv9.0.1149
Problem: Class members may be garbage collected.
Solution: Mark class members as being in use.
Diffstat (limited to 'src/eval.c')
-rw-r--r-- | src/eval.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c index 9ca805061d..c9d2151dad 100644 --- a/src/eval.c +++ b/src/eval.c @@ -5674,9 +5674,32 @@ set_ref_in_item( } case VAR_CLASS: - // TODO: Mark methods in class_obj_methods ? - // Mark initializer expressions? - break; + { + class_T *cl = tv->vval.v_class; + if (cl != NULL && cl->class_copyID != copyID) + { + cl->class_copyID = copyID; + for (int i = 0; !abort + && i < cl->class_class_member_count; ++i) + abort = abort || set_ref_in_item( + &cl->class_members_tv[i], + copyID, ht_stack, list_stack); + + + for (int i = 0; !abort + && i < cl->class_class_function_count; ++i) + abort = abort || set_ref_in_func(NULL, + cl->class_class_functions[i], copyID); + + for (int i = 0; !abort + && i < cl->class_obj_method_count; ++i) + abort = abort || set_ref_in_func(NULL, + cl->class_obj_methods[i], copyID); + + // Mark initializer expressions? + } + break; + } case VAR_OBJECT: { |