summaryrefslogtreecommitdiff
path: root/src/evalfunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evalfunc.c')
-rw-r--r--src/evalfunc.c67
1 files changed, 65 insertions, 2 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 2f75cbf22..733d45aa5 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -428,6 +428,7 @@ static void f_test_autochdir(typval_T *argvars, typval_T *rettv);
static void f_test_feedinput(typval_T *argvars, typval_T *rettv);
static void f_test_option_not_set(typval_T *argvars, typval_T *rettv);
static void f_test_override(typval_T *argvars, typval_T *rettv);
+static void f_test_refcount(typval_T *argvars, typval_T *rettv);
static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv);
static void f_test_ignore_error(typval_T *argvars, typval_T *rettv);
static void f_test_null_blob(typval_T *argvars, typval_T *rettv);
@@ -952,7 +953,7 @@ static struct fst
{"test_feedinput", 1, 1, f_test_feedinput},
{"test_garbagecollect_now", 0, 0, f_test_garbagecollect_now},
{"test_ignore_error", 1, 1, f_test_ignore_error},
- {"test_null_blob", 0, 0, f_test_null_blob},
+ {"test_null_blob", 0, 0, f_test_null_blob},
#ifdef FEAT_JOB_CHANNEL
{"test_null_channel", 0, 0, f_test_null_channel},
#endif
@@ -964,7 +965,8 @@ static struct fst
{"test_null_partial", 0, 0, f_test_null_partial},
{"test_null_string", 0, 0, f_test_null_string},
{"test_option_not_set", 1, 1, f_test_option_not_set},
- {"test_override", 2, 2, f_test_override},
+ {"test_override", 2, 2, f_test_override},
+ {"test_refcount", 1, 1, f_test_refcount},
#ifdef FEAT_GUI
{"test_scrollbar", 3, 3, f_test_scrollbar},
#endif
@@ -13847,6 +13849,67 @@ f_test_override(typval_T *argvars, typval_T *rettv UNUSED)
}
/*
+ * "test_refcount({expr})" function
+ */
+ static void
+f_test_refcount(typval_T *argvars, typval_T *rettv)
+{
+ int retval = -1;
+
+ switch (argvars[0].v_type)
+ {
+ case VAR_UNKNOWN:
+ case VAR_NUMBER:
+ case VAR_FLOAT:
+ case VAR_SPECIAL:
+ case VAR_STRING:
+ break;
+ case VAR_JOB:
+#ifdef FEAT_JOB_CHANNEL
+ if (argvars[0].vval.v_job != NULL)
+ retval = argvars[0].vval.v_job->jv_refcount - 1;
+#endif
+ break;
+ case VAR_CHANNEL:
+#ifdef FEAT_JOB_CHANNEL
+ if (argvars[0].vval.v_channel != NULL)
+ retval = argvars[0].vval.v_channel->ch_refcount - 1;
+#endif
+ break;
+ case VAR_FUNC:
+ if (argvars[0].vval.v_string != NULL)
+ {
+ ufunc_T *fp;
+
+ fp = find_func(argvars[0].vval.v_string);
+ if (fp != NULL)
+ retval = fp->uf_refcount;
+ }
+ break;
+ case VAR_PARTIAL:
+ if (argvars[0].vval.v_partial != NULL)
+ retval = argvars[0].vval.v_partial->pt_refcount - 1;
+ break;
+ case VAR_BLOB:
+ if (argvars[0].vval.v_blob != NULL)
+ retval = argvars[0].vval.v_blob->bv_refcount - 1;
+ break;
+ case VAR_LIST:
+ if (argvars[0].vval.v_list != NULL)
+ retval = argvars[0].vval.v_list->lv_refcount - 1;
+ break;
+ case VAR_DICT:
+ if (argvars[0].vval.v_dict != NULL)
+ retval = argvars[0].vval.v_dict->dv_refcount - 1;
+ break;
+ }
+
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = retval;
+
+}
+
+/*
* "test_garbagecollect_now()" function
*/
static void