Mercurial > vim
comparison src/eval.c @ 31633:d19377e0a0b4 v9.0.1149
patch 9.0.1149: class members may be garbage collected
Commit: https://github.com/vim/vim/commit/cf760d50dceb46bd583321c210b88b92360eb959
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Jan 5 13:16:04 2023 +0000
patch 9.0.1149: class members may be garbage collected
Problem: Class members may be garbage collected.
Solution: Mark class members as being in use.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 05 Jan 2023 14:30:04 +0100 |
parents | f5bb69a83d8e |
children | 62237ea155d9 |
comparison
equal
deleted
inserted
replaced
31632:874f82a0817c | 31633:d19377e0a0b4 |
---|---|
5672 #endif | 5672 #endif |
5673 break; | 5673 break; |
5674 } | 5674 } |
5675 | 5675 |
5676 case VAR_CLASS: | 5676 case VAR_CLASS: |
5677 // TODO: Mark methods in class_obj_methods ? | 5677 { |
5678 // Mark initializer expressions? | 5678 class_T *cl = tv->vval.v_class; |
5679 break; | 5679 if (cl != NULL && cl->class_copyID != copyID) |
5680 { | |
5681 cl->class_copyID = copyID; | |
5682 for (int i = 0; !abort | |
5683 && i < cl->class_class_member_count; ++i) | |
5684 abort = abort || set_ref_in_item( | |
5685 &cl->class_members_tv[i], | |
5686 copyID, ht_stack, list_stack); | |
5687 | |
5688 | |
5689 for (int i = 0; !abort | |
5690 && i < cl->class_class_function_count; ++i) | |
5691 abort = abort || set_ref_in_func(NULL, | |
5692 cl->class_class_functions[i], copyID); | |
5693 | |
5694 for (int i = 0; !abort | |
5695 && i < cl->class_obj_method_count; ++i) | |
5696 abort = abort || set_ref_in_func(NULL, | |
5697 cl->class_obj_methods[i], copyID); | |
5698 | |
5699 // Mark initializer expressions? | |
5700 } | |
5701 break; | |
5702 } | |
5680 | 5703 |
5681 case VAR_OBJECT: | 5704 case VAR_OBJECT: |
5682 { | 5705 { |
5683 object_T *obj = tv->vval.v_object; | 5706 object_T *obj = tv->vval.v_object; |
5684 if (obj != NULL && obj->obj_copyID != copyID) | 5707 if (obj != NULL && obj->obj_copyID != copyID) |