vim_free(isn->isn_arg.ufunc.cuf_name);
break;
+ case ISN_FUNCREF:
+ {
+ dfunc_T *dfunc = ((dfunc_T *)def_functions.ga_data)
+ + isn->isn_arg.funcref.fr_func;
+ func_ptr_unref(dfunc->df_ufunc);
+ }
+ break;
+
case ISN_2BOOL:
case ISN_2STRING:
case ISN_ADDBLOB:
case ISN_EXECCONCAT:
case ISN_EXECUTE:
case ISN_FOR:
- case ISN_FUNCREF:
case ISN_INDEX:
case ISN_JUMP:
case ISN_LOAD:
{
tv = STACK_TV(ectx->ec_frame_idx + STACK_FRAME_SIZE
+ dfunc->df_varcount + idx);
- if (tv->v_type == VAR_PARTIAL && tv->vval.v_partial->pt_refcount > 1)
+ if (tv->v_type == VAR_PARTIAL && tv->vval.v_partial != NULL
+ && tv->vval.v_partial->pt_refcount > 1)
{
- closure_in_use = TRUE;
- break;
+ int refcount = tv->vval.v_partial->pt_refcount;
+ int i;
+
+ // A Reference in a local variables doesn't count, its get
+ // unreferenced on return.
+ for (i = 0; i < dfunc->df_varcount; ++i)
+ {
+ typval_T *stv = STACK_TV(ectx->ec_frame_idx
+ + STACK_FRAME_SIZE + i);
+ if (stv->v_type == VAR_PARTIAL
+ && tv->vval.v_partial == stv->vval.v_partial)
+ --refcount;
+ }
+ if (refcount > 1)
+ {
+ closure_in_use = TRUE;
+ break;
+ }
}
}