mirror of
https://github.com/neovim/neovim.git
synced 2025-09-15 07:48:18 +00:00
eval: Replace internal_refcount hack with proper copyID setting
This commit is contained in:
@@ -5651,6 +5651,14 @@ bool garbage_collect(void)
|
|||||||
ABORTING(set_ref_in_ht)(&fc->l_avars.dv_hashtab, copyID, NULL);
|
ABORTING(set_ref_in_ht)(&fc->l_avars.dv_hashtab, copyID, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Jobs
|
||||||
|
{
|
||||||
|
TerminalJobData *data;
|
||||||
|
map_foreach_value(jobs, data, {
|
||||||
|
ABORTING(set_ref_dict)(data->self, copyID);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// v: vars
|
// v: vars
|
||||||
ABORTING(set_ref_in_ht)(&vimvarht, copyID, NULL);
|
ABORTING(set_ref_in_ht)(&vimvarht, copyID, NULL);
|
||||||
|
|
||||||
@@ -5728,8 +5736,7 @@ static int free_unref_items(int copyID)
|
|||||||
// Go through the list of dicts and free items without the copyID.
|
// Go through the list of dicts and free items without the copyID.
|
||||||
// Don't free dicts that are referenced internally.
|
// Don't free dicts that are referenced internally.
|
||||||
for (dict_T *dd = first_dict; dd != NULL; ) {
|
for (dict_T *dd = first_dict; dd != NULL; ) {
|
||||||
if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)
|
if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)) {
|
||||||
&& !dd->internal_refcount) {
|
|
||||||
// Free the Dictionary and ordinary items it contains, but don't
|
// Free the Dictionary and ordinary items it contains, but don't
|
||||||
// recurse into Lists and Dictionaries, they will be in the list
|
// recurse into Lists and Dictionaries, they will be in the list
|
||||||
// of dicts or list of lists. */
|
// of dicts or list of lists. */
|
||||||
@@ -5970,7 +5977,6 @@ dict_T *dict_alloc(void) FUNC_ATTR_NONNULL_RET
|
|||||||
d->dv_scope = 0;
|
d->dv_scope = 0;
|
||||||
d->dv_refcount = 0;
|
d->dv_refcount = 0;
|
||||||
d->dv_copyID = 0;
|
d->dv_copyID = 0;
|
||||||
d->internal_refcount = 0;
|
|
||||||
QUEUE_INIT(&d->watchers);
|
QUEUE_INIT(&d->watchers);
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
@@ -21620,7 +21626,6 @@ static inline bool common_job_callbacks(dict_T *vopts, ufunc_T **on_stdout,
|
|||||||
if (get_dict_callback(vopts, "on_stdout", on_stdout)
|
if (get_dict_callback(vopts, "on_stdout", on_stdout)
|
||||||
&& get_dict_callback(vopts, "on_stderr", on_stderr)
|
&& get_dict_callback(vopts, "on_stderr", on_stderr)
|
||||||
&& get_dict_callback(vopts, "on_exit", on_exit)) {
|
&& get_dict_callback(vopts, "on_exit", on_exit)) {
|
||||||
vopts->internal_refcount++;
|
|
||||||
vopts->dv_refcount++;
|
vopts->dv_refcount++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -21682,7 +21687,6 @@ static inline void free_term_job_data_event(void **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data->self) {
|
if (data->self) {
|
||||||
data->self->internal_refcount--;
|
|
||||||
dict_unref(data->self);
|
dict_unref(data->self);
|
||||||
}
|
}
|
||||||
queue_free(data->events);
|
queue_free(data->events);
|
||||||
|
@@ -118,8 +118,6 @@ struct dictvar_S {
|
|||||||
dict_T *dv_copydict; /* copied dict used by deepcopy() */
|
dict_T *dv_copydict; /* copied dict used by deepcopy() */
|
||||||
dict_T *dv_used_next; /* next dict in used dicts list */
|
dict_T *dv_used_next; /* next dict in used dicts list */
|
||||||
dict_T *dv_used_prev; /* previous dict in used dicts list */
|
dict_T *dv_used_prev; /* previous dict in used dicts list */
|
||||||
int internal_refcount; // number of internal references to
|
|
||||||
// prevent garbage collection
|
|
||||||
QUEUE watchers; // dictionary key watchers set by user code
|
QUEUE watchers; // dictionary key watchers set by user code
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user